static int run_as(enum run_as_cmd cmd, struct run_as_data *data, uid_t uid, gid_t gid) { int ret; if (use_clone()) { DBG("Using run_as worker"); pthread_mutex_lock(&worker_lock); assert(global_worker); ret = run_as_cmd(global_worker, cmd, data, uid, gid); pthread_mutex_unlock(&worker_lock); } else { DBG("Using run_as without worker"); ret = run_as_noworker(cmd, data, uid, gid); } return ret; }
static int run_as(enum run_as_cmd cmd, struct run_as_data *data, struct run_as_ret *ret_value, uid_t uid, gid_t gid) { int ret, saved_errno; pthread_mutex_lock(&worker_lock); if (use_clone()) { DBG("Using run_as worker"); assert(global_worker); ret = run_as_cmd(global_worker, cmd, data, ret_value, uid, gid); saved_errno = ret_value->_errno; /* * If the worker thread crashed the errno is set to EIO. we log * the error and start a new worker process. */ if (ret == -1 && saved_errno == EIO) { DBG("Socket closed unexpectedly... " "Restarting the worker process"); ret = run_as_restart_worker(global_worker); if (ret == -1) { ERR("Failed to restart worker process."); goto err; } } } else { DBG("Using run_as without worker"); ret = run_as_noworker(cmd, data, ret_value, uid, gid); } err: pthread_mutex_unlock(&worker_lock); return ret; }