int save_config (void) { int fh, i; char *config, *new_config; check_prefs_dir (); config = default_file (); new_config = g_strconcat (config, ".new", NULL); fh = g_open (new_config, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, 0600); if (fh == -1) { g_free (new_config); return 0; } if (!cfg_put_str (fh, "version", PACKAGE_VERSION)) { g_free (new_config); return 0; } i = 0; do { switch (vars[i].type) { case TYPE_STR: if (!cfg_put_str (fh, vars[i].name, (char *) &prefs + vars[i].offset)) { g_free (new_config); return 0; } break; case TYPE_INT: case TYPE_BOOL: if (!cfg_put_int (fh, *((int *) &prefs + vars[i].offset), vars[i].name)) { g_free (new_config); return 0; } } i++; } while (vars[i].name); if (close (fh) == -1) { g_free (new_config); return 0; } #ifdef WIN32 g_unlink (config); /* win32 can't rename to an existing file */ #endif if (g_rename (new_config, config) == -1) { g_free (new_config); return 0; } g_free (new_config); return 1; }
int save_config (void) { int fh, i; char *new_config, *config; check_prefs_dir (); config = default_file (); new_config = malloc (strlen (config) + 5); strcpy (new_config, config); strcat (new_config, ".new"); fh = open (new_config, OFLAGS | O_TRUNC | O_WRONLY | O_CREAT, 0600); if (fh == -1) { free (new_config); return 0; } if (!cfg_put_str (fh, "version", PACKAGE_VERSION)) { free (new_config); return 0; } i = 0; do { switch (vars[i].type) { case TYPE_STR: if (!cfg_put_str (fh, vars[i].name, (char *) &prefs + vars[i].offset)) { free (new_config); return 0; } break; case TYPE_INT: case TYPE_BOOL: if (!cfg_put_int (fh, *((int *) &prefs + vars[i].offset), vars[i].name)) { free (new_config); return 0; } } i++; } while (vars[i].name); if (close (fh) == -1) { free (new_config); return 0; } if (rename (new_config, config) == -1) { free (new_config); return 0; } free (new_config); return 1; }