diff libpurple/protocols/zephyr/ZVariables.c @ 15374:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children 32c366eeeb99
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/zephyr/ZVariables.c	Sat Jan 20 02:32:10 2007 +0000
@@ -0,0 +1,200 @@
+/* This file is part of the Project Athena Zephyr Notification System.
+ * It contains source for the ZGetVariable, ZSetVariable, and ZUnsetVariable
+ * functions.
+ *
+ *	Created by:	Robert French
+ *
+ *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
+ *	For copying and distribution information, see the file
+ *	"mit-copyright.h". 
+ */
+
+#include "internal.h"
+#include "util.h"
+
+#include <ctype.h>
+#ifndef WIN32
+#include <pwd.h>
+#endif
+
+static int get_localvarfile __P((char *bfr));
+static char *get_varval __P((char *fn, char *val));
+static int varline __P((char *bfr, char *var));
+
+char *ZGetVariable(var)
+    char *var;
+{
+    char varfile[128], *ret;
+
+    if (get_localvarfile(varfile))
+	return ((char *)0);
+
+    if ((ret = get_varval(varfile, var)) != ZERR_NONE)
+	return (ret);
+
+#ifdef WIN32
+    sprintf(varfile, "C:\\zephyr\\zephyr.var");
+#else
+    sprintf(varfile, "%s/zephyr.vars", CONFDIR);
+#endif
+    return (get_varval(varfile, var));
+}
+
+Code_t ZSetVariable(var, value)
+    char *var;
+    char *value;
+{
+    int written;
+    FILE *fpin, *fpout;
+    char varfile[128], varfilebackup[128], varbfr[512];
+
+    written = 0;
+	
+    if (get_localvarfile(varfile))
+	return (ZERR_INTERNAL);
+
+    (void) strcpy(varfilebackup, varfile);
+    (void) strcat(varfilebackup, ".backup");
+	
+    if (!(fpout = fopen(varfilebackup, "w")))
+	return (errno);
+    if ((fpin = fopen(varfile, "r")) != NULL) {
+	while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
+	    if (varbfr[strlen(varbfr)-1] < ' ')
+		varbfr[strlen(varbfr)-1] = '\0';
+	    if (varline(varbfr, var)) {
+		fprintf(fpout, "%s = %s\n", var, value);
+		written = 1;
+	    }
+	    else
+		fprintf(fpout, "%s\n", varbfr);
+	}
+	(void) fclose(fpin);		/* don't care about errs on input */
+    } 
+    if (!written)
+	fprintf(fpout, "%s = %s\n", var, value);
+    if (fclose(fpout) == EOF)
+	    return(EIO);		/* can't rely on errno */
+    if (rename(varfilebackup, varfile))
+	return (errno);
+    return (ZERR_NONE);
+}	
+
+Code_t ZUnsetVariable(var)
+    char *var;
+{
+    FILE *fpin, *fpout;
+    char varfile[128], varfilebackup[128], varbfr[512];
+
+    if (get_localvarfile(varfile))
+	return (ZERR_INTERNAL);
+
+    (void) strcpy(varfilebackup, varfile);
+    (void) strcat(varfilebackup, ".backup");
+	
+    if (!(fpout = fopen(varfilebackup, "w")))
+	return (errno);
+    if ((fpin = fopen(varfile, "r")) != NULL) {
+	while (fgets(varbfr, sizeof varbfr, fpin) != (char *) 0) {
+	    if (varbfr[strlen(varbfr)-1] < ' ')
+		varbfr[strlen(varbfr)-1] = '\0';
+	    if (!varline(varbfr, var))
+		fprintf(fpout, "%s\n", varbfr);
+	}
+	(void) fclose(fpin);		/* don't care about read close errs */
+    } 
+    if (fclose(fpout) == EOF)
+	    return(EIO);		/* errno isn't reliable */
+    if (rename(varfilebackup, varfile))
+	return (errno);
+    return (ZERR_NONE);
+}	
+
+static int get_localvarfile(bfr)
+    char *bfr;
+{
+    const char *envptr;
+#ifndef WIN32
+    struct passwd *pwd;
+    envptr = gaim_home_dir();
+#else
+    envptr = getenv("HOME");
+    if (!envptr)
+        envptr = getenv("HOMEPATH");
+    if (!envptr) 
+        envptr = "C:\\";
+#endif
+    if (envptr)
+	(void) strcpy(bfr, envptr);
+    else {
+#ifndef WIN32
+	if (!(pwd = getpwuid((int) getuid()))) {
+	    fprintf(stderr, "Zephyr internal failure: Can't find your entry in /etc/passwd\n");
+	    return (1);
+	}
+	(void) strcpy(bfr, pwd->pw_dir);
+#endif
+    }
+
+    (void) strcat(bfr, "/");
+    (void) strcat(bfr, ".zephyr.vars");
+    return (0);
+} 
+	
+static char *get_varval(fn, var)
+    char *fn;
+    char *var;
+{
+    FILE *fp;
+    static char varbfr[512];
+    int i;
+	
+    fp = fopen(fn, "r");
+    if (!fp)
+	return ((char *)0);
+
+    while (fgets(varbfr, sizeof varbfr, fp) != (char *) 0) {
+	if (varbfr[strlen(varbfr)-1] < ' ')
+	    varbfr[strlen(varbfr)-1] = '\0';
+	if (!(i = varline(varbfr, var)))
+	    continue;
+	(void) fclose(fp);		/* open read-only, don't care */
+	return (varbfr+i);
+    }
+    (void) fclose(fp);			/* open read-only, don't care */
+    return ((char *)0);
+}
+
+/* If the variable in the line bfr[] is the same as var, return index to
+   the variable value, else return 0. */
+static int varline(bfr, var)
+    char *bfr;
+    char *var;
+{
+    register char *cp;
+	
+
+    if (!bfr[0] || bfr[0] == '#')	/* comment or null line */
+	return (0);
+	
+    cp = bfr;
+    while (*cp && !isspace(*cp) && (*cp != '='))
+	cp++;
+
+#ifndef WIN32
+#define max(a,b) ((a > b) ? (a) : (b))
+#endif
+
+    if (strncasecmp(bfr, var, max(strlen(var),cp - bfr)))
+	return(0);			/* var is not the var in
+					   bfr ==> no match */
+
+    cp = strchr(bfr, '=');
+    if (!cp)
+	return(0);
+    cp++;
+    while (*cp && isspace(*cp))		/* space up to variable value */
+	cp++;
+
+    return (cp - bfr);			/* return index */
+}