libpurple/protocols/zephyr/ZVariables.c

branch
release-2.x.y
changeset 43264
50facee54d1d
parent 43263
b9cf92c8b16b
equal deleted inserted replaced
43263:b9cf92c8b16b 43264:50facee54d1d
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 * Copyright (c) 1987 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, see the file
9 * "mit-copyright.h".
10 */
11
12 #include "libpurple/internal.h"
13 #include "internal.h"
14 #include "util.h"
15
16 #include <ctype.h>
17 #ifndef WIN32
18 #include <pwd.h>
19 #endif
20
21 static char *get_localvarfile __P((void));
22 static char *get_varval __P((char *fn, char *val));
23 static int varline __P((char *bfr, char *var));
24
25 char *ZGetVariable(var)
26 char *var;
27 {
28 char *varfile, *ret;
29
30 if ((varfile = get_localvarfile()) == NULL)
31 return ((char *)0);
32
33 ret = get_varval(varfile, var);
34 g_free(varfile);
35 if (ret != ZERR_NONE)
36 return ret;
37
38 #ifdef WIN32
39 varfile = g_strdup("C:\\zephyr\\zephyr.var");
40 #else
41 varfile = g_strdup_printf("%s/zephyr.vars", CONFDIR);
42 #endif
43 ret = get_varval(varfile, var);
44 g_free(varfile);
45
46 return ret;
47 }
48
49 Code_t
50 ZSetVariable(char *var, char *value)
51 {
52 int written;
53 FILE *fpin, *fpout;
54 char *varfile, *varfilebackup, varbfr[512];
55
56 written = 0;
57
58 if ((varfile = get_localvarfile()) == NULL)
59 return (ZERR_INTERNAL);
60
61 varfilebackup = g_strconcat(varfile, ".backup", NULL);
62
63 if (!(fpout = fopen(varfilebackup, "w"))) {
64 g_free(varfile);
65 g_free(varfilebackup);
66 return (errno);
67 }
68 if ((fpin = fopen(varfile, "r")) != NULL) {
69 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
70 if (varbfr[strlen(varbfr)-1] < ' ')
71 varbfr[strlen(varbfr)-1] = '\0';
72 if (varline(varbfr, var)) {
73 fprintf(fpout, "%s = %s\n", var, value);
74 written = 1;
75 }
76 else
77 fprintf(fpout, "%s\n", varbfr);
78 }
79 (void) fclose(fpin); /* don't care about errs on input */
80 }
81 if (!written)
82 fprintf(fpout, "%s = %s\n", var, value);
83 if (fclose(fpout) == EOF) {
84 g_free(varfilebackup);
85 g_free(varfile);
86 return(EIO); /* can't rely on errno */
87 }
88 if (rename(varfilebackup, varfile)) {
89 g_free(varfilebackup);
90 g_free(varfile);
91 return (errno);
92 }
93 g_free(varfilebackup);
94 g_free(varfile);
95 return (ZERR_NONE);
96 }
97
98 Code_t
99 ZUnsetVariable(char *var)
100 {
101 FILE *fpin, *fpout;
102 char *varfile, *varfilebackup, varbfr[512];
103
104 if ((varfile = get_localvarfile()) == NULL)
105 return (ZERR_INTERNAL);
106
107 varfilebackup = g_strconcat(varfile, ".backup", NULL);
108
109 if (!(fpout = fopen(varfilebackup, "w"))) {
110 g_free(varfile);
111 g_free(varfilebackup);
112 return (errno);
113 }
114 if ((fpin = fopen(varfile, "r")) != NULL) {
115 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
116 if (varbfr[strlen(varbfr)-1] < ' ')
117 varbfr[strlen(varbfr)-1] = '\0';
118 if (!varline(varbfr, var))
119 fprintf(fpout, "%s\n", varbfr);
120 }
121 (void) fclose(fpin); /* don't care about read close errs */
122 }
123 if (fclose(fpout) == EOF) {
124 g_free(varfilebackup);
125 g_free(varfile);
126 return(EIO); /* errno isn't reliable */
127 }
128 if (rename(varfilebackup, varfile)) {
129 g_free(varfilebackup);
130 g_free(varfile);
131 return (errno);
132 }
133 g_free(varfilebackup);
134 g_free(varfile);
135 return (ZERR_NONE);
136 }
137
138 static char *get_localvarfile(void)
139 {
140 const char *base;
141 #ifndef WIN32
142 struct passwd *pwd;
143 base = purple_home_dir();
144 #else
145 base = getenv("HOME");
146 if (!base)
147 base = getenv("HOMEPATH");
148 if (!base)
149 base = "C:\\";
150 #endif
151 if (!base) {
152 #ifndef WIN32
153 if (!(pwd = getpwuid((int) getuid()))) {
154 fprintf(stderr, "Zephyr internal failure: Can't find your entry in /etc/passwd\n");
155 return NULL;
156 }
157 base = pwd->pw_dir;
158 #endif
159 }
160
161 return g_strconcat(base, "/.zephyr.vars", NULL);
162 }
163
164 static char *get_varval(fn, var)
165 char *fn;
166 char *var;
167 {
168 FILE *fp;
169 static char varbfr[512];
170 int i;
171
172 fp = fopen(fn, "r");
173 if (!fp)
174 return ((char *)0);
175
176 while (fgets(varbfr, sizeof varbfr, fp) != (char *) 0) {
177 if (varbfr[strlen(varbfr)-1] < ' ')
178 varbfr[strlen(varbfr)-1] = '\0';
179 if (!(i = varline(varbfr, var)))
180 continue;
181 (void) fclose(fp); /* open read-only, don't care */
182 return (varbfr+i);
183 }
184 (void) fclose(fp); /* open read-only, don't care */
185 return ((char *)0);
186 }
187
188 /* If the variable in the line bfr[] is the same as var, return index to
189 the variable value, else return 0. */
190 static int varline(bfr, var)
191 char *bfr;
192 char *var;
193 {
194 register char *cp;
195
196
197 if (!bfr[0] || bfr[0] == '#') /* comment or null line */
198 return (0);
199
200 cp = bfr;
201 while (*cp && !isspace(*cp) && (*cp != '='))
202 cp++;
203
204 #ifndef WIN32
205 #define max(a,b) ((a > b) ? (a) : (b))
206 #endif
207
208 if (g_ascii_strncasecmp(bfr, var, max(strlen(var), (gsize)(cp - bfr))))
209 return(0); /* var is not the var in
210 bfr ==> no match */
211
212 cp = strchr(bfr, '=');
213 if (!cp)
214 return(0);
215 cp++;
216 while (*cp && isspace(*cp)) /* space up to variable value */
217 cp++;
218
219 return (cp - bfr); /* return index */
220 }

mercurial