1197{
1198 char buf[1024] = { 0 };
1200 char *cert_end = NULL;
1201 FILE *fp_smime_in = NULL;
1202 FILE *fp_smime_err = NULL;
1203 FILE *fp_out = NULL;
1204 FILE *fp_tmp = NULL;
1205 struct Body *b_enc = NULL;
1206 bool err = false;
1207 int empty;
1208 int off;
1209 pid_t pid;
1210
1213
1216 if (!fp_out)
1217 {
1219 goto cleanup;
1220 }
1221
1223 if (!fp_smime_err)
1224 {
1226 goto cleanup;
1227 }
1228
1231 if (!fp_tmp)
1232 {
1234 goto cleanup;
1235 }
1236
1237 *certfile = '\0';
1238 for (char *cert_start = certlist; cert_start; cert_start = cert_end)
1239 {
1240 cert_end = strchr(cert_start, ' ');
1241 if (cert_end)
1242 *cert_end = '\0';
1243 if (*cert_start)
1244 {
1247 snprintf(certfile + off, sizeof(certfile) - off, "%s%s/%s",
1248 (off != 0) ?
" " :
"",
NONULL(c_smime_certificates), cert_start);
1249 }
1250 if (cert_end)
1251 *cert_end++ = ' ';
1252 }
1253
1254
1256 fputc('\n', fp_tmp);
1259
1261 fileno(fp_smime_err),
buf_string(smime_infile), certfile);
1262 if (pid == -1)
1263 {
1265 goto cleanup;
1266 }
1267
1269
1272
1273 fflush(fp_out);
1274 rewind(fp_out);
1275 empty = (fgetc(fp_out) == EOF);
1277
1278 fflush(fp_smime_err);
1279 rewind(fp_smime_err);
1280 while (fgets(buf, sizeof(buf) - 1, fp_smime_err))
1281 {
1282 err = true;
1283 fputs(buf, stdout);
1284 }
1286
1287
1288 if (err)
1290
1291 if (empty)
1292 {
1293
1294 if (!err)
1297 goto cleanup;
1298 }
1299
1311 b_enc->
parts = NULL;
1313
1314cleanup:
1315 if (fp_out)
1316 {
1319 }
1321 if (fp_tmp)
1322 {
1325 }
1328
1329 return b_enc;
1330}
char * buf_strdup(const struct Buffer *buf)
Copy a Buffer's string.
static const char * buf_string(const struct Buffer *buf)
Convert a buffer to a const char * "string".
const char * cs_subset_path(const struct ConfigSubset *sub, const char *name)
Get a path config item by name.
int mutt_any_key_to_continue(const char *s)
Prompt the user to 'press any key' and wait.
void mutt_file_unlink(const char *s)
Delete a file, carefully.
#define mutt_file_fclose(FP)
#define mutt_file_fopen(PATH, MODE)
int filter_wait(pid_t pid)
Wait for the exit of a process and return its status.
size_t mutt_str_len(const char *a)
Calculate the length of a string, safely.
struct Buffer * buf_pool_get(void)
Get a Buffer from the pool.
void buf_pool_release(struct Buffer **ptr)
Return a Buffer to the pool.
int mutt_write_mime_body(struct Body *b, FILE *fp, struct ConfigSubset *sub)
Write a MIME part.
static pid_t smime_invoke_encrypt(FILE **fp_smime_in, FILE **fp_smime_out, FILE **fp_smime_err, int fp_smime_infd, int fp_smime_outfd, int fp_smime_errfd, const char *fname, const char *uids)
Use SMIME to encrypt a file.
String manipulation buffer.
Container for Accounts, Notifications.
struct ConfigSubset * sub
Inherited config items.
#define mutt_file_mkstemp()