#include #include #include #include #include #include #include #include #include #include int main(int argc, char *argv[]) { char *path; int sock_fd; struct sockaddr_un addr; struct stat sb_before; struct stat sb_after; if (argc != 2) { fprintf(stderr, "usage: socket_utimes path\n"); exit(EXIT_FAILURE); } path = argv[1]; sock_fd = socket(AF_UNIX, SOCK_STREAM, 0); if (sock_fd == -1) { fprintf(stderr, "socket: %s\n", strerror(errno)); exit(EXIT_FAILURE); } memset(&addr, 0, sizeof(addr)); addr.sun_family = AF_UNIX; strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1); #ifndef SUN_LEN #define SUN_LEN(su) \ (sizeof(*(su)) - sizeof((su)->sun_path) + strlen((su)->sun_path)) #endif if (bind(sock_fd, (struct sockaddr *) &addr, SUN_LEN(&addr)) == -1) { fprintf(stderr, "bind: %s\n", strerror(errno)); exit(EXIT_FAILURE); } if (stat(path, &sb_before) == -1) { fprintf(stderr, "stat: %s: %s\n", path, strerror(errno)); (void) unlink(path); exit(EXIT_FAILURE); } sleep(2); if (utimes(path, (struct timeval *) 0) == -1) { fprintf(stderr, "utimes: %s: %s\n", path, strerror(errno)); (void) unlink(path); exit(EXIT_FAILURE); } if (stat(path, &sb_after) == -1) { fprintf(stderr, "stat: %s: %s\n", path, strerror(errno)); (void) unlink(path); exit(EXIT_FAILURE); } if (sb_before.st_mtime == sb_after.st_mtime) { printf("Oops: utimes() failed to change mtime\n"); (void) unlink(path); exit(EXIT_FAILURE); } printf("utimes() successfully changed a Unix domain socket mtime.\n"); (void) unlink(path); exit(EXIT_SUCCESS); }