/[dynamips]/trunk/rommon_var.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/rommon_var.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (hide annotations)
Sat Oct 6 16:33:40 2007 UTC (16 years, 6 months ago) by dpavlin
Original Path: upstream/dynamips-0.2.8-RC1/rommon_var.c
File MIME type: text/plain
File size: 3404 byte(s)
dynamips-0.2.8-RC1

1 dpavlin 11 /*
2     * Cisco router simulation platform.
3     * Copyright (c) 2007 Christophe Fillot (cf@utc.fr)
4     *
5     * ROMMON Environment Variables.
6     */
7     #include <stdio.h>
8     #include <stdlib.h>
9     #include <string.h>
10     #include <unistd.h>
11     #include <errno.h>
12    
13     #include "utils.h"
14     #include "rommon_var.h"
15    
16     /* Load file containing ROMMON variables */
17     int rommon_load_file(struct rommon_var_list *rvl)
18     {
19     char buffer[512];
20     FILE *fd;
21    
22     if (!rvl->filename)
23     return(-1);
24    
25     if (!(fd = fopen(rvl->filename,"r"))) {
26     fprintf(stderr,"%s: unable to create file %s (%s)\n",
27     __func__,rvl->filename,strerror(errno));
28     return(-1);
29     }
30    
31     while(!feof(fd)) {
32     if (m_fgets(buffer,sizeof(buffer),fd))
33     rommon_var_add_str(rvl,buffer);
34     }
35    
36     fclose(fd);
37     return(0);
38     }
39    
40     /* Write a file with all ROMMON variables */
41     int rommon_var_update_file(struct rommon_var_list *rvl)
42     {
43     struct rommon_var *var;
44     FILE *fd;
45    
46     if (!rvl->filename)
47     return(-1);
48    
49     if (!(fd = fopen(rvl->filename,"w"))) {
50     fprintf(stderr,"%s: unable to create file %s (%s)\n",
51     __func__,rvl->filename,strerror(errno));
52     return(-1);
53     }
54    
55     for(var=rvl->var_list;var;var=var->next)
56     fprintf(fd,"%s=%s\n",var->name,var->value ? var->value : "");
57    
58     fclose(fd);
59     return(0);
60     }
61    
62     /* Find the specified variable */
63     struct rommon_var *rommon_var_find(struct rommon_var_list *rvl,char *name)
64     {
65     struct rommon_var *var;
66    
67     for(var=rvl->var_list;var;var=var->next)
68     if (!strcmp(var->name,name))
69     return var;
70    
71     return NULL;
72     }
73    
74     /* Create a new variable */
75     static struct rommon_var *rommon_var_create(char *name)
76     {
77     struct rommon_var *var;
78    
79     if (!(var = malloc(sizeof(*var))))
80     return NULL;
81    
82     var->next = NULL;
83     var->value = NULL;
84     var->name = strdup(name);
85    
86     if (!var->name) {
87     free(var);
88     return NULL;
89     }
90    
91     return var;
92     }
93    
94     /* Set value for a variable */
95     static int rommon_var_set(struct rommon_var *var,char *value)
96     {
97     char *new_value;
98    
99     if (!(new_value = strdup(value)))
100     return(-1);
101    
102     /* free old value */
103     if (var->value)
104     free(var->value);
105    
106     var->value = new_value;
107     return(0);
108     }
109    
110     /* Add a new variable */
111     int rommon_var_add(struct rommon_var_list *rvl,char *name,char *value)
112     {
113     struct rommon_var *var;
114    
115     /* if the variable already exists, overwrite it */
116     if (!(var = rommon_var_find(rvl,name))) {
117     var = rommon_var_create(name);
118     if (!var) return(-1);
119    
120     if (rommon_var_set(var,value) == -1)
121     return(-1);
122    
123     var->next = rvl->var_list;
124     rvl->var_list = var;
125     } else {
126     rommon_var_set(var,value);
127     }
128    
129     /* synchronize disk file */
130     return(rommon_var_update_file(rvl));
131     }
132    
133     /*
134     * Add a new variable, specified at the format: var=value.
135     * The string is modified.
136     */
137     int rommon_var_add_str(struct rommon_var_list *rvl,char *str)
138     {
139     char *eq_sym;
140    
141     if (!(eq_sym = strchr(str,'=')))
142     return(-1);
143    
144     /* The variable cannot be null */
145     if (str == eq_sym)
146     return(-1);
147    
148     *eq_sym = 0;
149     return(rommon_var_add(rvl,str,eq_sym+1));
150     }
151    
152     /* Get the specified variable */
153     int rommon_var_get(struct rommon_var_list *rvl,char *name,
154     char *buffer,size_t len)
155     {
156     struct rommon_var *var;
157    
158     if (!(var = rommon_var_find(rvl,name)) || !var->value)
159     return(-1);
160    
161     strncpy(buffer,var->value,len-1);
162     buffer[len-1] = '\0';
163     return(0);
164     }

  ViewVC Help
Powered by ViewVC 1.1.26