/* * Insert into "var", which currently has values "oldvarval", the "newline" * at position "insert". */ int ccs_var_insert(struct pine *ps, char *newline, struct variable *var, char **oldvarval, int insert) { int count, i, offset; char **newl, ***alval; for(count = 0; oldvarval && oldvarval[count]; count++) ; if(insert < 0 || insert > count){ q_status_message(SM_ORDER,3,5, "unexpected problem inserting folder"); return(0); } newl = (char **)fs_get((count + 2) * sizeof(char *)); newl[insert] = cpystr(newline); newl[count + 1] = NULL; for(i = offset = 0; oldvarval && oldvarval[i]; i++){ if(i == insert) offset = 1; newl[i + offset] = cpystr(oldvarval[i]); } alval = ALVAL(var, ew); if(alval){ free_list_array(alval); if(newl){ for(i = 0; newl[i] ; i++) /* count elements */ ; *alval = (char **) fs_get((i+1) * sizeof(char *)); for(i = 0; newl[i] ; i++) (*alval)[i] = cpystr(newl[i]); (*alval)[i] = NULL; } } free_list_array(&newl); return(1); }
int ccs_var_delete(struct pine *ps, CONTEXT_S *ctxt) { int count, i; char **newl = NULL, **lval, **lp, ***alval; if(ctxt) lval = LVAL(ctxt->var.v, ew); else lval = NULL; for(count = 0; lval && lval[count]; count++) ; /* sum the list */ if(count > 1){ newl = (char **) fs_get(count * sizeof(char *)); for(i = 0, lp = newl; lval[i]; i++) if(i != ctxt->var.i) *lp++ = cpystr(lval[i]); *lp = NULL; } alval = ALVAL(ctxt->var.v, ew); if(alval){ free_list_array(alval); if(newl){ for(i = 0; newl[i] ; i++) /* count elements */ ; *alval = (char **) fs_get((i+1) * sizeof(char *)); for(i = 0; newl[i] ; i++) (*alval)[i] = cpystr(newl[i]); (*alval)[i] = NULL; } } free_list_array(&newl); return(1); }
void free_saved_smime_config(struct pine *ps, SAVED_CONFIG_S **vsavep) { struct variable *vreal; SAVED_CONFIG_S *v; if(vsavep && *vsavep){ for(v = *vsavep, vreal = ps->vars; vreal->name; vreal++,v++){ if(!(smime_related_var(ps, vreal))) continue; if(vreal->is_list){ /* free saved_user_val.l */ if(v && v->saved_user_val.l) free_list_array(&v->saved_user_val.l); } else if(v && v->saved_user_val.p) fs_give((void **)&v->saved_user_val.p); } fs_give((void **)vsavep); } }
int incoming_monitoring_list_tool(struct pine *ps, int cmd, CONF_S **cl, unsigned int flags) { int rv = 0; CONTEXT_S *cntxt; char **the_list; CONF_S *ctmp; char ***alval; OPT_SCREEN_S *saved_screen; if(cmd != MC_EXIT && fixed_var((*cl)->var, NULL, NULL)) return(rv); switch(cmd){ case MC_ADD: case MC_EDIT: cntxt = ps->context_list; if(!(cntxt && cntxt->use & CNTXT_INCMNG)){ q_status_message1(SM_ORDER, 3, 3, _("Turn on incoming folders with Config feature \"%s\""), pretty_feature_name(feature_list_name(F_ENABLE_INCOMING), -1)); return(rv); } saved_screen = opt_screen; the_list = adjust_list_of_monitored_incoming(cntxt, ew, V_INCCHECKLIST); /* adjust top if it might be necessary */ for(ctmp = (*cl)->varnamep; ctmp && ctmp->varnamep == (*cl)->varnamep; ctmp = next_confline(ctmp)) if(ctmp == opt_screen->top_line) opt_screen->top_line = (*cl)->varnamep; if(the_list){ alval = ALVAL((*cl)->var, ew); free_list_array(alval); if(!*the_list){ q_status_message(SM_ORDER, 0, 3, _("Using default, monitor all incoming folders")); if(alval){ /* * Remove config lines except for first one. */ *cl = (*cl)->varnamep; while((*cl)->next && (*cl)->next->varnamep == (*cl)->varnamep) snip_confline(&(*cl)->next); } } else config_add_list(ps, cl, the_list, NULL, 0); /* only have to free the top-level pointer */ fs_give((void **) &the_list); rv = 1; } else{ if(LVAL((*cl)->var, ew)) q_status_message(SM_ORDER, 0, 3, _("List is unchanged")); else q_status_message(SM_ORDER, 0, 3, _("Using default, monitor all incoming folders")); } opt_screen = saved_screen; ps->mangled_screen = 1; break; default: rv = text_tool(ps, cmd, cl, flags); /* if we deleted last one, reverts to default */ if(cmd == MC_DELETE && rv == 1 && (*cl)->varmem == 0 && (!(*cl)->next || (*cl)->next->varnamep != (*cl))) q_status_message(SM_ORDER, 0, 3, _("Using default, monitor all incoming folders")); break; } /* * This is just like the end of text_tool. */ if(rv == 1){ /* * Now go and set the current_val based on user_val changes * above. Turn off command line settings... */ set_current_val((*cl)->var, TRUE, FALSE); fix_side_effects(ps, (*cl)->var, 0); if((*cl)->value) fs_give((void **) &(*cl)->value); (*cl)->value = pretty_value(ps, *cl); exception_override_warning((*cl)->var); } return(rv); }
/* * expand_filter_tokens - return an alloc'd string with any special tokens * in the given filter expanded, NULL otherwise. */ char * expand_filter_tokens(char *filter, ENVELOPE *env, char **tmpf, char **resultf, char **mtypef, int *key, int *hdrs, int *silent) { char **array, **q; char *bp, *cmd = NULL, *p = NULL, *tfn = NULL, *rfn = NULL, *dfn = NULL, *mfn = NULL, *freeme_tfn = NULL, *freeme_rfn = NULL, *freeme_mfn = NULL; int n = 0; size_t len; /* * break filter into words delimited by whitespace so that we can * look for tokens. First we count how many words. */ if((bp = cpystr(filter)) != NULL) p = strtok(bp, " \t"); if(p){ n++; while(strtok(NULL, " \t") != NULL) n++; } if(!n){ dprint((1, "Unexpected failure creating sending_filter\n")); if(bp) fs_give((void **)&bp); return(cmd); } q = array = (char **) fs_get((n+1) * sizeof(*array)); memset(array, 0, (n+1) * sizeof(*array)); /* restore bp and form the array */ strncpy(bp, filter, strlen(filter)+1); if((p = strtok(bp, " \t")) != NULL){ if(q-array < n+1) *q++ = cpystr(p); while((p = strtok(NULL, " \t")) != NULL && (q-array < n+1)) *q++ = cpystr(p); } if(bp) fs_give((void **)&bp); for(q = array; *q != NULL; q++){ if(!strcmp(*q, "_RECIPIENTS_")){ char *rl = NULL; if(env){ size_t l; char *to_l = addr_list_string(env->to, simple_addr_string, 0), *cc_l = addr_list_string(env->cc, simple_addr_string, 0), *bcc_l = addr_list_string(env->bcc, simple_addr_string, 0); l = strlen(to_l) + strlen(cc_l) + strlen(bcc_l) + 2; rl = (char *) fs_get((l+1) * sizeof(char)); snprintf(rl, l+1, "%s %s %s", to_l, cc_l, bcc_l); fs_give((void **)&to_l); fs_give((void **)&cc_l); fs_give((void **)&bcc_l); for(to_l = rl; *to_l; to_l++) /* to_l overloaded! */ if(*to_l == ',') /* space delim'd list */ *to_l = ' '; } fs_give((void **)q); *q = rl ? rl : cpystr(""); } else if(!strcmp(*q, "_TMPFILE_")){ if(!tfn){ tfn = temp_nam(NULL, "sf"); /* send filter file */ if(!tfn) dprint((1, "FAILED creat of _TMPFILE_\n")); } if(tmpf) *tmpf = tfn; else freeme_tfn = tfn; fs_give((void **)q); *q = cpystr(tfn ? tfn : ""); } else if(!strcmp(*q, "_RESULTFILE_")){ if(!rfn){ rfn = temp_nam(NULL, "rf"); /* * We don't create the result file, the user does. * That means we have to remove it after temp_nam creates it. */ if(rfn) our_unlink(rfn); else dprint((1, "FAILED creat of _RESULTFILE_\n")); } if(resultf) *resultf = rfn; else freeme_rfn = rfn; fs_give((void **)q); *q = cpystr(rfn ? rfn : ""); } else if(!strcmp(*q, "_MIMETYPE_")){ if(!mfn){ mfn = temp_nam(NULL, "mt"); /* * We don't create the mimetype file, the user does. * That means we have to remove it after temp_nam creates it. */ if(mfn) our_unlink(mfn); else dprint((1, "FAILED creat of _MIMETYPE_\n")); } if(mtypef) *mtypef = mfn; else freeme_mfn = mfn; fs_give((void **)q); *q = cpystr(mfn ? mfn : ""); } else if(!strcmp(*q, "_DATAFILE_")){ if((dfn = filter_data_file(1)) == NULL) /* filter data file */ dprint((1, "FAILED creat of _DATAFILE_\n")); fs_give((void **)q); *q = cpystr(dfn ? dfn : ""); } else if(!strcmp(*q, "_PREPENDKEY_")){ (*q)[0] = '\0'; if(key) *key = 1; } else if(!strcmp(*q, "_INCLUDEALLHDRS_")){ (*q)[0] = '\0'; if(hdrs) *hdrs = 1; } else if(!strcmp(*q, "_SILENT_")){ (*q)[0] = '\0'; if(silent) *silent = 1; } } /* count up required length */ for(len = 0, q = array; *q != NULL; q++) len += (strlen(*q)+1); cmd = fs_get((len+1) * sizeof(char)); cmd[len] = '\0'; /* cat together all the args */ p = cmd; for(q = array; *q != NULL; q++){ sstrncpy(&p, *q, len+1-(p-cmd)); sstrncpy(&p, " ", len+1-(p-cmd)); } cmd[len] = '\0'; if(freeme_rfn) fs_give((void **) &freeme_rfn); if(freeme_tfn){ /* this shouldn't happen */ our_unlink(freeme_tfn); fs_give((void **) &freeme_tfn); } if(freeme_mfn) fs_give((void **) &freeme_mfn); free_list_array(&array); return(cmd); }
/* * Compare saved user_val with current user_val to see if it changed. * If any have changed, change it back and take the appropriate action. */ void revert_to_saved_smime_config(struct pine *ps, SAVED_CONFIG_S *vsave) { struct variable *vreal; SAVED_CONFIG_S *v; int i, n; int changed = 0; char *pval, **apval, **lval, ***alval; v = vsave; for(vreal = ps->vars; vreal->name; vreal++,v++){ if(!(smime_related_var(ps, vreal) || vreal==&ps->vars[V_FEATURE_LIST])) continue; if(vreal->is_list){ lval = LVAL(vreal, ew); alval = ALVAL(vreal, ew); if((v->saved_user_val.l && !lval) || (!v->saved_user_val.l && lval)) changed++; else if(!v->saved_user_val.l && !lval) ;/* no change, nothing to do */ else for(i = 0; v->saved_user_val.l[i] || lval[i]; i++) if((v->saved_user_val.l[i] && (!lval[i] || strcmp(v->saved_user_val.l[i], lval[i]))) || (!v->saved_user_val.l[i] && lval[i])){ changed++; break; } if(changed){ char **list; if(alval){ if(*alval) free_list_array(alval); /* copy back the original one */ if(v->saved_user_val.l){ list = v->saved_user_val.l; n = 0; /* count how many */ while(list[n]) n++; *alval = (char **)fs_get((n+1) * sizeof(char *)); for(i = 0; i < n; i++) (*alval)[i] = cpystr(v->saved_user_val.l[i]); (*alval)[n] = NULL; } } } } else{ pval = PVAL(vreal, ew); apval = APVAL(vreal, ew); if((v->saved_user_val.p && (!pval || strcmp(v->saved_user_val.p, pval))) || (!v->saved_user_val.p && pval)){ /* It changed, fix it */ changed++; if(apval){ /* free the changed value */ if(*apval) fs_give((void **)apval); if(v->saved_user_val.p) *apval = cpystr(v->saved_user_val.p); } } } if(changed){ if(vreal == &ps->vars[V_FEATURE_LIST]) set_feature_list_current_val(vreal); else set_current_val(vreal, TRUE, FALSE); fix_side_effects(ps, vreal, 1); } } }