| 16 #include <ctype.h> |
16 #include <ctype.h> |
| 17 #ifndef WIN32 |
17 #ifndef WIN32 |
| 18 #include <pwd.h> |
18 #include <pwd.h> |
| 19 #endif |
19 #endif |
| 20 |
20 |
| 21 static int get_localvarfile __P((char *bfr)); |
21 static char *get_localvarfile __P((void)); |
| 22 static char *get_varval __P((char *fn, char *val)); |
22 static char *get_varval __P((char *fn, char *val)); |
| 23 static int varline __P((char *bfr, char *var)); |
23 static int varline __P((char *bfr, char *var)); |
| 24 |
24 |
| 25 char *ZGetVariable(var) |
25 char *ZGetVariable(var) |
| 26 char *var; |
26 char *var; |
| 27 { |
27 { |
| 28 char varfile[128], *ret; |
28 char *varfile, *ret; |
| 29 |
29 |
| 30 if (get_localvarfile(varfile)) |
30 if ((varfile = get_localvarfile()) == NULL) |
| 31 return ((char *)0); |
31 return ((char *)0); |
| 32 |
32 |
| 33 if ((ret = get_varval(varfile, var)) != ZERR_NONE) |
33 if ((ret = get_varval(varfile, var)) != ZERR_NONE) { |
| 34 return (ret); |
34 g_free(varfile); |
| |
35 return ret; |
| |
36 } |
| 35 |
37 |
| 36 #ifdef WIN32 |
38 #ifdef WIN32 |
| 37 sprintf(varfile, "C:\\zephyr\\zephyr.var"); |
39 varfile = g_strdup("C:\\zephyr\\zephyr.var"); |
| 38 #else |
40 #else |
| 39 sprintf(varfile, "%s/zephyr.vars", CONFDIR); |
41 varfile = g_strdup_printf("%s/zephyr.vars", CONFDIR); |
| 40 #endif |
42 #endif |
| 41 return (get_varval(varfile, var)); |
43 ret = get_varval(varfile, var); |
| |
44 g_free(varfile); |
| |
45 |
| |
46 return ret; |
| 42 } |
47 } |
| 43 |
48 |
| 44 Code_t ZSetVariable(var, value) |
49 Code_t ZSetVariable(var, value) |
| 45 char *var; |
50 char *var; |
| 46 char *value; |
51 char *value; |
| 47 { |
52 { |
| 48 int written; |
53 int written; |
| 49 FILE *fpin, *fpout; |
54 FILE *fpin, *fpout; |
| 50 char varfile[128], varfilebackup[128], varbfr[512]; |
55 char *varfile, *varfilebackup, varbfr[512]; |
| 51 |
56 |
| 52 written = 0; |
57 written = 0; |
| 53 |
58 |
| 54 if (get_localvarfile(varfile)) |
59 if ((varfile = get_localvarfile()) == NULL) |
| 55 return (ZERR_INTERNAL); |
60 return (ZERR_INTERNAL); |
| 56 |
61 |
| 57 (void) strcpy(varfilebackup, varfile); |
62 varfilebackup = g_strconcat(varfile, ".backup", NULL); |
| 58 (void) strcat(varfilebackup, ".backup"); |
63 |
| 59 |
64 if (!(fpout = fopen(varfilebackup, "w"))) { |
| 60 if (!(fpout = fopen(varfilebackup, "w"))) |
65 g_free(varfile); |
| 61 return (errno); |
66 g_free(varfilebackup); |
| |
67 return (errno); |
| |
68 } |
| 62 if ((fpin = fopen(varfile, "r")) != NULL) { |
69 if ((fpin = fopen(varfile, "r")) != NULL) { |
| 63 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) { |
70 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) { |
| 64 if (varbfr[strlen(varbfr)-1] < ' ') |
71 if (varbfr[strlen(varbfr)-1] < ' ') |
| 65 varbfr[strlen(varbfr)-1] = '\0'; |
72 varbfr[strlen(varbfr)-1] = '\0'; |
| 66 if (varline(varbfr, var)) { |
73 if (varline(varbfr, var)) { |
| 72 } |
79 } |
| 73 (void) fclose(fpin); /* don't care about errs on input */ |
80 (void) fclose(fpin); /* don't care about errs on input */ |
| 74 } |
81 } |
| 75 if (!written) |
82 if (!written) |
| 76 fprintf(fpout, "%s = %s\n", var, value); |
83 fprintf(fpout, "%s = %s\n", var, value); |
| 77 if (fclose(fpout) == EOF) |
84 if (fclose(fpout) == EOF) { |
| 78 return(EIO); /* can't rely on errno */ |
85 g_free(varfilebackup); |
| 79 if (rename(varfilebackup, varfile)) |
86 g_free(varfile); |
| 80 return (errno); |
87 return(EIO); /* can't rely on errno */ |
| |
88 } |
| |
89 if (rename(varfilebackup, varfile)) { |
| |
90 g_free(varfilebackup); |
| |
91 g_free(varfile); |
| |
92 return (errno); |
| |
93 } |
| |
94 g_free(varfilebackup); |
| |
95 g_free(varfile); |
| 81 return (ZERR_NONE); |
96 return (ZERR_NONE); |
| 82 } |
97 } |
| 83 |
98 |
| 84 Code_t ZUnsetVariable(var) |
99 Code_t ZUnsetVariable(var) |
| 85 char *var; |
100 char *var; |
| 86 { |
101 { |
| 87 FILE *fpin, *fpout; |
102 FILE *fpin, *fpout; |
| 88 char varfile[128], varfilebackup[128], varbfr[512]; |
103 char *varfile, *varfilebackup, varbfr[512]; |
| 89 |
104 |
| 90 if (get_localvarfile(varfile)) |
105 if ((varfile = get_localvarfile()) == NULL) |
| 91 return (ZERR_INTERNAL); |
106 return (ZERR_INTERNAL); |
| 92 |
107 |
| 93 (void) strcpy(varfilebackup, varfile); |
108 varfilebackup = g_strconcat(varfile, ".backup", NULL); |
| 94 (void) strcat(varfilebackup, ".backup"); |
109 |
| 95 |
110 if (!(fpout = fopen(varfilebackup, "w"))) { |
| 96 if (!(fpout = fopen(varfilebackup, "w"))) |
111 g_free(varfile); |
| 97 return (errno); |
112 g_free(varfilebackup); |
| |
113 return (errno); |
| |
114 } |
| 98 if ((fpin = fopen(varfile, "r")) != NULL) { |
115 if ((fpin = fopen(varfile, "r")) != NULL) { |
| 99 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) { |
116 while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) { |
| 100 if (varbfr[strlen(varbfr)-1] < ' ') |
117 if (varbfr[strlen(varbfr)-1] < ' ') |
| 101 varbfr[strlen(varbfr)-1] = '\0'; |
118 varbfr[strlen(varbfr)-1] = '\0'; |
| 102 if (!varline(varbfr, var)) |
119 if (!varline(varbfr, var)) |
| 103 fprintf(fpout, "%s\n", varbfr); |
120 fprintf(fpout, "%s\n", varbfr); |
| 104 } |
121 } |
| 105 (void) fclose(fpin); /* don't care about read close errs */ |
122 (void) fclose(fpin); /* don't care about read close errs */ |
| 106 } |
123 } |
| 107 if (fclose(fpout) == EOF) |
124 if (fclose(fpout) == EOF) { |
| 108 return(EIO); /* errno isn't reliable */ |
125 g_free(varfilebackup); |
| 109 if (rename(varfilebackup, varfile)) |
126 g_free(varfile); |
| 110 return (errno); |
127 return(EIO); /* errno isn't reliable */ |
| |
128 } |
| |
129 if (rename(varfilebackup, varfile)) { |
| |
130 g_free(varfilebackup); |
| |
131 g_free(varfile); |
| |
132 return (errno); |
| |
133 } |
| |
134 g_free(varfilebackup); |
| |
135 g_free(varfile); |
| 111 return (ZERR_NONE); |
136 return (ZERR_NONE); |
| 112 } |
137 } |
| 113 |
138 |
| 114 static int get_localvarfile(bfr) |
139 static char *get_localvarfile(void) |
| 115 char *bfr; |
140 { |
| 116 { |
141 const char *base; |
| 117 const char *envptr; |
|
| 118 #ifndef WIN32 |
142 #ifndef WIN32 |
| 119 struct passwd *pwd; |
143 struct passwd *pwd; |
| 120 envptr = purple_home_dir(); |
144 base = purple_home_dir(); |
| 121 #else |
145 #else |
| 122 envptr = getenv("HOME"); |
146 base = getenv("HOME"); |
| 123 if (!envptr) |
147 if (!base) |
| 124 envptr = getenv("HOMEPATH"); |
148 base = getenv("HOMEPATH"); |
| 125 if (!envptr) |
149 if (!base) |
| 126 envptr = "C:\\"; |
150 base = "C:\\"; |
| 127 #endif |
151 #endif |
| 128 if (envptr) |
152 if (!base) { |
| 129 (void) strcpy(bfr, envptr); |
|
| 130 else { |
|
| 131 #ifndef WIN32 |
153 #ifndef WIN32 |
| 132 if (!(pwd = getpwuid((int) getuid()))) { |
154 if (!(pwd = getpwuid((int) getuid()))) { |
| 133 fprintf(stderr, "Zephyr internal failure: Can't find your entry in /etc/passwd\n"); |
155 fprintf(stderr, "Zephyr internal failure: Can't find your entry in /etc/passwd\n"); |
| 134 return (1); |
156 return NULL; |
| 135 } |
157 } |
| 136 (void) strcpy(bfr, pwd->pw_dir); |
158 base = pwd->pw_dir; |
| 137 #endif |
159 #endif |
| 138 } |
160 } |
| 139 |
161 |
| 140 (void) strcat(bfr, "/"); |
162 return g_strconcat(base, "/.zephyr.vars", NULL); |
| 141 (void) strcat(bfr, ".zephyr.vars"); |
|
| 142 return (0); |
|
| 143 } |
163 } |
| 144 |
164 |
| 145 static char *get_varval(fn, var) |
165 static char *get_varval(fn, var) |
| 146 char *fn; |
166 char *fn; |
| 147 char *var; |
167 char *var; |