static int recv_fd_from_master(struct run_as_worker *worker, enum run_as_cmd cmd, int *fd) { int ret = 0; switch (cmd) { case RUN_AS_EXTRACT_ELF_SYMBOL_OFFSET: case RUN_AS_EXTRACT_SDT_PROBE_OFFSETS: case RUN_AS_MKDIRAT: case RUN_AS_MKDIRAT_RECURSIVE: break; case RUN_AS_MKDIR: case RUN_AS_MKDIR_RECURSIVE: *fd = AT_FDCWD; /* fall-through */ default: return 0; } ret = do_recv_fd(worker->sockpair[1], fd); if (ret < 0) { PERROR("do_recv_fd error"); ret = -1; } return ret; }
static int run_as_cmd(struct run_as_worker *worker, enum run_as_cmd cmd, struct run_as_data *data, uid_t uid, gid_t gid) { ssize_t readlen, writelen; struct run_as_ret recvret; /* * If we are non-root, we can only deal with our own uid. */ if (geteuid() != 0) { if (uid != geteuid()) { recvret.ret = -1; recvret._errno = EPERM; ERR("Client (%d)/Server (%d) UID mismatch (and sessiond is not root)", (int) uid, (int) geteuid()); goto end; } } data->cmd = cmd; data->uid = uid; data->gid = gid; writelen = lttcomm_send_unix_sock(worker->sockpair[0], data, sizeof(*data)); if (writelen < sizeof(*data)) { PERROR("Error writing message to run_as"); recvret.ret = -1; recvret._errno = errno; goto end; } /* receive return value */ readlen = lttcomm_recv_unix_sock(worker->sockpair[0], &recvret, sizeof(recvret)); if (!readlen) { ERR("Run-as worker has hung-up during run_as_cmd"); recvret.ret = -1; recvret._errno = EIO; goto end; } else if (readlen < sizeof(recvret)) { PERROR("Error reading response from run_as"); recvret.ret = -1; recvret._errno = errno; } if (do_recv_fd(worker, cmd, &recvret.ret)) { recvret.ret = -1; recvret._errno = EIO; } end: errno = recvret._errno; return recvret.ret; }
static int recv_fd_from_worker(struct run_as_worker *worker, enum run_as_cmd cmd, int *fd) { int ret = 0; switch (cmd) { case RUN_AS_OPEN: break; default: return 0; } ret = do_recv_fd(worker->sockpair[0], fd); if (ret < 0) { PERROR("do_recv_fd error"); ret = -1; } return ret; }