void url_save_tree (const char *fname, const char *mode, gboolean fullpath) { FILE *fd; if (fullpath) fd = hexchat_fopen_file (fname, mode, XOF_FULLPATH); else fd = hexchat_fopen_file (fname, mode, 0); if (fd == NULL) return; tree_foreach (url_tree, (tree_traverse_func *)url_save_cb, fd); fclose (fd); }
int hexchat_pluginpref_list (hexchat_plugin *pl, char* dest) { FILE *fpIn; char confname[64]; char buffer[512]; /* the same as in cfg_put_str */ char *bufp = buffer; char *token; token = g_strdup (pl->name); canonalize_key (token); sprintf (confname, "addon_%s.conf", token); g_free (token); fpIn = hexchat_fopen_file (confname, "r", 0); if (fpIn == NULL) /* no existing config file, no parsing */ { return 0; } else /* existing config file, get list of settings */ { strcpy (dest, ""); /* clean up garbage */ while (fscanf (fpIn, " %[^\n]", bufp) != EOF) /* read whole lines including whitespaces */ { token = strtok (buffer, "="); g_strlcat (dest, g_strchomp (token), 4096); /* Dest must not be smaller than this */ g_strlcat (dest, ",", 4096); } fclose (fpIn); } return 1; }
static void url_save_node (char* url) { FILE *fd; /* open <config>/url.log in append mode */ fd = hexchat_fopen_file ("url.log", "a", 0); if (fd == NULL) { return; } fprintf (fd, "%s\n", url); fclose (fd); }
static int hexchat_pluginpref_set_str_real (hexchat_plugin *pl, const char *var, const char *value, int mode) /* mode: 0 = delete, 1 = save */ { FILE *fpIn; int fhOut; int prevSetting; char *confname; char *confname_tmp; char *escaped_value; char *buffer; char *buffer_tmp; char line_buffer[512]; /* the same as in cfg_put_str */ char *line_bufp = line_buffer; char *canon; canon = g_strdup (pl->name); canonalize_key (canon); confname = g_strdup_printf ("addon_%s.conf", canon); g_free (canon); confname_tmp = g_strdup_printf ("%s.new", confname); fhOut = hexchat_open_file (confname_tmp, O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); fpIn = hexchat_fopen_file (confname, "r", 0); if (fhOut == -1) /* unable to save, abort */ { g_free (confname); g_free (confname_tmp); if (fpIn) fclose (fpIn); return 0; } else if (fpIn == NULL) /* no previous config file, no parsing */ { if (mode) { escaped_value = g_strescape (value, NULL); buffer = g_strdup_printf ("%s = %s\n", var, escaped_value); g_free (escaped_value); write (fhOut, buffer, strlen (buffer)); g_free (buffer); close (fhOut); buffer = g_build_filename (get_xdir (), confname, NULL); g_free (confname); buffer_tmp = g_build_filename (get_xdir (), confname_tmp, NULL); g_free (confname_tmp); #ifdef WIN32 g_unlink (buffer); #endif if (g_rename (buffer_tmp, buffer) == 0) { g_free (buffer); g_free (buffer_tmp); return 1; } else { g_free (buffer); g_free (buffer_tmp); return 0; } } else { /* mode = 0, we want to delete but the config file and thus the given setting does not exist, we're ready */ close (fhOut); g_free (confname); g_free (confname_tmp); return 1; } } else /* existing config file, preserve settings and find & replace current var value if any */ { prevSetting = 0; while (fscanf (fpIn, " %511[^\n]", line_bufp) != EOF) /* read whole lines including whitespaces */ { buffer_tmp = g_strdup_printf ("%s ", var); /* add one space, this way it works against var - var2 checks too */ if (strncmp (buffer_tmp, line_buffer, strlen (var) + 1) == 0) /* given setting already exists */ { if (mode) /* overwrite the existing matching setting if we are in save mode */ { escaped_value = g_strescape (value, NULL); buffer = g_strdup_printf ("%s = %s\n", var, escaped_value); g_free (escaped_value); } else /* erase the setting in delete mode */ { buffer = g_strdup (""); } prevSetting = 1; } else { buffer = g_strdup_printf ("%s\n", line_buffer); /* preserve the existing different settings */ } write (fhOut, buffer, strlen (buffer)); g_free (buffer); g_free (buffer_tmp); } fclose (fpIn); if (!prevSetting && mode) /* var doesn't exist currently, append if we're in save mode */ { escaped_value = g_strescape (value, NULL); buffer = g_strdup_printf ("%s = %s\n", var, escaped_value); g_free (escaped_value); write (fhOut, buffer, strlen (buffer)); g_free (buffer); } close (fhOut); buffer = g_build_filename (get_xdir (), confname, NULL); g_free (confname); buffer_tmp = g_build_filename (get_xdir (), confname_tmp, NULL); g_free (confname_tmp); #ifdef WIN32 g_unlink (buffer); #endif if (g_rename (buffer_tmp, buffer) == 0) { g_free (buffer); g_free (buffer_tmp); return 1; } else { g_free (buffer); g_free (buffer_tmp); return 0; } } }
int servlist_save (void) { FILE *fp; char *buf; ircnet *net; ircserver *serv; GSList *list; GSList *hlist; #ifndef WIN32 int first = FALSE; buf = g_strdup_printf ("%s/servlist_.conf", get_xdir ()); if (g_access (buf, F_OK) != 0) first = TRUE; #endif fp = hexchat_fopen_file ("servlist_.conf", "w", 0); if (!fp) { #ifndef WIN32 g_free (buf); #endif return FALSE; } #ifndef WIN32 if (first) g_chmod (buf, 0600); g_free (buf); #endif fprintf (fp, "v=" PACKAGE_VERSION "\n\n"); list = network_list; while (list) { net = list->data; fprintf (fp, "N=%s\n", net->name); if (net->nick) fprintf (fp, "I=%s\n", net->nick); if (net->nick2) fprintf (fp, "i=%s\n", net->nick2); if (net->user) fprintf (fp, "U=%s\n", net->user); if (net->real) fprintf (fp, "R=%s\n", net->real); if (net->pass) fprintf (fp, "P=%s\n", net->pass); if (net->saslpass) fprintf (fp, "A=%s\n", net->saslpass); if (net->autojoin) fprintf (fp, "J=%s\n", net->autojoin); if (net->nickserv) fprintf (fp, "B=%s\n", net->nickserv); if (net->encoding && g_ascii_strcasecmp (net->encoding, "System") && g_ascii_strcasecmp (net->encoding, "System default")) { fprintf (fp, "E=%s\n", net->encoding); if (!servlist_check_encoding (net->encoding)) { buf = g_strdup_printf (_("Warning: \"%s\" character set is unknown. No conversion will be applied for network %s."), net->encoding, net->name); fe_message (buf, FE_MSG_WARN); g_free (buf); } } if (net->command) token_foreach (net->command, '\n', servlist_write_ccmd, fp); fprintf (fp, "F=%d\nD=%d\n", net->flags, net->selected); hlist = net->servlist; while (hlist) { serv = hlist->data; fprintf (fp, "S=%s\n", serv->hostname); hlist = hlist->next; } if (fprintf (fp, "\n") < 1) { fclose (fp); return FALSE; } list = list->next; } fclose (fp); return TRUE; }
static int servlist_load (void) { FILE *fp; char buf[2048]; int len; char *tmp; ircnet *net = NULL; fp = hexchat_fopen_file ("servlist_.conf", "r", 0); if (!fp) return FALSE; while (fgets (buf, sizeof (buf) - 2, fp)) { len = strlen (buf); buf[len] = 0; buf[len-1] = 0; /* remove the trailing \n */ if (net) { switch (buf[0]) { case 'I': net->nick = strdup (buf + 2); break; case 'i': net->nick2 = strdup (buf + 2); break; case 'U': net->user = strdup (buf + 2); break; case 'R': net->real = strdup (buf + 2); break; case 'P': net->pass = strdup (buf + 2); break; case 'A': net->saslpass = strdup (buf + 2); break; case 'J': net->autojoin = strdup (buf + 2); break; case 'C': if (net->command) { /* concat extra commands with a \n separator */ tmp = net->command; net->command = malloc (strlen (tmp) + strlen (buf + 2) + 2); strcpy (net->command, tmp); strcat (net->command, "\n"); strcat (net->command, buf + 2); free (tmp); } else net->command = strdup (buf + 2); break; case 'F': net->flags = atoi (buf + 2); break; case 'D': net->selected = atoi (buf + 2); break; case 'E': net->encoding = strdup (buf + 2); break; case 'S': /* new server/hostname for this network */ servlist_server_add (net, buf + 2); break; case 'B': net->nickserv = strdup (buf + 2); break; } } if (buf[0] == 'N') net = servlist_net_add (buf + 2, /* comment */ NULL, FALSE); } fclose (fp); return TRUE; }
int servlist_save (void) { FILE *fp; char *buf; ircnet *net; ircserver *serv; commandentry *cmd; favchannel *favchan; GSList *list; GSList *netlist; GSList *cmdlist; GSList *favlist; #ifndef WIN32 int first = FALSE; buf = g_build_filename (get_xdir (), "servlist.conf", NULL); if (g_access (buf, F_OK) != 0) first = TRUE; #endif fp = hexchat_fopen_file ("servlist.conf", "w", 0); if (!fp) { #ifndef WIN32 g_free (buf); #endif return FALSE; } #ifndef WIN32 if (first) g_chmod (buf, 0600); g_free (buf); #endif fprintf (fp, "v=" PACKAGE_VERSION "\n\n"); list = network_list; while (list) { net = list->data; fprintf (fp, "N=%s\n", net->name); if (net->nick) fprintf (fp, "I=%s\n", net->nick); if (net->nick2) fprintf (fp, "i=%s\n", net->nick2); if (net->user) fprintf (fp, "U=%s\n", net->user); if (net->real) fprintf (fp, "R=%s\n", net->real); if (net->pass) fprintf (fp, "P=%s\n", net->pass); if (net->logintype) fprintf (fp, "L=%d\n", net->logintype); if (net->encoding) { fprintf (fp, "E=%s\n", net->encoding); if (!servlist_check_encoding (net->encoding)) { buf = g_strdup_printf (_("Warning: \"%s\" character set is unknown. No conversion will be applied for network %s."), net->encoding, net->name); fe_message (buf, FE_MSG_WARN); g_free (buf); } } fprintf (fp, "F=%d\nD=%d\n", net->flags, net->selected); netlist = net->servlist; while (netlist) { serv = netlist->data; fprintf (fp, "S=%s\n", serv->hostname); netlist = netlist->next; } cmdlist = net->commandlist; while (cmdlist) { cmd = cmdlist->data; fprintf (fp, "C=%s\n", cmd->command); cmdlist = cmdlist->next; } favlist = net->favchanlist; while (favlist) { favchan = favlist->data; if (favchan->key) { fprintf (fp, "J=%s,%s\n", favchan->name, favchan->key); } else { fprintf (fp, "J=%s\n", favchan->name); } favlist = favlist->next; } if (fprintf (fp, "\n") < 1) { fclose (fp); return FALSE; } list = list->next; } fclose (fp); return TRUE; }
static int servlist_load (void) { FILE *fp; char buf[2048]; int len; ircnet *net = NULL; /* simple migration we will keep for a short while */ char *oldfile = g_build_filename (get_xdir (), "servlist_.conf", NULL); char *newfile = g_build_filename (get_xdir (), "servlist.conf", NULL); if (g_file_test (oldfile, G_FILE_TEST_EXISTS) && !g_file_test (newfile, G_FILE_TEST_EXISTS)) { g_rename (oldfile, newfile); } g_free (oldfile); g_free (newfile); fp = hexchat_fopen_file ("servlist.conf", "r", 0); if (!fp) return FALSE; while (fgets (buf, sizeof (buf) - 2, fp)) { len = strlen (buf); buf[len] = 0; buf[len-1] = 0; /* remove the trailing \n */ if (net) { switch (buf[0]) { case 'I': net->nick = g_strdup (buf + 2); break; case 'i': net->nick2 = g_strdup (buf + 2); break; case 'U': net->user = g_strdup (buf + 2); break; case 'R': net->real = g_strdup (buf + 2); break; case 'P': net->pass = g_strdup (buf + 2); break; case 'L': net->logintype = atoi (buf + 2); break; case 'E': net->encoding = servlist_check_encoding (buf + 2) ? g_strdup (buf + 2) : g_strdup ("UTF-8"); break; case 'F': net->flags = atoi (buf + 2); break; case 'S': /* new server/hostname for this network */ servlist_server_add (net, buf + 2); break; case 'C': servlist_command_add (net, buf + 2); break; case 'J': servlist_favchan_add (net, buf + 2); break; case 'D': net->selected = atoi (buf + 2); break; /* FIXME Migration code. In 2.9.5 the order was: * * P=serverpass, A=saslpass, B=nickservpass * * So if server password was unset, we can safely use SASL * password for our new universal password, or if that's also * unset, use NickServ password. * * Should be removed at some point. */ case 'A': if (!net->pass) { net->pass = g_strdup (buf + 2); if (!net->logintype) { net->logintype = LOGIN_SASL; } } case 'B': if (!net->pass) { net->pass = g_strdup (buf + 2); if (!net->logintype) { net->logintype = LOGIN_NICKSERV; } } } } if (buf[0] == 'N') net = servlist_net_add (buf + 2, /* comment */ NULL, FALSE); } fclose (fp); return TRUE; }