From 02e1879da14cd64ba2181516808fdc617aa11e14 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Thu, 16 Apr 2015 01:13:54 +0200 Subject: use a file for keys MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/cmdline.c | 86 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 29 deletions(-) diff --git a/src/cmdline.c b/src/cmdline.c index a5af8f1..7ee8c0c 100644 --- a/src/cmdline.c +++ b/src/cmdline.c @@ -1,3 +1,4 @@ +#define _XOPEN_SOURCE 700 #include #include #include @@ -28,7 +29,7 @@ union semun { #define MEMORY_SIZE (2 * 1024) -#define open_semaphore(key) ((sem_id = semget(key, SEMAPHORES, 0600)) == -1 ? -1 : 0) +#define open_semaphore() ((sem_id = semget(key_sem, SEMAPHORES, 0600)) == -1 ? -1 : 0) #define acquire_semaphore(semaphore, delta, undo) semaphore_op(semaphore, -delta, undo) #define release_semaphore(semaphore, delta, undo) semaphore_op(semaphore, +delta, undo) #define zero_semaphore(semaphore) semaphore_op(semaphore, 0, 0) @@ -41,13 +42,41 @@ union semun { char *argv0; static int sem_id = -1; +static key_t key_sem = -1; +static key_t key_shm = -1; +static int +get_keys(void) +{ + int saved_errno; + char *line; + size_t len; + + line = NULL, len = 0; + t(getline(&line, &len, stdin)); + t(key_sem = (key_t)atoll(line)); + free(line); + + line = NULL, len = 0; + t(getline(&line, &len, stdin)); + t(key_sem = (key_t)atoll(line)); + free(line); + + return 0; + +fail: + saved_errno = errno; + free(line); + errno = saved_errno; + return -1; +} + + static int create_semaphores(void) { - key_t key; int id = -1, saved_errno; union semun values; @@ -58,10 +87,10 @@ create_semaphores(void) double r = (double)rand(); r /= (double)RAND_MAX + 1; r *= (1 << (8 * sizeof(key_t) - 2)) - 1; - key = (key_t)r + 1; - if (key == IPC_PRIVATE) + key_sem = (key_t)r + 1; + if (key_sem == IPC_PRIVATE) continue; - id = semget(key, SEMAPHORES, IPC_CREAT | IPC_EXCL | 0600); + id = semget(key_sem, SEMAPHORES, IPC_CREAT | IPC_EXCL | 0600); if (id != -1) break; if ((errno != EEXIST) && (errno != EINTR)) @@ -78,7 +107,7 @@ create_semaphores(void) free(values.array); values.array = NULL; - printf("key:%zi(x%zx), id:%i\n", (ssize_t)key, (size_t)key, id); + printf("%zi\n", (ssize_t)key_sem); return 0; fail: @@ -94,7 +123,6 @@ fail: static int create_shared_memory(void) { - key_t key; int id = -1, saved_errno; struct shmid_ds _info; @@ -103,17 +131,17 @@ create_shared_memory(void) double r = (double)rand(); r /= (double)RAND_MAX + 1; r *= (1 << (8 * sizeof(key_t) - 2)) - 1; - key = (key_t)r + 1; - if (key == IPC_PRIVATE) + key_shm = (key_t)r + 1; + if (key_shm == IPC_PRIVATE) continue; - id = shmget(key, MEMORY_SIZE, IPC_CREAT | IPC_EXCL | 0600); + id = shmget(key_shm, MEMORY_SIZE, IPC_CREAT | IPC_EXCL | 0600); if (id != -1) break; if ((errno != EEXIST) && (errno != EINTR)) goto fail; } - printf("key:%zi(x%zx), id:%i\n", (ssize_t)key, (size_t)key, id); + printf("%zi\n", (ssize_t)key_shm); return 0; fail: @@ -126,18 +154,18 @@ fail: static int -remove_semaphores(key_t key) +remove_semaphores(void) { - int id = semget(key, SEMAPHORES, 0600); + int id = semget(key_shm, SEMAPHORES, 0600); return ((id == -1) || (semctl(id, 0, IPC_RMID) == -1)) ? -1 : 0; } static int -remove_shared_memory(key_t key) +remove_shared_memory(void) { struct shmid_ds _info; - int id = shmget(key, MEMORY_SIZE, 0600); + int id = shmget(key_shm, MEMORY_SIZE, 0600); return ((id == -1) || (shmctl(sem_id, IPC_RMID, &_info) == -1)) ? -1 : 0; } @@ -164,12 +192,12 @@ write_semaphore(int semaphore, int value) static int -read_shared_memory(key_t key, char *message) +read_shared_memory(char *message) { int id, saved_errno; void *address = NULL; - t(shmget(key, MEMORY_SIZE, 0600)); + t(shmget(key_shm, MEMORY_SIZE, 0600)); address = shmat(id, NULL, SHM_RDONLY); if ((address == (void *)-1) || !address) goto fail; @@ -187,12 +215,12 @@ fail: static int -write_shared_memory(key_t key, const char *message) +write_shared_memory(const char *message) { int id, saved_errno; void *address = NULL; - t(id = shmget(key, MEMORY_SIZE, 0600)); + t(id = shmget(key_shm, MEMORY_SIZE, 0600)); address = shmat(id, NULL, 0); if ((address == (void *)-1) || !address) goto fail; @@ -212,10 +240,7 @@ fail: int main(int argc, char *argv[]) { - int saved_errno; - key_t key_sem = argc > 2 ? (key_t)atoll(argv[2]) : 0; - key_t key_shm = argc > 3 ? (key_t)atoll(argv[3]) : 0; - const char *message = argc > 4 ? argv[4] : "default message"; + const char *message = argc > 2 ? argv[2] : "default message"; char read_message[MEMORY_SIZE]; argv0 = *argv; @@ -226,16 +251,18 @@ main(int argc, char *argv[]) t(create_shared_memory()); } else if (!strcmp(argv[1], "remove")) { - t(remove_semaphores(key_sem)); - t(remove_shared_memory(key_shm)); + t(get_keys()); + t(remove_semaphores()); + t(remove_shared_memory()); } else if (!strcmp(argv[1], "listen")) { - t(open_semaphore(key_sem)); + t(get_keys()); + t(open_semaphore()); t(release_semaphore(S, 1, 1)); for (;;) { t(release_semaphore(Q, 1, 0)); t(zero_semaphore(Q)); - t(read_shared_memory(key_shm, read_message)); + t(read_shared_memory(read_message)); printf("%s\n", read_message); t(release_semaphore(W, 1, 1)); t(acquire_semaphore(S, 1, 1)); @@ -245,10 +272,11 @@ main(int argc, char *argv[]) } } else if (!strcmp(argv[1], "broadcast")) { - t(open_semaphore(key_sem)); + t(get_keys()); + t(open_semaphore()); t(acquire_semaphore(X, 1, 1)); t(zero_semaphore(W)); - t(write_shared_memory(key_shm, message)); + t(write_shared_memory(message)); t(write_semaphore(Q, 0)); t(zero_semaphore(S)); t(release_semaphore(X, 1, 1)); -- cgit v1.2.3-70-g09d2