--- freem/src/iniconf.c 2025/03/09 19:14:25 1.3 +++ freem/src/iniconf.c 2025/04/10 15:27:39 1.7 @@ -1,5 +1,5 @@ /* - * $Id: iniconf.c,v 1.3 2025/03/09 19:14:25 snw Exp $ + * $Id: iniconf.c,v 1.7 2025/04/10 15:27:39 snw Exp $ * Function implementations for reading * FreeM configuration files * @@ -25,6 +25,18 @@ * along with FreeM. If not, see . * * $Log: iniconf.c,v $ + * Revision 1.7 2025/04/10 15:27:39 snw + * Detect Devuan distribution and fix OS/2 problem with iniconf.c + * + * Revision 1.6 2025/04/10 01:24:38 snw + * Remove C++ style comments + * + * Revision 1.5 2025/04/09 19:52:02 snw + * Eliminate as many warnings as possible while building with -Wall + * + * Revision 1.4 2025/04/02 19:59:38 snw + * Automatically modify env.conf from fmadm reconfigure + * * Revision 1.3 2025/03/09 19:14:25 snw * First phase of REUSE compliance and header reformat * @@ -44,8 +56,13 @@ #include #include #include +#include #include "mpsdef.h" +#if defined(__OS2__) +# include +#endif + extern char config_file[4096]; #if !defined(PATH_MAX) && defined(_SCO_DS) @@ -64,10 +81,12 @@ extern char config_file[4096]; # include #endif -ini_keyvalue *ini_head; +#if !defined(PATH_MAX) +# define PATH_MAX 4096 +#endif -/* prototypes for internal-use-only functions */ -int read_profile_string(char *file, char *section, char *key, char *value); + +/* ini_keyvalue *ini_head; */ int get_conf(char *section, char *key, char *value) { @@ -193,6 +212,8 @@ int read_profile_string(char *file, char char *cursec; char *line; int lnum = 0; + + curkey = (char *) NULL; fullsec = (char *) malloc(CONF_BUFSIZE); NULLPTRCHK(fullsec,"read_profile_string"); @@ -277,111 +298,93 @@ int file_exists(char *filename) } } -void write_profile_string(char *file, char *section, char *key, char *value) +void parse_section_header(char *input, char *buf, size_t buflen) { - ini_keyvalue *ini_head; - + strncpy (buf, &(input[1]), buflen); + buf[strlen (buf) - 2] = '\0'; } -ini_keyvalue *ini_insert(ini_section *s, char *section, char *key, char *value) +int modify_profile_string(char *file, char *section, char *key, char *value) { - ini_section *t; - - for (t = s; t != NULL; t = t->next) { - - if (strcmp (t->name, section) == 0) { - - /* this section already exists. update. */ - return ini_kv_insert (s, key, value); - - } - - } - - /* section does not exist. insert. */ - t = (ini_section *) malloc (sizeof (ini_section)); - NULLPTRCHK(t,"ini_insert"); - - t->name = (char *) malloc ((strlen (section) + 1) * sizeof (char)); - NULLPTRCHK(t->name,"ini_insert"); - - strcpy (t->name, section); - - t->next = s; - s = t; - - return ini_kv_insert (s, key, value); - -} - -ini_keyvalue *ini_kv_insert(ini_section *s, char *key, char *value) -{ - ini_keyvalue *t; - - for (t = s->head; t != NULL; t = t->next) { - - if (strcmp (t->key, key) == 0) { - - /* this is an update */ - free (t->value); - t->value = (char *) malloc ((strlen (value) + 1) * sizeof (char)); - NULLPTRCHK(t->value,"ini_kv_insert"); - - strcpy (t->value, value); - - return t; + FILE *input_fp; + FILE *output_fp; + char output_filename[4096]; + char input_line[255]; + char current_section[255]; + char *savptr; + char *current_key; + char tmpsi[255]; + char tmps[255]; + int changed = FALSE; + + snprintf (output_filename, 4095, "%s.tmp", file); + + if ((input_fp = fopen (file, "r")) == NULL) { + return FALSE; + } + + if ((output_fp = fopen (output_filename, "w+")) == NULL) { + fclose (input_fp); + return FALSE; + } + + while (fgets (input_line, 255, input_fp)) { + if (input_line[0] == '[') { + /* this is a section; write it unchanged */ + fputs (input_line, output_fp); - } - - } - - /* this is an insert */ - t = (ini_keyvalue *) malloc (sizeof (ini_keyvalue)); - NULLPTRCHK(t,"ini_kv_insert"); - - t->key = (char *) malloc ((strlen (key) + 1) * sizeof (char)); - NULLPTRCHK(t->key,"ini_kv_insert"); - - t->value = (char *) malloc ((strlen (value) + 1) * sizeof (char)); - NULLPTRCHK(t->value,"ini_kv_insert"); - - strcpy (t->key, key); - strcpy (t->value, value); - - t->next = s->head; - s->head = t; - - return t; - -} - -void ini_section_delete(ini_section *head, char *name) -{ - ini_section *t = head; - ini_section *p = NULL; - - if ((t != (ini_section *) NULL) && (strcmp (t->name, name) == 0)) { - head = t->next; - - free (t->name); - free (t); - return; - } - - while ((t != NULL) && (strcmp (t->name, name) != 0)) { - p = t; - t = t->next; + /* update the current section */ + parse_section_header (input_line, current_section, 255); + } + else { + /* is this a key/value pair? */ + if (strchr (input_line, '=') != NULL) { + /* are we in the requested section? */ + if (strcmp (section, current_section) == 0) { + /* yes; we'll parse it */ + strcpy (tmpsi, input_line); + savptr = tmpsi; + current_key = strtok_r (tmpsi, "=", &savptr); + /* is this key the one we're changing? */ + if (strcmp (key, current_key) == 0) { + /* yes; modify it and write out*/ + snprintf (tmps, 255, "%s=%s\n", current_key, value); + + fputs (tmps, output_fp); + changed = TRUE; + } + else { + /* not the requested key; pass it through unmodified */ + fputs (input_line, output_fp); + } + } + else { + /* not the requested section; write it out unchanged */ + fputs (input_line, output_fp); + } + } + else { + /* not a key/value pair; write it out unchanged */ + fputs (input_line, output_fp); + } + } } - - if (t == NULL) return; - - free (t->name); - free (t); - - return; + + /* close both files */ + fclose (output_fp); + fclose (input_fp); + + /* delete the original file */ + unlink (file); + + /* rename the temporary file */ +#if !defined(__OS2__) + cp (file, output_filename); +#else + DosCopy (output_filename, file); +#endif + + return changed; } -void ini_key_delete(ini_section *head, char *key) -{ -}