diff src/protocols/zephyr/ZVariables.c @ 2086:424a40f12a6c

[gaim-migrate @ 2096] moving protocols from plugins/ to src/protocols. making it so that you can select which protocols are compiled statically. committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Tue, 31 Jul 2001 01:00:39 +0000
parents
children 9682c0e022c6
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/protocols/zephyr/ZVariables.c	Tue Jul 31 01:00:39 2001 +0000
@@ -0,0 +1,191 @@
+/* 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
+ *
+ *	$Source$
+ *	$Author: warmenhoven $
+ *
+ *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
+ *	For copying and distribution information, see the file
+ *	"mit-copyright.h". 
+ */
+/* $Header$ */
+
+#ifndef lint
+static char rcsid_ZVariables_c[] = "$Header$";
+#endif
+
+#include <internal.h>
+
+#include <ctype.h>
+#include <pwd.h>
+
+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;
+    char *get_varval();
+
+    if (get_localvarfile(varfile))
+	return ((char *)0);
+
+    if ((ret = get_varval(varfile, var)) != ZERR_NONE)
+	return (ret);
+
+    sprintf(varfile, "%s/zephyr.vars", CONFDIR);
+    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;
+{
+    char *envptr;
+    struct passwd *pwd;
+
+    envptr = getenv("HOME");
+    if (envptr)
+	(void) strcpy(bfr, envptr);
+    else {
+	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);
+    }
+
+    (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++;
+
+#define max(a,b) ((a > b) ? (a) : (b))
+
+    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 */
+}