1 /* This file is part of the Project Athena Zephyr Notification System.
2 * It contains source for the ZGetVariable, ZSetVariable, and ZUnsetVariable
5 * Created by: Robert French
7 * Copyright (c) 1987 by the Massachusetts Institute of Technology.
8 * For copying and distribution information, see the file
12 #include "libpurple/internal.h"
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
);
26 ZGetVariable(const gchar
*var
)
31 if ((varfile
= get_localvarfile()) == NULL
)
34 ret
= get_varval(varfile
, var
);
40 varfile
= g_strdup("C:\\zephyr\\zephyr.var");
42 varfile
= g_build_filename(PURPLE_SYSCONFDIR
, "zephyr.vars", NULL
);
44 ret
= get_varval(varfile
, var
);
50 Code_t
ZSetVariable(var
, value
)
56 char *varfile
, *varfilebackup
, varbfr
[512];
60 if ((varfile
= get_localvarfile()) == NULL
)
61 return (ZERR_INTERNAL
);
63 varfilebackup
= g_strconcat(varfile
, ".backup", NULL
);
65 if (!(fpout
= fopen(varfilebackup
, "w"))) {
67 g_free(varfilebackup
);
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
);
79 fprintf(fpout
, "%s\n", varbfr
);
81 (void) fclose(fpin
); /* don't care about errs on input */
84 fprintf(fpout
, "%s = %s\n", var
, value
);
85 if (fclose(fpout
) == EOF
) {
86 g_free(varfilebackup
);
88 return(EIO
); /* can't rely on errno */
90 if (rename(varfilebackup
, varfile
)) {
91 g_free(varfilebackup
);
95 g_free(varfilebackup
);
100 Code_t
ZUnsetVariable(var
)
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"))) {
113 g_free(varfilebackup
);
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
);
128 return(EIO
); /* errno isn't reliable */
130 if (rename(varfilebackup
, varfile
)) {
131 g_free(varfilebackup
);
135 g_free(varfilebackup
);
140 static char *get_localvarfile(void)
145 base
= purple_home_dir();
147 base
= getenv("HOME");
149 base
= getenv("HOMEPATH");
155 if (!(pwd
= getpwuid((int) getuid()))) {
156 fprintf(stderr
, "Zephyr internal failure: Can't find your entry in /etc/passwd\n");
163 return g_strconcat(base
, "/.zephyr.vars", NULL
);
167 get_varval(const gchar
*fn
, const gchar
*var
)
170 static gchar varbfr
[512];
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
)))
182 (void) fclose(fp
); /* open read-only, don't care */
185 (void) fclose(fp
); /* open read-only, don't care */
189 /* If the variable in the line bfr[] is the same as var, return index to
190 the variable value, else return 0. */
192 varline(const gchar
*bfr
, const gchar
*var
)
194 register const gchar
*cp
;
196 if (!bfr
[0] || bfr
[0] == '#') {
197 /* comment or null line */
202 while (*cp
&& !isspace(*cp
) && (*cp
!= '=')) {
206 if (g_ascii_strncasecmp(bfr
, var
, MAX(strlen(var
), (gsize
)(cp
- bfr
)))) {
207 /* var is not the var in bfr ==> no match */
211 cp
= strchr(bfr
, '=');
216 while (*cp
&& isspace(*cp
)) {
217 /* space up to variable value */
221 return (cp
- bfr
); /* return index */