/* This file is part of the Project Athena Zephyr Notification System. * It contains source for the ZGetVariable, ZSetVariable, and ZUnsetVariable * Created by: Robert French * Copyright (c) 1987 by the Massachusetts Institute of Technology. * For copying and distribution information, see the file #include "libpurple/internal.h" static char *get_localvarfile(void); static const gchar *get_varval(const gchar *fn, const gchar *val); static int varline(const gchar *bfr, const gchar *var); ZGetVariable(const gchar *var) if ((varfile = get_localvarfile()) == NULL) ret = get_varval(varfile, var); varfile = g_strdup("C:\\zephyr\\zephyr.var"); varfile = g_build_filename(PURPLE_SYSCONFDIR, "zephyr.vars", NULL); ret = get_varval(varfile, var); Code_t ZSetVariable(var, value) char *varfile, *varfilebackup, varbfr[512]; if ((varfile = get_localvarfile()) == NULL) varfilebackup = g_strconcat(varfile, ".backup", NULL); if (!(fpout = fopen(varfilebackup, "w"))) { 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); fprintf(fpout, "%s\n", varbfr); (void) fclose(fpin); /* don't care about errs on input */ fprintf(fpout, "%s = %s\n", var, value); if (fclose(fpout) == EOF) { return(EIO); /* can't rely on errno */ if (g_rename(varfilebackup, varfile)) { Code_t ZUnsetVariable(var) char *varfile, *varfilebackup, varbfr[512]; if ((varfile = get_localvarfile()) == NULL) varfilebackup = g_strconcat(varfile, ".backup", NULL); if (!(fpout = fopen(varfilebackup, "w"))) { 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 (g_rename(varfilebackup, varfile)) { static char *get_localvarfile(void) base = purple_home_dir(); base = getenv("HOMEPATH"); if (!(pwd = getpwuid((int) getuid()))) { fprintf(stderr, "Zephyr internal failure: Can't find your entry in /etc/passwd\n"); return g_strconcat(base, "/.zephyr.vars", NULL); get_varval(const gchar *fn, const gchar *var) static gchar varbfr[512]; while (fgets(varbfr, sizeof varbfr, fp) != (char *) 0) { if (varbfr[strlen(varbfr)-1] < ' ') varbfr[strlen(varbfr)-1] = '\0'; if (!(i = varline(varbfr, var))) (void) fclose(fp); /* open read-only, don't care */ (void) fclose(fp); /* open read-only, don't care */ /* If the variable in the line bfr[] is the same as var, return index to the variable value, else return 0. */ varline(const gchar *bfr, const gchar *var) register const gchar *cp; if (!bfr[0] || bfr[0] == '#') { /* comment or null line */ while (*cp && !isspace(*cp) && (*cp != '=')) { if (g_ascii_strncasecmp(bfr, var, MAX(strlen(var), (gsize)(cp - bfr)))) { /* var is not the var in bfr ==> no match */ while (*cp && isspace(*cp)) { /* space up to variable value */ return (cp - bfr); /* return index */