libpurple/protocols/zephyr/ZVariables.c

changeset 28001
c6446d1742d3
parent 26726
b81bcec8f359
child 30617
d79eaf981448
equal deleted inserted replaced
28000:f410edd8ebb7 28001:c6446d1742d3
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;

mercurial