#include #include #include #include #include #include #include const char sockpath[] = "/tmp/sockperm_test"; int main(int argc, char **argv) { int server_fd, client_fd; struct sockaddr_un addr; memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, sockpath); server_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (server_fd < 0) { perror("socket"); return 1; } if (bind(server_fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) { perror("bind"); return 1; } if (chmod(sockpath, 0) != 0) { perror("chmod"); return 1; } if (listen(server_fd, 0) != 0) { perror("listen"); return 1; } client_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (client_fd < 0) { perror("socket"); return 1; } if (connect(client_fd, (struct sockaddr *) &addr, sizeof(addr)) == 0) puts("connect: unexpected non-failure"); else if (errno == EACCES) puts("connect: normal behavior (EACCES)"); else perror("connect: unexpected failure"); if (unlink(sockpath) != 0) { perror("unlink"); return 1; } return 0; }