/*---------------------------------------------------------------------- Reading input somehow failed and we need to shutdown now Args: none Result: pine exits ---*/ void read_bail(void) { dprint((1, "read_bail: cleaning up\n")); /* Do not bail out on a tcp timeout, instead close the troublesome stream */ if(ps_global->tcptimeout && some_stream_is_locked()){ ps_global->read_bail = 1; return; } end_signals(1); /* * This gets rid of temporary cache files for remote addrbooks. */ completely_done_with_adrbks(); /* * This flushes out deferred changes and gets rid of temporary cache * files for remote config files. */ if(ps_global->prc){ if(ps_global->prc->outstanding_pinerc_changes) write_pinerc(ps_global, Main, WRP_NOUSER); if(ps_global->prc->rd) rd_close_remdata(&ps_global->prc->rd); free_pinerc_s(&ps_global->prc); } /* as does this */ if(ps_global->post_prc){ if(ps_global->post_prc->outstanding_pinerc_changes) write_pinerc(ps_global, Post, WRP_NOUSER); if(ps_global->post_prc->rd) rd_close_remdata(&ps_global->post_prc->rd); free_pinerc_s(&ps_global->post_prc); } sp_end(); dprint((1, "done with read_bail clean up\n")); imap_flush_passwd_cache(TRUE); end_keyboard(F_ON(F_USE_FK,ps_global)); end_tty_driver(ps_global); if(filter_data_file(0)) our_unlink(filter_data_file(0)); exit(0); }
/* * 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); }