/* test of auth_user/server authenticate: recv part */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include #include #include #include #include #include #include #include #include #include #include #include #define SOCK_PATH "auth_socket" int main (void) { __uid_t euids_buf[CMGROUP_MAX], auids_buf[CMGROUP_MAX]; __uid_t *euids = euids_buf, *auids = auids_buf; __gid_t egids_buf[CMGROUP_MAX], agids_buf[CMGROUP_MAX]; __gid_t *egids = egids_buf, *agids = agids_buf; size_t neuids = CMGROUP_MAX, nauids = CMGROUP_MAX; size_t negids = CMGROUP_MAX, nagids = CMGROUP_MAX; mach_port_t rendezvous; mach_port_t newport = MACH_PORT_NULL; error_t err; int sfd; struct sockaddr_un addr = { 0 }; ssize_t nr; char rbuf[30]; /* Create socket bound to well-known address */ err = remove (SOCK_PATH); if (err == -1 && errno != ENOENT) { perror ("remove"); exit(EXIT_FAILURE); } addr.sun_family = AF_UNIX; strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path) - 1); sfd = socket (AF_UNIX, SOCK_DGRAM, 0); if (sfd == -1) { perror ("socket"); exit(EXIT_FAILURE); } printf("auth_recv.c: Socket file descriptor = %d\n", sfd); err = bind (sfd, (struct sockaddr *) &addr, sizeof(struct sockaddr_un)); if (err == -1) { close(sfd); perror ("bind"); exit(EXIT_FAILURE); } printf ("auth_recv.c: Receiving via datagram socket\n"); /* Receive data */ nr = recv (sfd, rbuf, 4, 0); if (nr == -1) { perror ("recv"); exit(EXIT_FAILURE); } printf("auth_recv.c: recv() returned %ld bytes\n", (long) nr); rendezvous = atoi (rbuf); if (nr > 0) printf("auth_recv.c: Received data = %d\n", (int)rendezvous); if (MACH_PORT_VALID (rendezvous)) printf ("auth_recv.c: rendezvous valid\n"); else printf ("auth_recv.c: rendezvous not valid\n"); err = mach_port_mod_refs (mach_task_self (), rendezvous, MACH_PORT_RIGHT_SEND, +1); if (err) { printf ("auth_recv.c: mach_port_mod_refs() err = %d\n", err); mach_port_deallocate (mach_task_self (), rendezvous); goto out; } do err = __USEPORT (AUTH, auth_server_authenticate (port, rendezvous, MACH_MSG_TYPE_COPY_SEND, newport, MACH_MSG_TYPE_COPY_SEND, &euids, &neuids, &auids, &nauids, &egids, &negids, &agids, &nagids)); while (err == EINTR); mach_port_deallocate (mach_task_self (), rendezvous); mach_port_deallocate (mach_task_self (), newport); if (err) goto out; /* Print *id */ printf("auth_recv.c: Received ids: auid=%ld, euid=%ld, agid=%ld, egid=%ld\n", (long) euids[0], (long) auids[0], (long) egids[0], (long) agids[0]); out: printf ("auth_recv.c: err = %d\n", err); return err; }