X-Git-Url: http://git.tuebingen.mpg.de/?p=dss.git;a=blobdiff_plain;f=ipc.c;h=9b38c1318541d24a5686c76eccfc330a3a204177;hp=c55554c5d3fd815cd09c045a94f7b72d5bd5db85;hb=HEAD;hpb=ae647da612e0edfb607a4fdb251983d6405f6b00 diff --git a/ipc.c b/ipc.c index c55554c..9b38c13 100644 --- a/ipc.c +++ b/ipc.c @@ -1,3 +1,5 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + #include #include #include @@ -203,7 +205,7 @@ static int dss_realpath(const char *name, char **resolved_path) /* Careful here, end may be a pointer into extra_buf... */ memmove(&extra_buf[n], end, len + 1); - name = end = memcpy(extra_buf, buf, n); + end = memcpy(extra_buf, buf, n); if (buf[0] == '/') /* It's an absolute symlink */ dest = rpath + 1; @@ -258,11 +260,11 @@ static int get_key_or_die(const char *config_file) return ret; } -static int mutex_get(int key, int flags) +static int mutex_get(key_t key, int flags) { int ret; - DSS_DEBUG_LOG(("getting semaphore 0x%x\n", key)); + DSS_DEBUG_LOG(("getting semaphore 0x%lx\n", (long)key)); ret = semget(key, 2, flags); if (ret < 0) return -ERRNO_TO_DSS_ERROR(errno); @@ -282,31 +284,6 @@ static int do_semop(int id, struct sembuf *sops, int num) return -ERRNO_TO_DSS_ERROR(errno); } -static int mutex_lock(int id) -{ - struct sembuf sops[4]; - - DSS_DEBUG_LOG(("locking\n")); - - sops[0].sem_num = 0; - sops[0].sem_op = 0; - sops[0].sem_flg = SEM_UNDO | IPC_NOWAIT; - - sops[1].sem_num = 0; - sops[1].sem_op = 1; - sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT; - - sops[2].sem_num = 1; - sops[2].sem_op = 0; - sops[2].sem_flg = SEM_UNDO | IPC_NOWAIT; - - sops[3].sem_num = 1; - sops[3].sem_op = 1; - sops[3].sem_flg = SEM_UNDO | IPC_NOWAIT; - - return do_semop(id, sops, 4); -} - static bool mutex_is_locked(int id) { struct sembuf sops; @@ -326,23 +303,44 @@ static bool mutex_is_locked(int id) int lock_dss(char *config_file) { - int ret, key = get_key_or_die(config_file); + int ret, id; + struct sembuf sops[4]; + key_t key = get_key_or_die(config_file); ret = mutex_get(key, IPC_CREAT | 0600); if (ret < 0) return ret; - return mutex_lock(ret); + id = ret; + + sops[0].sem_num = 0; + sops[0].sem_op = 0; + sops[0].sem_flg = SEM_UNDO | IPC_NOWAIT; + + sops[1].sem_num = 0; + sops[1].sem_op = 1; + sops[1].sem_flg = SEM_UNDO | IPC_NOWAIT; + + sops[2].sem_num = 1; + sops[2].sem_op = 0; + sops[2].sem_flg = SEM_UNDO | IPC_NOWAIT; + + sops[3].sem_num = 1; + sops[3].sem_op = 1; + sops[3].sem_flg = SEM_UNDO | IPC_NOWAIT; + + return do_semop(id, sops, 4); } int get_dss_pid(char *config_file, pid_t *pid) { - int ret, semid, key = get_key_or_die(config_file); + int ret, semid; + key_t key = get_key_or_die(config_file); if (pid) *pid = 0; ret = mutex_get(key, 0); if (ret < 0) - return ret; + return ret == -ERRNO_TO_DSS_ERROR(ENOENT)? -E_NOT_RUNNING : ret; semid = ret; ret = semctl(semid, 1, GETPID); if (ret < 0)