#include #include #include #include #include #include #include #include #define NAME "/tmp/socket" #define SZ 106 int main(int argc, char **argv) { int sock, msgsock; ssize_t rval; int one = 1; struct sockaddr_un server, client; char buf[1024]; sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock == -1) err(EXIT_FAILURE, "opening stream socket"); memset(&server, 0, sizeof(server)); server.sun_family = AF_UNIX; strlcpy(server.sun_path, NAME, sizeof(server.sun_path)); server.sun_len = SUN_LEN(&server); (void)setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one)); (void) unlink(NAME); if (bind(sock, (struct sockaddr *) &server, server.sun_len)) { perror("binding stream socket"); exit(1); } printf("server: Socket has name %s\n", server.sun_path); printf("server: Socket has path length %zu\n", sizeof(server.sun_path)); listen(sock, 5); for (;;) { socklen_t len = sizeof(client); uid_t uid; gid_t gid; memset(&client, 0, sizeof(client)); client.sun_len = len; msgsock = accept(sock, (struct sockaddr *)&client, &len); if (msgsock == -1) { warn("accept"); continue; } printf("\nserver: From accept():\n"); printf("server: sun_len = %u\n", client.sun_len); printf("server: sun_family = %u\n", client.sun_family); printf("server: strlen(sun_path) = %zu\n", strlen(client.sun_path)); printf("server: sun_path = '%s'\n", client.sun_path); len = sizeof(client); memset(&client, 0, sizeof(client)); client.sun_len = len; getsockname(msgsock, (struct sockaddr *)&client, &len); printf("\nserver: From getsockname():\n"); printf("server: sun_len = %u\n", client.sun_len); printf("server: sun_family = %u\n", client.sun_family); printf("server: strlen(sun_path) = %zu\n", strlen(client.sun_path)); printf("server: sun_path = '%s'\n", client.sun_path); len = sizeof(client); memset(&client, 0, sizeof(client)); if (getpeername(msgsock, (struct sockaddr *)&client, &len) == 0) { printf("\nserver: From getpeername():\n"); printf("server: sun_len = %u\n", client.sun_len); printf("server: sun_family = %u\n", client.sun_family); printf("server: strlen(sun_path) = %zu\n", strlen(client.sun_path)); printf("server: sun_path = '%s'\n", client.sun_path); } else { warn("getpeername"); } { struct unpcbid cred; len = sizeof(cred); if (getsockopt(msgsock, 0, LOCAL_PEEREID, &cred, &len) == -1) warn("getsockopt()"); else printf("server: Peer uid = %u, gid = %u, pid = %u\n", cred.unp_euid, cred.unp_egid, cred.unp_pid); } #if 0 if (getpeereid(msgsock, &uid, &gid) < 0) warn("getpeereid()"); else printf("server: Peer uid = %u, gid = %u\n", uid, gid); #endif do { memset(buf, 0, sizeof(buf)); if ((rval = read(msgsock, buf, 1024)) < 0) warn("reading stream message"); else if (rval == 0) printf("server: Ending connection\n"); else printf("server: -->%s\n", buf); } while (rval > 0); close(msgsock); } close(sock); unlink(NAME); return 0; }