| 1307 | } |
| 1308 | |
| 1309 | static apr_status_t rewritemap_program_child(apr_pool_t *p, |
| 1310 | const char *progname, char **argv, |
| 1311 | const char *user, const char *group, |
| 1312 | apr_file_t **fpout, |
| 1313 | apr_file_t **fpin) |
| 1314 | { |
| 1315 | apr_status_t rc; |
| 1316 | apr_procattr_t *procattr; |
| 1317 | apr_proc_t *procnew; |
| 1318 | |
| 1319 | if ( APR_SUCCESS == (rc=apr_procattr_create(&procattr, p)) |
| 1320 | && APR_SUCCESS == (rc=apr_procattr_io_set(procattr, APR_FULL_BLOCK, |
| 1321 | APR_FULL_BLOCK, APR_NO_PIPE)) |
| 1322 | && APR_SUCCESS == (rc=apr_procattr_dir_set(procattr, |
| 1323 | ap_make_dirstr_parent(p, argv[0]))) |
| 1324 | && (!user || APR_SUCCESS == (rc=apr_procattr_user_set(procattr, user, ""))) |
| 1325 | && (!group || APR_SUCCESS == (rc=apr_procattr_group_set(procattr, group))) |
| 1326 | && APR_SUCCESS == (rc=apr_procattr_cmdtype_set(procattr, APR_PROGRAM)) |
| 1327 | && APR_SUCCESS == (rc=apr_procattr_child_errfn_set(procattr, |
| 1328 | rewrite_child_errfn)) |
| 1329 | && APR_SUCCESS == (rc=apr_procattr_error_check_set(procattr, 1))) { |
| 1330 | |
| 1331 | procnew = apr_pcalloc(p, sizeof(*procnew)); |
| 1332 | rc = apr_proc_create(procnew, argv[0], (const char **)argv, NULL, |
| 1333 | procattr, p); |
| 1334 | |
| 1335 | if (rc == APR_SUCCESS) { |
| 1336 | apr_pool_note_subprocess(p, procnew, APR_KILL_AFTER_TIMEOUT); |
| 1337 | |
| 1338 | if (fpin) { |
| 1339 | (*fpin) = procnew->in; |
| 1340 | } |
| 1341 | |
| 1342 | if (fpout) { |
| 1343 | (*fpout) = procnew->out; |
| 1344 | } |
| 1345 | } |
| 1346 | } |
| 1347 | |
| 1348 | return (rc); |
| 1349 | } |
| 1350 | |
| 1351 | static apr_status_t run_rewritemap_programs(server_rec *s, apr_pool_t *p) |
| 1352 | { |
no test coverage detected