pid_t lxc_cmd_get_init_pid(const char *name, const char *lxcpath)
{
int ret, stopped;
+ intmax_t pid;
struct lxc_cmd_rr cmd = {
.req = {
.cmd = LXC_CMD_GET_INIT_PID
},
.rsp = {
- .data = INT_TO_PTR((int){-1})
+ .data = INTMAX_TO_PTR((intmax_t){-1})
}
};
if (ret < 0)
return -1;
- return PTR_TO_INT(cmd.rsp.data);
+ pid = PTR_TO_INTMAX(cmd.rsp.data);
+ if (pid < 0)
+ return -1;
+
+ /* We need to assume that pid_t can actually hold any pid given to us
+ * by the kernel. If it can't it's a libc bug.
+ */
+ return (pid_t)pid;
}
static int lxc_cmd_get_init_pid_callback(int fd, struct lxc_cmd_req *req,
struct lxc_handler *handler)
{
- struct lxc_cmd_rsp rsp = { .data = INT_TO_PTR(handler->pid) };
+ struct lxc_cmd_rsp rsp = {
+ .data = INTMAX_TO_PTR(handler->pid)
+ };
return lxc_cmd_rsp_send(fd, &rsp);
}
#define PTR_TO_INT(p) ((int)((intptr_t)(p)))
#define INT_TO_PTR(u) ((void *)((intptr_t)(u)))
+#define PTR_TO_INTMAX(p) ((intmax_t)((intptr_t)(p)))
+#define INTMAX_TO_PTR(u) ((void *)((intptr_t)(u)))
+
#endif /* __LXC_MACRO_H */