static int prepare_ipc_var(int pid) { int fd, ret; IpcVarEntry *var; pr_info("Restoring IPC variables\n"); fd = open_image(CR_FD_IPC_VAR, O_RSTR, pid); if (fd < 0) return -1; ret = pb_read_one(fd, &var, PB_IPC_VAR); close_safe(&fd); if (ret <= 0) { pr_err("Failed to read IPC namespace variables\n"); return -EFAULT; } ipc_sysctl_req(var, CTL_PRINT); ret = ipc_sysctl_req(var, CTL_WRITE); ipc_var_entry__free_unpacked(var, NULL); if (ret < 0) { pr_err("Failed to prepare IPC namespace variables\n"); return -EFAULT; } return 0; }
static int dump_ipc_var(struct cr_img *img) { IpcVarEntry var = IPC_VAR_ENTRY__INIT; int ret = -1; var.n_sem_ctls = 4; var.sem_ctls = xmalloc(pb_repeated_size(&var, sem_ctls)); if (!var.sem_ctls) goto err; ret = ipc_sysctl_req(&var, CTL_READ); if (ret < 0) { pr_err("Failed to read IPC variables\n"); goto err; } ret = pb_write_one(img, &var, PB_IPC_VAR); if (ret < 0) { pr_err("Failed to write IPC variables\n"); goto err; } err: xfree(var.sem_ctls); return ret; }