Annotation of freem/src/iniconf.c, revision 1.1
1.1 ! snw 1: /*
! 2: * *
! 3: * * *
! 4: * * *
! 5: * ***************
! 6: * * * * *
! 7: * * MUMPS *
! 8: * * * * *
! 9: * ***************
! 10: * * *
! 11: * * *
! 12: * *
! 13: *
! 14: * iniconf.c
! 15: * Function implementations for reading
! 16: * FreeM configuration files
! 17: *
! 18: *
! 19: * Author: Serena Willis <jpw@coherent-logic.com>
! 20: * Copyright (C) 1998 MUG Deutschland
! 21: * Copyright (C) 2020 Coherent Logic Development LLC
! 22: *
! 23: *
! 24: * This file is part of FreeM.
! 25: *
! 26: * FreeM is free software: you can redistribute it and/or modify
! 27: * it under the terms of the GNU Affero Public License as published by
! 28: * the Free Software Foundation, either version 3 of the License, or
! 29: * (at your option) any later version.
! 30: *
! 31: * FreeM is distributed in the hope that it will be useful,
! 32: * but WITHOUT ANY WARRANTY; without even the implied warranty of
! 33: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
! 34: * GNU Affero Public License for more details.
! 35: *
! 36: * You should have received a copy of the GNU Affero Public License
! 37: * along with FreeM. If not, see <https://www.gnu.org/licenses/>.
! 38: *
! 39: **/
! 40:
! 41: #define FALSE 0
! 42: #define TRUE 1
! 43: #include <stddef.h>
! 44: #include "iniconf.h"
! 45: #include "libfill.h"
! 46: #include <stdio.h>
! 47: #include <unistd.h>
! 48: #include <sys/types.h>
! 49: #include <pwd.h>
! 50: #include <string.h>
! 51: #include <limits.h>
! 52: #include "mpsdef.h"
! 53:
! 54: extern char config_file[4096];
! 55:
! 56: #if !defined(PATH_MAX) && defined(_SCO_DS)
! 57: # define PATH_MAX 4096
! 58: #endif
! 59:
! 60: #if !defined(PATH_MAX) && defined(__gnu_hurd__)
! 61: # define PATH_MAX 1024
! 62: #endif
! 63:
! 64: #if !defined(PATH_MAX) && defined(_AIX)
! 65: # define PATH_MAX 1024
! 66: #endif
! 67:
! 68: #if defined(__NetBSD__) || defined(__FreeBSD__)
! 69: # include <sys/syslimits.h>
! 70: #endif
! 71:
! 72: ini_keyvalue *ini_head;
! 73:
! 74: /* prototypes for internal-use-only functions */
! 75: int read_profile_string(char *file, char *section, char *key, char *value);
! 76:
! 77: int get_conf(char *section, char *key, char *value)
! 78: {
! 79: char *etcfile;
! 80: char *dotfile;
! 81: char *homedir;
! 82:
! 83: int exists_in_etc = FALSE;
! 84: int exists_in_dotfile = FALSE;
! 85: int dotexists;
! 86: int etcexists;
! 87:
! 88: char *etc_value;
! 89: char *dot_value;
! 90:
! 91: etc_value = (char *) malloc(CONF_BUFSIZE);
! 92: NULLPTRCHK(etc_value,"get_conf");
! 93: dot_value = (char *) malloc(CONF_BUFSIZE);
! 94: NULLPTRCHK(dot_value,"get_conf");
! 95:
! 96: etcfile = config_file;
! 97:
! 98:
! 99: #if !defined(__AMIGA) && !defined(_SCO_DS) && !defined(_AIX)
! 100: uid_t uid = geteuid();
! 101: struct passwd *pw = getpwuid(uid);
! 102:
! 103: if (pw == NULL) {
! 104: free (etc_value);
! 105: free (dot_value);
! 106:
! 107: return (FALSE);
! 108: }
! 109:
! 110: homedir = (char *) calloc(strlen(pw->pw_dir) + 1, sizeof(char));
! 111: NULLPTRCHK(homedir,"get_conf");
! 112:
! 113: (void) strcpy(homedir, pw->pw_dir);
! 114:
! 115: dotfile = calloc(PATH_MAX, sizeof(char));
! 116: NULLPTRCHK(dotfile,"get_conf");
! 117:
! 118: (void) strcat(dotfile, homedir);
! 119: (void) strcat(dotfile, "/.freemrc");
! 120:
! 121: etcexists = file_exists(etcfile);
! 122: dotexists = file_exists(dotfile);
! 123: #else
! 124:
! 125: #if defined(__AMIGA)
! 126: strcpy (etcfile, "./freem.conf");
! 127: etcexists = TRUE;
! 128: dotexists = FALSE;
! 129: #else
! 130: strcpy (etcfile, SYSCONFDIR"/freem.conf");
! 131:
! 132: etcexists = TRUE;
! 133: dotexists = FALSE;
! 134: #endif
! 135:
! 136: #endif
! 137:
! 138: if (etcexists == TRUE) {
! 139: exists_in_etc = read_profile_string(etcfile, section, key, etc_value);
! 140: }
! 141: else {
! 142: exists_in_etc = FALSE;
! 143: }
! 144:
! 145: if (dotexists == TRUE) {
! 146: exists_in_dotfile = read_profile_string(dotfile, section, key, dot_value);
! 147: }
! 148: else {
! 149: exists_in_dotfile = FALSE;
! 150: }
! 151:
! 152: if (exists_in_dotfile) {
! 153: strcpy (value, dot_value);
! 154:
! 155: free (etc_value);
! 156: free (dot_value);
! 157: #if !defined(__AMIGA) && !defined(_SCO_DS) && !defined(_AIX)
! 158: free (homedir);
! 159: free (dotfile);
! 160: #endif
! 161:
! 162: return (TRUE);
! 163: }
! 164:
! 165: if (exists_in_etc) {
! 166: strcpy(value, etc_value);
! 167:
! 168: free (etc_value);
! 169: free (dot_value);
! 170: #if !defined(__AMIGA) && !defined(_SCO_DS) && !defined(_AIX)
! 171: free (homedir);
! 172: free (dotfile);
! 173: #endif
! 174:
! 175: return (TRUE);
! 176: }
! 177:
! 178: free (etc_value);
! 179: free (dot_value);
! 180: #if !defined(__AMIGA) && !defined(_SCO_DS) && !defined(_AIX)
! 181: free (homedir);
! 182: free (dotfile);
! 183: #endif
! 184:
! 185: return (FALSE); /* didn't exist anywhere */
! 186: }
! 187:
! 188: int read_profile_string(char *file, char *section, char *key, char *value)
! 189: {
! 190:
! 191: register int i;
! 192:
! 193: FILE *fp;
! 194:
! 195: char *curkey;
! 196: char *curval;
! 197: char *fullsec;
! 198: char *cursec;
! 199: char *line;
! 200: int lnum = 0;
! 201:
! 202: fullsec = (char *) malloc(CONF_BUFSIZE);
! 203: NULLPTRCHK(fullsec,"read_profile_string");
! 204:
! 205: cursec = (char *) malloc(CONF_BUFSIZE);
! 206: NULLPTRCHK(cursec,"read_profile_string");
! 207:
! 208: line = (char *) malloc(CONF_BUFSIZE);
! 209: NULLPTRCHK(line,"read_profile_string");
! 210:
! 211:
! 212:
! 213:
! 214: snprintf(fullsec, CONF_BUFSIZE, "[%s]%c", section, '\0');
! 215:
! 216: strcpy(cursec, "[]");
! 217:
! 218:
! 219: fp = fopen(file, "r");
! 220:
! 221: while(fgets(line, CONF_BUFSIZE, fp) != NULL) {
! 222: ++lnum;
! 223:
! 224: if(line[0] == '[') {
! 225: strcpy(cursec, line);
! 226:
! 227: for(i = 0; i < CONF_BUFSIZE; i++) {
! 228: if(cursec[i] == ']') {
! 229: cursec[i + 1] = '\0';
! 230: break;
! 231: }
! 232: }
! 233: }
! 234: else {
! 235: if ((line[0] != '[') && (strchr(line, '=') != NULL)) {
! 236: curkey = strtok(line, "=");
! 237: curval = strtok(NULL, "=");
! 238: curval = strtok(curval, "\n");
! 239:
! 240:
! 241: if((strcmp(curkey, key) == 0) && (strcmp(cursec, fullsec) == 0)) {
! 242: strcpy(value, curval);
! 243: (void) fclose(fp);
! 244:
! 245: free (fullsec);
! 246: free (curkey);
! 247: free (cursec);
! 248:
! 249: return(TRUE);
! 250: }
! 251: }
! 252: }
! 253:
! 254: }
! 255:
! 256: if (fp != NULL) {
! 257: (void) fclose(fp);
! 258: }
! 259:
! 260: /* if we've gotten here, the section and/or key was not found */
! 261: sprintf (value, "\0");
! 262:
! 263: free (fullsec);
! 264: free (curkey);
! 265: free (cursec);
! 266:
! 267: return(FALSE);
! 268:
! 269: }
! 270:
! 271: int file_exists(char *filename)
! 272: {
! 273: FILE *fp;
! 274:
! 275: if ((fp = fopen(filename, "r")) != NULL) {
! 276: (void) fclose(fp);
! 277:
! 278: return(TRUE);
! 279: }
! 280: else {
! 281: return(FALSE);
! 282: }
! 283: }
! 284:
! 285: void write_profile_string(char *file, char *section, char *key, char *value)
! 286: {
! 287: ini_keyvalue *ini_head;
! 288:
! 289: }
! 290:
! 291: ini_keyvalue *ini_insert(ini_section *s, char *section, char *key, char *value)
! 292: {
! 293: ini_section *t;
! 294:
! 295: for (t = s; t != NULL; t = t->next) {
! 296:
! 297: if (strcmp (t->name, section) == 0) {
! 298:
! 299: /* this section already exists. update. */
! 300: return ini_kv_insert (s, key, value);
! 301:
! 302: }
! 303:
! 304: }
! 305:
! 306: /* section does not exist. insert. */
! 307: t = (ini_section *) malloc (sizeof (ini_section));
! 308: NULLPTRCHK(t,"ini_insert");
! 309:
! 310: t->name = (char *) malloc ((strlen (section) + 1) * sizeof (char));
! 311: NULLPTRCHK(t->name,"ini_insert");
! 312:
! 313: strcpy (t->name, section);
! 314:
! 315: t->next = s;
! 316: s = t;
! 317:
! 318: return ini_kv_insert (s, key, value);
! 319:
! 320: }
! 321:
! 322: ini_keyvalue *ini_kv_insert(ini_section *s, char *key, char *value)
! 323: {
! 324: ini_keyvalue *t;
! 325:
! 326: for (t = s->head; t != NULL; t = t->next) {
! 327:
! 328: if (strcmp (t->key, key) == 0) {
! 329:
! 330: /* this is an update */
! 331: free (t->value);
! 332: t->value = (char *) malloc ((strlen (value) + 1) * sizeof (char));
! 333: NULLPTRCHK(t->value,"ini_kv_insert");
! 334:
! 335: strcpy (t->value, value);
! 336:
! 337: return t;
! 338:
! 339: }
! 340:
! 341: }
! 342:
! 343: /* this is an insert */
! 344: t = (ini_keyvalue *) malloc (sizeof (ini_keyvalue));
! 345: NULLPTRCHK(t,"ini_kv_insert");
! 346:
! 347: t->key = (char *) malloc ((strlen (key) + 1) * sizeof (char));
! 348: NULLPTRCHK(t->key,"ini_kv_insert");
! 349:
! 350: t->value = (char *) malloc ((strlen (value) + 1) * sizeof (char));
! 351: NULLPTRCHK(t->value,"ini_kv_insert");
! 352:
! 353: strcpy (t->key, key);
! 354: strcpy (t->value, value);
! 355:
! 356: t->next = s->head;
! 357: s->head = t;
! 358:
! 359: return t;
! 360:
! 361: }
! 362:
! 363: void ini_section_delete(ini_section *head, char *name)
! 364: {
! 365: ini_section *t = head;
! 366: ini_section *p = NULL;
! 367:
! 368: if ((t != (ini_section *) NULL) && (strcmp (t->name, name) == 0)) {
! 369: head = t->next;
! 370:
! 371: free (t->name);
! 372: free (t);
! 373: return;
! 374: }
! 375:
! 376: while ((t != NULL) && (strcmp (t->name, name) != 0)) {
! 377: p = t;
! 378: t = t->next;
! 379: }
! 380:
! 381: if (t == NULL) return;
! 382:
! 383: free (t->name);
! 384: free (t);
! 385:
! 386: return;
! 387: }
! 388:
! 389: void ini_key_delete(ini_section *head, char *key)
! 390: {
! 391:
! 392: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>