Module Name: src Committed By: pgoyette Date: Tue Nov 6 18:31:53 UTC 2012
Modified Files: src/tests/kernel: t_sysv.c Log Message: Replace the atexit() routines with ATF_TC_CLEANUP() Factor out the generation of token_keys to a separate routine, called from each test case. And make sure we remove the mkdtemp()-created directory after we're finished with it. To generate a diff of this commit: cvs rdiff -u -r1.1 -r1.2 src/tests/kernel/t_sysv.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/tests/kernel/t_sysv.c diff -u src/tests/kernel/t_sysv.c:1.1 src/tests/kernel/t_sysv.c:1.2 --- src/tests/kernel/t_sysv.c:1.1 Mon Nov 5 04:09:14 2012 +++ src/tests/kernel/t_sysv.c Tue Nov 6 18:31:53 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: t_sysv.c,v 1.1 2012/11/05 04:09:14 pgoyette Exp $ */ +/* $NetBSD: t_sysv.c,v 1.2 2012/11/06 18:31:53 pgoyette Exp $ */ /*- * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc. @@ -59,16 +59,15 @@ volatile int child_status, child_count; void sigsys_handler(int); void sigchld_handler(int); +key_t get_ftok(int); + void print_msqid_ds(struct msqid_ds *, mode_t); -void cleanup_msg(void); void receiver(void); void print_semid_ds(struct semid_ds *, mode_t); -void cleanup_sem(void); void waiter(void); void print_shmid_ds(struct shmid_ds *, mode_t); -void cleanup_shm(void); void sharer(void); #define MESSAGE_TEXT_LEN 256 @@ -94,8 +93,6 @@ int sender_semid = -1; int sender_shmid = -1; pid_t child_pid; -char token_key[64]; - key_t msgkey, semkey, shmkey; int maxloop = 1; @@ -131,7 +128,40 @@ sigchld_handler(int signo) child_count--; } -ATF_TC(msg); +key_t get_ftok(int id) +{ + int fd; + char token_key[64], token_dir[64]; + char *tmpdir; + key_t key; + + strlcpy(token_key, "/tmp/t_sysv.XXXXXX", sizeof(token_key)); + tmpdir = mkdtemp(token_key); + ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp() failed: %d", errno); + + strlcpy(token_dir, tmpdir, sizeof(token_dir)); + strlcpy(token_key, tmpdir, sizeof(token_key)); + strlcat(token_key, "/token_key", sizeof(token_key)); + + /* Create the file, since ftok() requires it to exist! */ + + fd = open(token_key, O_RDWR | O_CREAT | O_EXCL); + if (fd == -1) { + rmdir(tmpdir); + atf_tc_fail("open() of temp file failed: %d", errno); + return (key_t)-1; + } else + close(fd); + + key = ftok(token_key, id); + + ATF_REQUIRE_MSG(unlink(token_key) != -1, "unlink() failed: %d", errno); + ATF_REQUIRE_MSG(rmdir(token_dir) != -1, "rmdir() failed: %d", errno); + + return key; +} + +ATF_TC_WITH_CLEANUP(msg); ATF_TC_HEAD(msg, tc) { @@ -171,20 +201,8 @@ ATF_TC_BODY(msg, tc) ATF_REQUIRE_MSG(sigaction(SIGCHLD, &sa, NULL) != -1, "sigaction SIGCHLD: %d", errno); - msgkey = ftok(token_key, 4160); - ATF_REQUIRE_MSG(msgkey != (key_t)-1, "ftok failed"); - - /* - * Initialize child_pid to ourselves so that the cleanup function - * works before we create the receiver. - */ - child_pid = getpid(); - - /* - * Make sure that when the sender exits, the message queue is - * removed. - */ - ATF_REQUIRE_MSG(atexit(cleanup_msg) != -1, "atexit:%d", errno); + msgkey = get_ftok(4160); + ATF_REQUIRE_MSG(msgkey != (key_t)-1, "get_ftok failed"); sender_msqid = msgget(msgkey, IPC_CREAT | 0640); ATF_REQUIRE_MSG(sender_msqid != -1, "msgget: %d", errno); @@ -284,17 +302,16 @@ ATF_TC_BODY(msg, tc) atf_tc_fail("sender: received unexpected signal"); } -void -cleanup_msg() +ATF_TC_CLEANUP(msg, tc) { /* - * If we're the sender, and it exists, remove the message queue. + * Remove the message queue if it exists. */ - if (child_pid != 0 && sender_msqid != -1) { - if (msgctl(sender_msqid, IPC_RMID, NULL) == -1) - warn("msgctl IPC_RMID"); - } + if (sender_msqid != -1) + ATF_REQUIRE_MSG(msgctl(sender_msqid, IPC_RMID, NULL) != -1, + "msgctl IPC_RMID: %d", errno); + sender_msqid = -1; } void @@ -380,7 +397,7 @@ receiver() * Test the SVID-compatible Semaphore facility. */ -ATF_TC(sem); +ATF_TC_WITH_CLEANUP(sem); ATF_TC_HEAD(sem, tc) { @@ -420,20 +437,8 @@ ATF_TC_BODY(sem, tc) ATF_REQUIRE_MSG(sigaction(SIGCHLD, &sa, NULL) != -1, "sigaction SIGCHLD: %d", errno); - semkey = ftok(token_key, 4160); - ATF_REQUIRE_MSG(semkey != (key_t)-1, "ftok failed"); - - /* - * Initialize child_pid to ourselves to that the cleanup function - * works before we create the receiver. - */ - child_pid = getpid(); - - /* - * Make sure that when the sender exits, the message queue is - * removed. - */ - ATF_REQUIRE_MSG(atexit(cleanup_sem) != -1, "atexit: %d", errno); + semkey = get_ftok(4160); + ATF_REQUIRE_MSG(semkey != (key_t)-1, "get_ftok failed"); sender_semid = semget(semkey, 1, IPC_CREAT | 0640); ATF_REQUIRE_MSG(sender_semid != -1, "semget: %d", errno); @@ -535,17 +540,16 @@ ATF_TC_BODY(sem, tc) } } -void -cleanup_sem() +ATF_TC_CLEANUP(sem, tc) { /* - * If we're the sender, and it exists, remove the message queue. + * Remove the semaphore if it exists */ - if (child_pid != 0 && sender_semid != -1) { + if (sender_semid != -1) ATF_REQUIRE_MSG(semctl(sender_semid, 0, IPC_RMID) != -1, "semctl IPC_RMID: %d", errno); - } + sender_semid = -1; } void @@ -619,7 +623,7 @@ waiter() * Test the SVID-compatible Shared Memory facility. */ -ATF_TC(shm); +ATF_TC_WITH_CLEANUP(shm); ATF_TC_HEAD(shm, tc) { @@ -660,21 +664,8 @@ ATF_TC_BODY(shm, tc) pgsize = sysconf(_SC_PAGESIZE); - shmkey = ftok(token_key, 4160); - ATF_REQUIRE_MSG(shmkey != (key_t)-1, "ftok failed"); - - /* - * Initialize child_pid to ourselves to that the cleanup function - * works before we create the receiver. - */ - child_pid = getpid(); - - /* - * Make sure that when the sender exits, the message queue is - * removed. - */ - ATF_REQUIRE_MSG(atexit(cleanup_shm) != -1, - "atexit: %d", errno); + shmkey = get_ftok(4160); + ATF_REQUIRE_MSG(shmkey != (key_t)-1, "get_ftok failed"); ATF_REQUIRE_MSG((sender_shmid = shmget(shmkey, pgsize, IPC_CREAT | 0640)) != -1, @@ -747,17 +738,16 @@ ATF_TC_BODY(shm, tc) atf_tc_fail("sender: received unexpected signal"); } -void -cleanup_shm() +ATF_TC_CLEANUP(shm, tc) { /* - * If we're the sender, and it exists, remove the shared memory area. + * Remove the shared memory area if it exists. */ - if (child_pid != 0 && sender_shmid != -1) { - if (shmctl(sender_shmid, IPC_RMID, NULL) == -1) - warn("shmctl IPC_RMID"); - } + if (sender_shmid != -1) + ATF_REQUIRE_MSG(shmctl(sender_shmid, IPC_RMID, NULL) != -1, + "shmctl IPC_RMID: %d", errno); + sender_shmid = -1; } void @@ -816,21 +806,6 @@ sharer() ATF_TP_ADD_TCS(tp) { - int fd; - char *tmpdir; - - strlcpy(token_key, "/tmp/t_sysv.XXXXXX", sizeof(token_key)); - if ((tmpdir = mkdtemp(token_key)) == NULL) - errx(1,"Failed to get a temp dirname for use as a key!"); - strlcpy(token_key, tmpdir, sizeof(token_key)); - strlcat(token_key, "token_key", sizeof(token_key)); - - /* Create the file, since ftok() requires it to exist! */ - - if ((fd = open(token_key, O_RDWR | O_CREAT | O_EXCL)) == -1) - errx(1, "Failed to create ftok file: %s\n", strerror(errno)); - else - close(fd); ATF_TP_ADD_TC(tp, msg); ATF_TP_ADD_TC(tp, sem);