void notify_save (void) { int fh; struct notify *notify; GSList *list = notify_list; fh = hexchat_open_file ("notify.conf", O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); if (fh != -1) { while (list) { notify = (struct notify *) list->data; write (fh, notify->name, strlen (notify->name)); if (notify->networks) { write (fh, " ", 1); write (fh, notify->networks, strlen (notify->networks)); } write (fh, "\n", 1); list = list->next; } close (fh); } }
void palette_save (void) { int i, j, fh; char prefname[256]; fh = hexchat_open_file ("colors.conf", O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); if (fh != -1) { /* mIRC colors 0-31 are here */ for (i = 0; i < 32; i++) { snprintf (prefname, sizeof prefname, "color_%d", i); cfg_put_color (fh, colors[i].red, colors[i].green, colors[i].blue, prefname); } /* our special colors are mapped at 256+ */ for (i = 256, j = 32; j < MAX_COL+1; i++, j++) { snprintf (prefname, sizeof prefname, "color_%d", i); cfg_put_color (fh, colors[j].red, colors[j].green, colors[j].blue, prefname); } close (fh); } }
void ignore_load () { struct ignore *ignore; struct stat st; char *cfg, *my_cfg; int fh; fh = hexchat_open_file ("ignore.conf", O_RDONLY, 0, 0); if (fh != -1) { fstat (fh, &st); if (st.st_size) { cfg = g_malloc0 (st.st_size + 1); read (fh, cfg, st.st_size); my_cfg = cfg; while (my_cfg) { ignore = g_new0 (struct ignore, 1); if ((my_cfg = ignore_read_next_entry (my_cfg, ignore))) ignore_list = g_slist_prepend (ignore_list, ignore); else g_free (ignore); } g_free (cfg); }
void notify_load (void) { int fh; char buf[256]; char *sep; fh = hexchat_open_file ("notify.conf", O_RDONLY, 0, 0); if (fh != -1) { while (waitline (fh, buf, sizeof buf, FALSE) != -1) { if (buf[0] != '#' && buf[0] != 0) { sep = strchr (buf, ' '); if (sep) { sep[0] = 0; notify_adduser (buf, sep + 1); } else notify_adduser (buf, NULL); } } close (fh); } }
void chanopt_save_all (void) { int i; int num_saved; int fh; GSList *list; chanopt_in_memory *co; guint8 val; if (!chanopt_list || !chanopt_changed) { return; } fh = hexchat_open_file ("chanopt.conf", O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); if (fh == -1) { return; } for (num_saved = 0, list = chanopt_list; list; list = list->next) { co = list->data; i = 0; while (i < sizeof (chanopt) / sizeof (channel_options)) { val = G_STRUCT_MEMBER (guint8, co, chanopt[i].offset); /* not using global/default setting, must save */ if (val != SET_DEFAULT) { if (num_saved != 0) write (fh, "\n", 1); chanopt_save_one_channel (co, fh); num_saved++; goto cont; } i++; } cont: g_free (co->network); g_free (co->channel); g_free (co); } close (fh); /* we're quiting, no need to free */ /*g_slist_free (chanopt_list); chanopt_list = NULL; chanopt_open = FALSE; chanopt_changed = FALSE;*/ }
int hexchat_pluginpref_get_str (hexchat_plugin *pl, const char *var, char *dest) { int fh; int l; char confname[64]; char *canon; char *cfg; struct stat st; canon = g_strdup (pl->name); canonalize_key (canon); sprintf (confname, "addon_%s.conf", canon); g_free (canon); /* partly borrowed from palette.c */ fh = hexchat_open_file (confname, O_RDONLY, 0, 0); if (fh == -1) { return 0; } fstat (fh, &st); cfg = malloc (st.st_size + 1); if (!cfg) { close (fh); return 0; } cfg[0] = '\0'; l = read (fh, cfg, st.st_size); if (l >= 0) { cfg[l] = '\0'; } if (!cfg_get_str (cfg, var, dest, 512)) /* dest_len is the same as buffer size in set */ { free (cfg); close (fh); return 0; } free (cfg); close (fh); return 1; }
static void rawlog_save (server *serv, char *file) { int fh = -1; if (file) { if (serv->gui->rawlog_window) fh = hexchat_open_file (file, O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE | XOF_FULLPATH); if (fh != -1) { gtk_xtext_save (GTK_XTEXT (serv->gui->rawlog_textlist), fh); close (fh); } } }
void palette_load (void) { int i, j, l, fh; char prefname[256]; struct stat st; char *cfg; int red, green, blue; fh = hexchat_open_file ("colors.conf", O_RDONLY, 0, 0); if (fh != -1) { fstat (fh, &st); cfg = malloc (st.st_size + 1); if (cfg) { cfg[0] = '\0'; l = read (fh, cfg, st.st_size); if (l >= 0) cfg[l] = '\0'; /* mIRC colors 0-31 are here */ for (i = 0; i < 32; i++) { snprintf (prefname, sizeof prefname, "color_%d", i); cfg_get_color (cfg, prefname, &red, &green, &blue); colors[i].red = red; colors[i].green = green; colors[i].blue = blue; } /* our special colors are mapped at 256+ */ for (i = 256, j = 32; j < MAX_COL+1; i++, j++) { snprintf (prefname, sizeof prefname, "color_%d", i); cfg_get_color (cfg, prefname, &red, &green, &blue); colors[j].red = red; colors[j].green = green; colors[j].blue = blue; } free (cfg); } close (fh); } }
static void chanopt_load_all (void) { int fh; char buf[256]; char *eq; char *network = NULL; chanopt_in_memory *current = NULL; /* 1. load the old file into our GSList */ fh = hexchat_open_file ("chanopt.conf", O_RDONLY, 0, 0); if (fh != -1) { while (waitline (fh, buf, sizeof buf, FALSE) != -1) { eq = strchr (buf, '='); if (!eq) continue; eq[0] = 0; if (eq != buf && eq[-1] == ' ') eq[-1] = 0; if (!strcmp (buf, "network")) { g_free (network); network = g_strdup (eq + 2); } else if (!strcmp (buf, "channel")) { current = chanopt_find (network, eq + 2, TRUE); chanopt_changed = FALSE; } else { if (current) chanopt_add_opt (current, buf, atoi (eq + 2)); } } close (fh); g_free (network); } }
static int key_save_kbs (void) { int fd; char buf[512]; char *accel_text; GSList *list = keybind_list; struct key_binding *kb; fd = hexchat_open_file ("keybindings.conf", O_CREAT | O_TRUNC | O_WRONLY, 0x180, XOF_DOMODE); if (fd < 0) return 1; write (fd, buf, g_snprintf (buf, 510, "# HexChat key bindings config file\n\n")); while (list) { kb = list->data; accel_text = gtk_accelerator_name (kb->keyval, kb->mod); g_snprintf (buf, 510, "ACCEL=%s\n%s\n", accel_text, key_actions[kb->action].name); write (fd, buf, strlen (buf)); g_free (accel_text); if (kb->data1 && kb->data1[0]) write (fd, buf, g_snprintf (buf, 510, "D1:%s\n", kb->data1)); else write (fd, "D1!\n", 4); if (kb->data2 && kb->data2[0]) write (fd, buf, g_snprintf (buf, 510, "D2:%s\n", kb->data2)); else write (fd, "D2!\n", 4); write (fd, "\n", 1); list = g_slist_next (list); } close (fd); return 0; }
static void chanlist_filereq_done (server *serv, char *file) { time_t t = time (0); int fh, users; char *chan, *topic; char buf[1024]; GtkTreeModel *model = GET_MODEL (serv); GtkTreeIter iter; if (!file) return; fh = hexchat_open_file (file, O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE | XOF_FULLPATH); if (fh == -1) return; snprintf (buf, sizeof buf, "HexChat Channel List: %s - %s\n", serv->servername, ctime (&t)); write (fh, buf, strlen (buf)); if (gtk_tree_model_get_iter_first (model, &iter)) { do { gtk_tree_model_get (model, &iter, COL_CHANNEL, &chan, COL_USERS, &users, COL_TOPIC, &topic, -1); snprintf (buf, sizeof buf, "%-16s %-5d%s\n", chan, users, topic); g_free (chan); g_free (topic); write (fh, buf, strlen (buf)); } while (gtk_tree_model_iter_next (model, &iter)); } close (fh); }
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; } } }
static void editlist_save (GtkWidget *igad, gchar *file) { GtkTreeModel *store = get_store (); GtkTreeIter iter; char buf[512]; char *name, *cmd; int fh; fh = hexchat_open_file (file, O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); if (fh != -1) { if (gtk_tree_model_get_iter_first (GTK_TREE_MODEL (store), &iter)) { do { name = NULL; cmd = NULL; gtk_tree_model_get (GTK_TREE_MODEL (store), &iter, NAME_COLUMN, &name, CMD_COLUMN, &cmd, -1); g_snprintf (buf, sizeof (buf), "NAME %s\nCMD %s\n\n", name, cmd); write (fh, buf, strlen (buf)); g_free (name); g_free (cmd); } while (gtk_tree_model_iter_next (GTK_TREE_MODEL (store), &iter)); } close (fh); gtk_widget_destroy (editlist_win); if (editlist_list == replace_list) { list_free (&replace_list); list_loadconf (file, &replace_list, 0); } else if (editlist_list == popup_list) { list_free (&popup_list); list_loadconf (file, &popup_list, 0); } else if (editlist_list == button_list) { GSList *list = sess_list; struct session *sess; list_free (&button_list); list_loadconf (file, &button_list, 0); while (list) { sess = (struct session *) list->data; fe_buttons_update (sess); list = list->next; } } else if (editlist_list == dlgbutton_list) { GSList *list = sess_list; struct session *sess; list_free (&dlgbutton_list); list_loadconf (file, &dlgbutton_list, 0); while (list) { sess = (struct session *) list->data; fe_dlgbuttons_update (sess); list = list->next; } } else if (editlist_list == ctcp_list) { list_free (&ctcp_list); list_loadconf (file, &ctcp_list, 0); } else if (editlist_list == command_list) { list_free (&command_list); list_loadconf (file, &command_list, 0); } else if (editlist_list == usermenu_list) { list_free (&usermenu_list); list_loadconf (file, &usermenu_list, 0); usermenu_update (); } else { list_free (&urlhandler_list); list_loadconf (file, &urlhandler_list, 0); } } }
static void editlist_gui_save (GtkWidget * igad) { int fh, i = 0; char buf[512]; char *a, *b; fh = hexchat_open_file (editlist_file, O_TRUNC | O_WRONLY | O_CREAT, 0600, XOF_DOMODE); if (fh != -1) { while (1) { if (!gtk_clist_get_text (GTK_CLIST (editlist_gui_list), i, 0, &a)) break; gtk_clist_get_text (GTK_CLIST (editlist_gui_list), i, 1, &b); snprintf (buf, sizeof (buf), "NAME %s\nCMD %s\n\n", a, b); write (fh, buf, strlen (buf)); i++; } close (fh); gtk_widget_destroy (editlist_gui_window); if (editlist_list == replace_list) { list_free (&replace_list); list_loadconf (editlist_file, &replace_list, 0); } else if (editlist_list == popup_list) { list_free (&popup_list); list_loadconf (editlist_file, &popup_list, 0); } else if (editlist_list == button_list) { GSList *list = sess_list; struct session *sess; list_free (&button_list); list_loadconf (editlist_file, &button_list, 0); while (list) { sess = (struct session *) list->data; fe_buttons_update (sess); list = list->next; } } else if (editlist_list == dlgbutton_list) { GSList *list = sess_list; struct session *sess; list_free (&dlgbutton_list); list_loadconf (editlist_file, &dlgbutton_list, 0); while (list) { sess = (struct session *) list->data; fe_dlgbuttons_update (sess); list = list->next; } } else if (editlist_list == ctcp_list) { list_free (&ctcp_list); list_loadconf (editlist_file, &ctcp_list, 0); } else if (editlist_list == command_list) { list_free (&command_list); list_loadconf (editlist_file, &command_list, 0); } else if (editlist_list == usermenu_list) { list_free (&usermenu_list); list_loadconf (editlist_file, &usermenu_list, 0); usermenu_update (); } else { list_free (&urlhandler_list); list_loadconf (editlist_file, &urlhandler_list, 0); } } }
static int key_load_kbs (void) { char *buf, *ibuf; struct stat st; struct key_binding *kb = NULL; int fd, len, state = 0, pnt = 0; guint keyval; GdkModifierType mod = 0; off_t size; fd = hexchat_open_file ("keybindings.conf", O_RDONLY, 0, 0); if (fd < 0) { ibuf = g_strdup (default_kb_cfg); size = strlen (default_kb_cfg); } else { if (fstat (fd, &st) != 0) { close (fd); return 1; } ibuf = g_malloc(st.st_size); read (fd, ibuf, st.st_size); size = st.st_size; close (fd); } if (keybind_list) { g_slist_free_full (keybind_list, key_free); keybind_list = NULL; } while (buf_get_line (ibuf, &buf, &pnt, size)) { if (buf[0] == '#') continue; if (strlen (buf) == 0) continue; switch (state) { case KBSTATE_MOD: kb = g_new0 (struct key_binding, 1); /* New format */ if (strncmp (buf, "ACCEL=", 6) == 0) { buf += 6; gtk_accelerator_parse (buf, &keyval, &mod); kb->keyval = keyval; kb->mod = key_modifier_get_valid (mod); state = KBSTATE_ACT; continue; } if (key_load_kbs_helper_mod (buf, &mod)) goto corrupt_file; kb->mod = mod; state = KBSTATE_KEY; continue; case KBSTATE_KEY: STRIP_WHITESPACE keyval = gdk_keyval_from_name (buf); if (keyval == 0) { g_free (ibuf); return 2; } kb->keyval = keyval; state = KBSTATE_ACT; continue; case KBSTATE_ACT: STRIP_WHITESPACE kb->action = key_get_action_from_string (buf); if (kb->action == KEY_MAX_ACTIONS + 1) { g_free (ibuf); return 3; } state = KBSTATE_DT1; continue; case KBSTATE_DT1: case KBSTATE_DT2: if (state == KBSTATE_DT1) kb->data1 = kb->data2 = NULL; while (buf[0] == ' ' || buf[0] == '\t') buf++; if (buf[0] != 'D') { g_free (ibuf); return 4; } switch (buf[1]) { case '1': if (state != KBSTATE_DT1) goto corrupt_file; break; case '2': if (state != KBSTATE_DT2) goto corrupt_file; break; default: goto corrupt_file; } if (buf[2] == ':') { len = strlen (buf); /* Add one for the NULL, subtract 3 for the "Dx:" */ len++; len -= 3; if (state == KBSTATE_DT1) { kb->data1 = g_strndup (&buf[3], len); } else { kb->data2 = g_strndup (&buf[3], len); } } else if (buf[2] == '!') { if (state == KBSTATE_DT1) kb->data1 = NULL; else kb->data2 = NULL; } if (state == KBSTATE_DT1) { state = KBSTATE_DT2; continue; } else { keybind_list = g_slist_append (keybind_list, kb); state = KBSTATE_MOD; } continue; } } g_free (ibuf); return 0; corrupt_file: g_free (ibuf); g_free (kb); return 5; }
void palette_load (void) { int i, j, l, fh, res; char prefname[256]; struct stat st; char *cfg; int red, green, blue; int upgrade = FALSE; fh = hexchat_open_file ("colors.conf", O_RDONLY, 0, 0); if (fh == -1) { fh = hexchat_open_file ("palette.conf", O_RDONLY, 0, 0); upgrade = TRUE; } if (fh != -1) { fstat (fh, &st); cfg = malloc (st.st_size + 1); if (cfg) { cfg[0] = '\0'; l = read (fh, cfg, st.st_size); if (l >= 0) cfg[l] = '\0'; if (!upgrade) { /* mIRC colors 0-31 are here */ for (i = 0; i < 32; i++) { snprintf (prefname, sizeof prefname, "color_%d", i); cfg_get_color (cfg, prefname, &red, &green, &blue); colors[i].red = red; colors[i].green = green; colors[i].blue = blue; } /* our special colors are mapped at 256+ */ for (i = 256, j = 32; j < MAX_COL+1; i++, j++) { snprintf (prefname, sizeof prefname, "color_%d", i); cfg_get_color (cfg, prefname, &red, &green, &blue); colors[j].red = red; colors[j].green = green; colors[j].blue = blue; } } else { /* loading 2.0.x palette.conf */ for (i = 0; i < MAX_COL+1; i++) { snprintf (prefname, sizeof prefname, "color_%d_red", i); red = cfg_get_int (cfg, prefname); snprintf (prefname, sizeof prefname, "color_%d_grn", i); green = cfg_get_int (cfg, prefname); snprintf (prefname, sizeof prefname, "color_%d_blu", i); blue = cfg_get_int_with_result (cfg, prefname, &res); if (res) { colors[remap[i]].red = red; colors[remap[i]].green = green; colors[remap[i]].blue = blue; } } /* copy 0-15 to 16-31 */ for (i = 0; i < 16; i++) { colors[i+16].red = colors[i].red; colors[i+16].green = colors[i].green; colors[i+16].blue = colors[i].blue; } } free (cfg); } close (fh); } }
int pevent_load (char *filename) { /* AGL, I've changed this file and pevent_save, could you please take a look at * the changes and possibly modify them to suit you * //David H */ char *buf, *ibuf; int fd, i = 0, pnt = 0; struct stat st; char *text = NULL, *snd = NULL; int penum = 0; char *ofs; if (filename == NULL) fd = hexchat_open_file ("pevents.conf", O_RDONLY, 0, 0); else fd = hexchat_open_file (filename, O_RDONLY, 0, XOF_FULLPATH); if (fd == -1) return 1; if (fstat (fd, &st) != 0) { close (fd); return 1; } ibuf = g_malloc (st.st_size); read (fd, ibuf, st.st_size); close (fd); while (buf_get_line (ibuf, &buf, &pnt, st.st_size)) { if (buf[0] == '#') continue; if (strlen (buf) == 0) continue; ofs = strchr (buf, '='); if (!ofs) continue; *ofs = 0; ofs++; if (strcmp (buf, "event_name") == 0) { if (penum >= 0) pevent_trigger_load (&penum, &text, &snd); penum = pevent_find (ofs, &i); continue; } else if (strcmp (buf, "event_text") == 0) { g_free (text); text = g_strdup (ofs); continue; } continue; } pevent_trigger_load (&penum, &text, &snd); g_free (ibuf); return 0; }