mark PurpleImageClass as private
[pidgin-git.git] / libpurple / protocols / zephyr / ZVariables.c
blobdf70d2f95f2f12c70d46542b62686b9f74e4806d
1 /* This file is part of the Project Athena Zephyr Notification System.
2 * It contains source for the ZGetVariable, ZSetVariable, and ZUnsetVariable
3 * functions.
5 * Created by: Robert French
7 * Copyright (c) 1987 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, see the file
9 * "mit-copyright.h".
12 #include "libpurple/internal.h"
13 #include "internal.h"
14 #include "util.h"
16 #include <ctype.h>
17 #ifndef WIN32
18 #include <pwd.h>
19 #endif
21 static char *get_localvarfile(void);
22 static const gchar *get_varval(const gchar *fn, const gchar *val);
23 static int varline(const gchar *bfr, const gchar *var);
25 const gchar *
26 ZGetVariable(const gchar *var)
28 gchar *varfile;
29 const gchar *ret;
31 if ((varfile = get_localvarfile()) == NULL)
32 return ((char *)0);
34 ret = get_varval(varfile, var);
35 g_free(varfile);
36 if (ret != ZERR_NONE)
37 return ret;
39 #ifdef _WIN32
40 varfile = g_strdup("C:\\zephyr\\zephyr.var");
41 #else
42 varfile = g_build_filename(PURPLE_SYSCONFDIR, "zephyr.vars", NULL);
43 #endif
44 ret = get_varval(varfile, var);
45 g_free(varfile);
47 return ret;
50 Code_t ZSetVariable(var, value)
51 char *var;
52 char *value;
54 int written;
55 FILE *fpin, *fpout;
56 char *varfile, *varfilebackup, varbfr[512];
58 written = 0;
60 if ((varfile = get_localvarfile()) == NULL)
61 return (ZERR_INTERNAL);
63 varfilebackup = g_strconcat(varfile, ".backup", NULL);
65 if (!(fpout = fopen(varfilebackup, "w"))) {
66 g_free(varfile);
67 g_free(varfilebackup);
68 return (errno);
70 if ((fpin = fopen(varfile, "r")) != NULL) {
71 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
72 if (varbfr[strlen(varbfr)-1] < ' ')
73 varbfr[strlen(varbfr)-1] = '\0';
74 if (varline(varbfr, var)) {
75 fprintf(fpout, "%s = %s\n", var, value);
76 written = 1;
78 else
79 fprintf(fpout, "%s\n", varbfr);
81 (void) fclose(fpin); /* don't care about errs on input */
83 if (!written)
84 fprintf(fpout, "%s = %s\n", var, value);
85 if (fclose(fpout) == EOF) {
86 g_free(varfilebackup);
87 g_free(varfile);
88 return(EIO); /* can't rely on errno */
90 if (rename(varfilebackup, varfile)) {
91 g_free(varfilebackup);
92 g_free(varfile);
93 return (errno);
95 g_free(varfilebackup);
96 g_free(varfile);
97 return (ZERR_NONE);
100 Code_t ZUnsetVariable(var)
101 char *var;
103 FILE *fpin, *fpout;
104 char *varfile, *varfilebackup, varbfr[512];
106 if ((varfile = get_localvarfile()) == NULL)
107 return (ZERR_INTERNAL);
109 varfilebackup = g_strconcat(varfile, ".backup", NULL);
111 if (!(fpout = fopen(varfilebackup, "w"))) {
112 g_free(varfile);
113 g_free(varfilebackup);
114 return (errno);
116 if ((fpin = fopen(varfile, "r")) != NULL) {
117 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
118 if (varbfr[strlen(varbfr)-1] < ' ')
119 varbfr[strlen(varbfr)-1] = '\0';
120 if (!varline(varbfr, var))
121 fprintf(fpout, "%s\n", varbfr);
123 (void) fclose(fpin); /* don't care about read close errs */
125 if (fclose(fpout) == EOF) {
126 g_free(varfilebackup);
127 g_free(varfile);
128 return(EIO); /* errno isn't reliable */
130 if (rename(varfilebackup, varfile)) {
131 g_free(varfilebackup);
132 g_free(varfile);
133 return (errno);
135 g_free(varfilebackup);
136 g_free(varfile);
137 return (ZERR_NONE);
140 static char *get_localvarfile(void)
142 const char *base;
143 #ifndef WIN32
144 struct passwd *pwd;
145 base = purple_home_dir();
146 #else
147 base = getenv("HOME");
148 if (!base)
149 base = getenv("HOMEPATH");
150 if (!base)
151 base = "C:\\";
152 #endif
153 if (!base) {
154 #ifndef WIN32
155 if (!(pwd = getpwuid((int) getuid()))) {
156 fprintf(stderr, "Zephyr internal failure: Can't find your entry in /etc/passwd\n");
157 return NULL;
159 base = pwd->pw_dir;
160 #endif
163 return g_strconcat(base, "/.zephyr.vars", NULL);
166 static const gchar *
167 get_varval(const gchar *fn, const gchar *var)
169 FILE *fp;
170 static gchar varbfr[512];
171 int i;
173 fp = fopen(fn, "r");
174 if (!fp)
175 return ((char *)0);
177 while (fgets(varbfr, sizeof varbfr, fp) != (char *) 0) {
178 if (varbfr[strlen(varbfr)-1] < ' ')
179 varbfr[strlen(varbfr)-1] = '\0';
180 if (!(i = varline(varbfr, var)))
181 continue;
182 (void) fclose(fp); /* open read-only, don't care */
183 return (varbfr+i);
185 (void) fclose(fp); /* open read-only, don't care */
186 return ((char *)0);
189 /* If the variable in the line bfr[] is the same as var, return index to
190 the variable value, else return 0. */
191 static int
192 varline(const gchar *bfr, const gchar *var)
194 register const gchar *cp;
196 if (!bfr[0] || bfr[0] == '#') {
197 /* comment or null line */
198 return (0);
201 cp = bfr;
202 while (*cp && !isspace(*cp) && (*cp != '=')) {
203 cp++;
206 if (g_ascii_strncasecmp(bfr, var, MAX(strlen(var), (gsize)(cp - bfr)))) {
207 /* var is not the var in bfr ==> no match */
208 return 0;
211 cp = strchr(bfr, '=');
212 if (!cp) {
213 return (0);
215 cp++;
216 while (*cp && isspace(*cp)) {
217 /* space up to variable value */
218 cp++;
221 return (cp - bfr); /* return index */