From 3785276e31dc68ed04ba7d403e5d5ba276f1e606 Mon Sep 17 00:00:00 2001 From: hypercube Date: Fri, 6 Mar 2026 07:24:41 +0000 Subject: [PATCH] updated code --- wallpaperd.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/wallpaperd.c b/wallpaperd.c index 8441e69..099ffdf 100644 --- a/wallpaperd.c +++ b/wallpaperd.c @@ -11,13 +11,17 @@ #include #include #include +#include + +#define LOCK_FILE "/tmp/my_wallpaperd.lock" +#define SOCKET_FILE "/tmp/my_wallpaper.sock" int initServerSockServer() { int server_fd = socket(AF_UNIX, SOCK_STREAM, 0); struct sockaddr_un addr = {0}; addr.sun_family = AF_UNIX; - strcpy(addr.sun_path, "/tmp/my_wallpaper.sock"); + strcpy(addr.sun_path, SOCKET_FILE); unlink(addr.sun_path); if (server_fd < 0) perror("socket"); if (bind(server_fd, (struct sockaddr*)&addr, sizeof(addr)) < 0) perror("bind"); @@ -168,8 +172,25 @@ void handleCommand(char *buff, int n, char** images, size_t image_count){ } } + + int main(int argc, char** argv) { + + int fd = open(LOCK_FILE, O_CREAT | O_RDWR, 0666); printf("INFO: daemon started\n"); + + if (fd == -1) { + perror("ERROR: Failed to open lock file"); + return 1; + } + + if (flock(fd, LOCK_EX | LOCK_NB) == -1) { + fprintf(stderr, "INFO: Another instance is already running.\n"); + fprintf(stderr, "INFO: exiting\n"); + close(fd); + return 1; + } + char** images = NULL; size_t image_count = 0; @@ -182,21 +203,22 @@ int main(int argc, char** argv) { struct stat stat_buffer; if(stat(argv[1], &stat_buffer) != 0){ - printf("dirpath is invalid\n"); + printf("ERROR: dirpath is invalid\n"); return 1; } if(stat(argv[2], &stat_buffer) != 0){ - printf("filepath is invalid\n"); + printf("ERROR: filepath is invalid\n"); return 1; } + static_wallpaper_path = argv[2]; collectImages(argv[1], &images, &image_count); - printf("collected %ld suitable images\n", image_count); + printf("INFO: collected %ld suitable images\n", image_count); shuffleImages(images, image_count); - printf("images shuffled\n"); + printf("INFO: images shuffled\n"); - printf("starting server\n"); + printf("INFO: starting server\n"); int server_fd = initServerSockServer(); setBackgroundImage(images[0]); @@ -212,7 +234,7 @@ int main(int argc, char** argv) { int ret = select(server_fd + 1, &fds, NULL, NULL, &tv); if (ret < 0) { - perror("select\n"); + perror("ERROR: select\n"); break; }