int userlist_clnt_control(struct userlist_clnt *clnt, int cmd) { struct userlist_packet *out = 0; struct userlist_packet *in = 0; size_t out_size = 0, in_size = 0; void *void_in = 0; int r; out_size = sizeof(*out); out = alloca(out_size); memset(out, 0, out_size); out->id = cmd; if ((r = userlist_clnt_send_packet(clnt, out_size, out)) < 0) return r; r = silent_recv_packet(clnt, &in_size, &void_in); if (r == -ULS_ERR_UNEXPECTED_EOF) return 0; if (r < 0) return r; if (in_size != sizeof(*in)) { r = -ULS_ERR_PROTOCOL; } else { in = (struct userlist_packet*) void_in; r = in->id; } xfree(void_in); return r; }
int super_clnt_control(int sock_fd, int cmd) { struct prot_super_packet *out = 0; struct prot_super_packet *in = 0; size_t out_size; int r; if (sock_fd < 0) return -SSERV_ERR_NOT_CONNECTED; out_size = sizeof(*out); out = alloca(out_size); memset(out, 0, out_size); out->id = cmd; out->magic = PROT_SUPER_PACKET_MAGIC; in = (struct prot_super_packet*) alloca(sizeof(*in)); memset(in, 0, sizeof(*in)); if ((r = super_clnt_send_packet(sock_fd, out_size, out)) < 0) return r; r = silent_recv_packet(sock_fd, in); if (r == -SSERV_ERR_EOF_FROM_SERVER) return 0; if (r < 0) return r; if (in->id >= 0) { return -SSERV_ERR_PROTOCOL_ERROR; } return in->id; }