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