]> asedeno.scripts.mit.edu Git - 1ts-debian.git/blob - zephyr/lib/ZVariables.c
ccc68237b0a764ceabcc4b165c63f6901409bb4e
[1ts-debian.git] / zephyr / lib / ZVariables.c
1 /* This file is part of the Project Athena Zephyr Notification System.
2  * It contains source for the ZGetVariable, ZSetVariable, and ZUnsetVariable
3  * functions.
4  *
5  *      Created by:     Robert French
6  *
7  *      $Id: ZVariables.c,v 1.17 1999/06/03 14:51:42 danw Exp $
8  *
9  *      Copyright (c) 1987 by the Massachusetts Institute of Technology.
10  *      For copying and distribution information, see the file
11  *      "mit-copyright.h". 
12  */
13
14 #ifndef lint
15 static char rcsid_ZVariables_c[] = "$Id: ZVariables.c,v 1.17 1999/06/03 14:51:42 danw Exp $";
16 #endif
17
18 #include <internal.h>
19
20 #include <ctype.h>
21 #include <pwd.h>
22
23 static int get_localvarfile __P((char *bfr));
24 static char *get_varval __P((char *fn, char *val));
25 static int varline __P((char *bfr, char *var));
26
27 char *ZGetVariable(var)
28     char *var;
29 {
30     char varfile[128], *ret;
31     char *get_varval();
32
33     if (get_localvarfile(varfile))
34         return ((char *)0);
35
36     if ((ret = get_varval(varfile, var)) != ZERR_NONE)
37         return (ret);
38
39     sprintf(varfile, "%s/zephyr.vars", SYSCONFDIR);
40     return (get_varval(varfile, var));
41 }
42
43 Code_t ZSetVariable(var, value)
44     char *var;
45     char *value;
46 {
47     int written;
48     FILE *fpin, *fpout;
49     char varfile[128], varfilebackup[128], varbfr[512];
50
51     written = 0;
52         
53     if (get_localvarfile(varfile))
54         return (ZERR_INTERNAL);
55
56     (void) strcpy(varfilebackup, varfile);
57     (void) strcat(varfilebackup, ".backup");
58         
59     if (!(fpout = fopen(varfilebackup, "w")))
60         return (errno);
61     if ((fpin = fopen(varfile, "r")) != NULL) {
62         while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
63             if (varbfr[strlen(varbfr)-1] < ' ')
64                 varbfr[strlen(varbfr)-1] = '\0';
65             if (varline(varbfr, var)) {
66                 fprintf(fpout, "%s = %s\n", var, value);
67                 written = 1;
68             }
69             else
70                 fprintf(fpout, "%s\n", varbfr);
71         }
72         (void) fclose(fpin);            /* don't care about errs on input */
73     } 
74     if (!written)
75         fprintf(fpout, "%s = %s\n", var, value);
76     if (fclose(fpout) == EOF)
77             return(EIO);                /* can't rely on errno */
78     if (rename(varfilebackup, varfile))
79         return (errno);
80     return (ZERR_NONE);
81 }       
82
83 Code_t ZUnsetVariable(var)
84     char *var;
85 {
86     FILE *fpin, *fpout;
87     char varfile[128], varfilebackup[128], varbfr[512];
88
89     if (get_localvarfile(varfile))
90         return (ZERR_INTERNAL);
91
92     (void) strcpy(varfilebackup, varfile);
93     (void) strcat(varfilebackup, ".backup");
94         
95     if (!(fpout = fopen(varfilebackup, "w")))
96         return (errno);
97     if ((fpin = fopen(varfile, "r")) != NULL) {
98         while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
99             if (varbfr[strlen(varbfr)-1] < ' ')
100                 varbfr[strlen(varbfr)-1] = '\0';
101             if (!varline(varbfr, var))
102                 fprintf(fpout, "%s\n", varbfr);
103         }
104         (void) fclose(fpin);            /* don't care about read close errs */
105     } 
106     if (fclose(fpout) == EOF)
107             return(EIO);                /* errno isn't reliable */
108     if (rename(varfilebackup, varfile))
109         return (errno);
110     return (ZERR_NONE);
111 }       
112
113 static int get_localvarfile(bfr)
114     char *bfr;
115 {
116     char *envptr;
117     struct passwd *pwd;
118
119     envptr = getenv("ZEPHYR_VARS");
120     if (envptr)
121         (void) strcpy(bfr, envptr);
122     else {
123         envptr = getenv("HOME");
124         if (envptr)
125             (void) strcpy(bfr, envptr);
126         else {
127             if (!(pwd = getpwuid((int) getuid()))) {
128                 fprintf(stderr, "Zephyr internal failure: Can't determine your home directory.\n");
129                 return (1);
130             }
131             (void) strcpy(bfr, pwd->pw_dir);
132         }
133
134         (void) strcat(bfr, "/");
135         (void) strcat(bfr, ".zephyr.vars");
136     }
137     return (0);
138
139         
140 static char *get_varval(fn, var)
141     char *fn;
142     char *var;
143 {
144     FILE *fp;
145     static char varbfr[512];
146     int i;
147         
148     fp = fopen(fn, "r");
149     if (!fp)
150         return ((char *)0);
151
152     while (fgets(varbfr, sizeof varbfr, fp) != (char *) 0) {
153         if (varbfr[strlen(varbfr)-1] < ' ')
154             varbfr[strlen(varbfr)-1] = '\0';
155         if (!(i = varline(varbfr, var)))
156             continue;
157         (void) fclose(fp);              /* open read-only, don't care */
158         return (varbfr+i);
159     }
160     (void) fclose(fp);                  /* open read-only, don't care */
161     return ((char *)0);
162 }
163
164 /* If the variable in the line bfr[] is the same as var, return index to
165    the variable value, else return 0. */
166 static int varline(bfr, var)
167     char *bfr;
168     char *var;
169 {
170     register char *cp;
171         
172
173     if (!bfr[0] || bfr[0] == '#')       /* comment or null line */
174         return (0);
175         
176     cp = bfr;
177     while (*cp && !isspace(*cp) && (*cp != '='))
178         cp++;
179
180 #define max(a,b) ((a > b) ? (a) : (b))
181
182     if (strncasecmp(bfr, var, max(strlen(var),cp - bfr)))
183         return(0);                      /* var is not the var in
184                                            bfr ==> no match */
185
186     cp = strchr(bfr, '=');
187     if (!cp)
188         return(0);
189     cp++;
190     while (*cp && isspace(*cp))         /* space up to variable value */
191         cp++;
192
193     return (cp - bfr);                  /* return index */
194 }