1 /* $NetBSD: t_sysv.c,v 1.4 2014/03/02 20:13:12 jmmv Exp $ */
4 * Copyright (c) 1999, 2007 The NetBSD Foundation, Inc.
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Jason R. Thorpe of the Numerical Aerospace Simulation Facility,
9 * NASA Ames Research Center, and by Andrew Doran.
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions and the following disclaimer.
16 * 2. Redistributions in binary form must reproduce the above copyright
17 * notice, this list of conditions and the following disclaimer in the
18 * documentation and/or other materials provided with the distribution.
20 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
21 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
24 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 * POSSIBILITY OF SUCH DAMAGE.
34 * Test the SVID-compatible Message Queue facility.
52 #include <sys/param.h>
57 volatile int did_sigsys, did_sigchild;
58 volatile int child_status, child_count;
60 void sigsys_handler(int);
61 void sigchld_handler(int);
65 void print_msqid_ds(struct msqid_ds *, mode_t);
68 void print_semid_ds(struct semid_ds *, mode_t);
71 void print_shmid_ds(struct shmid_ds *, mode_t);
74 #define MESSAGE_TEXT_LEN 256
78 char mtext[MESSAGE_TEXT_LEN];
81 const char *m1_str = "California is overrated.";
82 const char *m2_str = "The quick brown fox jumped over the lazy dog.";
94 key_t msgkey, semkey, shmkey;
99 int val; /* value for SETVAL */
100 struct semid_ds *buf; /* buffer for IPC_{STAT,SET} */
101 u_short *array; /* array for GETALL & SETALL */
105 /* Writes an integer to a file. To be used from the body of the test
106 * cases below to pass any global identifiers to the cleanup routine. */
108 write_int(const char *path, const int value)
112 output = open(path, O_WRONLY | O_CREAT | O_TRUNC, 0600);
113 ATF_REQUIRE_MSG(output != -1, "Failed to create %s", path);
114 write(output, &value, sizeof(value));
119 /* Reads an integer from a file. To be used from the cleanup routines
120 * of the test cases below. */
122 read_int(const char *path)
126 input = open(path, O_RDONLY);
131 ATF_REQUIRE_EQ(read(input, &value, sizeof(value)), sizeof(value));
139 sigsys_handler(int signo)
146 sigchld_handler(int signo)
152 * Reap the child and return its status
154 if (wait(&c_status) == -1)
155 child_status = -errno;
157 child_status = c_status;
162 key_t get_ftok(int id)
165 char token_key[64], token_dir[64];
169 strlcpy(token_key, "/tmp/t_sysv.XXXXXX", sizeof(token_key));
170 tmpdir = mkdtemp(token_key);
171 ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp() failed: %d", errno);
173 strlcpy(token_dir, tmpdir, sizeof(token_dir));
174 strlcpy(token_key, tmpdir, sizeof(token_key));
175 strlcat(token_key, "/token_key", sizeof(token_key));
177 /* Create the file, since ftok() requires it to exist! */
179 fd = open(token_key, O_RDWR | O_CREAT | O_EXCL, 0600);
182 atf_tc_fail("open() of temp file failed: %d", errno);
187 key = ftok(token_key, id);
189 ATF_REQUIRE_MSG(unlink(token_key) != -1, "unlink() failed: %d", errno);
190 ATF_REQUIRE_MSG(rmdir(token_dir) != -1, "rmdir() failed: %d", errno);
195 ATF_TC_WITH_CLEANUP(msg);
199 atf_tc_set_md_var(tc, "timeout", "3");
200 atf_tc_set_md_var(tc, "descr", "Checks sysvmsg passing");
206 struct msqid_ds m_ds;
213 if (atf_tc_get_config_var_as_bool_wd(tc, "ci", false))
214 atf_tc_skip("https://bugs.freebsd.org/233649");
217 * Install a SIGSYS handler so that we can exit gracefully if
218 * System V Message Queue support isn't in the kernel.
221 sa.sa_handler = sigsys_handler;
222 sigemptyset(&sa.sa_mask);
224 ATF_REQUIRE_MSG(sigaction(SIGSYS, &sa, NULL) != -1,
225 "sigaction SIGSYS: %d", errno);
228 * Install a SIGCHLD handler to deal with all possible exit
229 * conditions of the receiver.
233 sa.sa_handler = sigchld_handler;
234 sigemptyset(&sa.sa_mask);
236 ATF_REQUIRE_MSG(sigaction(SIGCHLD, &sa, NULL) != -1,
237 "sigaction SIGCHLD: %d", errno);
239 msgkey = get_ftok(4160);
240 ATF_REQUIRE_MSG(msgkey != (key_t)-1, "get_ftok failed");
242 sender_msqid = msgget(msgkey, IPC_CREAT | 0640);
243 ATF_REQUIRE_MSG(sender_msqid != -1, "msgget: %d", errno);
244 write_int("sender_msqid", sender_msqid);
247 atf_tc_skip("SYSV Message Queue not supported");
251 ATF_REQUIRE_MSG(msgctl(sender_msqid, IPC_STAT, &m_ds) != -1,
252 "msgctl IPC_STAT 1: %d", errno);
254 print_msqid_ds(&m_ds, 0640);
256 m_ds.msg_perm.mode = (m_ds.msg_perm.mode & ~0777) | 0600;
258 ATF_REQUIRE_MSG(msgctl(sender_msqid, IPC_SET, &m_ds) != -1,
259 "msgctl IPC_SET: %d", errno);
261 memset(&m_ds, 0, sizeof(m_ds));
263 ATF_REQUIRE_MSG(msgctl(sender_msqid, IPC_STAT, &m_ds) != -1,
264 "msgctl IPC_STAT 2: %d", errno);
266 ATF_REQUIRE_MSG((m_ds.msg_perm.mode & 0777) == 0600,
267 "IPC_SET of mode didn't hold");
269 print_msqid_ds(&m_ds, 0600);
271 switch ((child_pid = fork())) {
273 atf_tc_fail("fork: %d", errno);
285 for (loop = 0; loop < maxloop; loop++) {
287 * Send the first message to the receiver and wait for the ACK.
290 strlcpy(m.mtext, m1_str, sizeof(m.mtext));
291 ATF_REQUIRE_MSG(msgsnd(sender_msqid, &m, MESSAGE_TEXT_LEN,
292 0) != -1, "sender: msgsnd 1: %d", errno);
294 ATF_REQUIRE_MSG(msgrcv(sender_msqid, &m, MESSAGE_TEXT_LEN,
295 MTYPE_1_ACK, 0) == MESSAGE_TEXT_LEN,
296 "sender: msgrcv 1 ack: %d", errno);
298 print_msqid_ds(&m_ds, 0600);
301 * Send the second message to the receiver and wait for the ACK.
304 strlcpy(m.mtext, m2_str, sizeof(m.mtext));
305 ATF_REQUIRE_MSG(msgsnd(sender_msqid, &m, MESSAGE_TEXT_LEN, 0) != -1,
306 "sender: msgsnd 2: %d", errno);
308 ATF_REQUIRE_MSG(msgrcv(sender_msqid, &m, MESSAGE_TEXT_LEN,
309 MTYPE_2_ACK, 0) == MESSAGE_TEXT_LEN,
310 "sender: msgrcv 2 ack: %d", errno);
314 * Wait for child to finish
316 sigemptyset(&sigmask);
317 (void) sigsuspend(&sigmask);
320 * ...and any other signal is an unexpected error.
323 c_status = child_status;
325 atf_tc_fail("waitpid: %d", -c_status);
326 else if (WIFEXITED(c_status) == 0)
327 atf_tc_fail("child abnormal exit: %d", c_status);
328 else if (WEXITSTATUS(c_status) != 0)
329 atf_tc_fail("c status: %d", WEXITSTATUS(c_status));
331 ATF_REQUIRE_MSG(msgctl(sender_msqid, IPC_STAT, &m_ds)
332 != -1, "msgctl IPC_STAT: %d", errno);
334 print_msqid_ds(&m_ds, 0600);
338 atf_tc_fail("sender: received unexpected signal");
341 ATF_TC_CLEANUP(msg, tc)
346 * Remove the message queue if it exists.
348 sender_msqid = read_int("sender_msqid");
349 if (sender_msqid != -1)
350 if (msgctl(sender_msqid, IPC_RMID, NULL) == -1)
351 err(1, "msgctl IPC_RMID");
355 print_msqid_ds(struct msqid_ds *mp, mode_t mode)
357 uid_t uid = geteuid();
358 gid_t gid = getegid();
360 printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n",
361 mp->msg_perm.uid, mp->msg_perm.gid,
362 mp->msg_perm.cuid, mp->msg_perm.cgid,
363 mp->msg_perm.mode & 0777);
365 printf("qnum %lu, qbytes %lu, lspid %d, lrpid %d\n",
366 mp->msg_qnum, (u_long)mp->msg_qbytes, mp->msg_lspid,
369 printf("stime: %s", ctime(&mp->msg_stime));
370 printf("rtime: %s", ctime(&mp->msg_rtime));
371 printf("ctime: %s", ctime(&mp->msg_ctime));
374 * Sanity check a few things.
377 ATF_REQUIRE_MSG(mp->msg_perm.uid == uid && mp->msg_perm.cuid == uid,
380 ATF_REQUIRE_MSG(mp->msg_perm.gid == gid && mp->msg_perm.cgid == gid,
383 ATF_REQUIRE_MSG((mp->msg_perm.mode & 0777) == mode, "mode mismatch");
392 if ((msqid = msgget(msgkey, 0)) == -1)
393 err(1, "receiver: msgget");
395 for (loop = 0; loop < maxloop; loop++) {
397 * Receive the first message, print it, and send an ACK.
399 if (msgrcv(msqid, &m, MESSAGE_TEXT_LEN, MTYPE_1, 0) != MESSAGE_TEXT_LEN)
400 err(1, "receiver: msgrcv 1");
402 printf("%s\n", m.mtext);
403 if (strcmp(m.mtext, m1_str) != 0)
404 err(1, "receiver: message 1 data isn't correct");
406 m.mtype = MTYPE_1_ACK;
408 if (msgsnd(msqid, &m, MESSAGE_TEXT_LEN, 0) == -1)
409 err(1, "receiver: msgsnd ack 1");
412 * Receive the second message, print it, and send an ACK.
415 if (msgrcv(msqid, &m, MESSAGE_TEXT_LEN, MTYPE_2, 0) != MESSAGE_TEXT_LEN)
416 err(1, "receiver: msgrcv 2");
418 printf("%s\n", m.mtext);
419 if (strcmp(m.mtext, m2_str) != 0)
420 err(1, "receiver: message 2 data isn't correct");
422 m.mtype = MTYPE_2_ACK;
424 if (msgsnd(msqid, &m, MESSAGE_TEXT_LEN, 0) == -1)
425 err(1, "receiver: msgsnd ack 2");
432 * Test the SVID-compatible Semaphore facility.
435 ATF_TC_WITH_CLEANUP(sem);
439 atf_tc_set_md_var(tc, "timeout", "3");
440 atf_tc_set_md_var(tc, "descr", "Checks sysvmsg passing");
447 struct semid_ds s_ds;
454 * Install a SIGSYS handler so that we can exit gracefully if
455 * System V Semaphore support isn't in the kernel.
458 sa.sa_handler = sigsys_handler;
459 sigemptyset(&sa.sa_mask);
461 ATF_REQUIRE_MSG(sigaction(SIGSYS, &sa, NULL) != -1,
462 "sigaction SIGSYS: %d", errno);
465 * Install a SIGCHLD handler to deal with all possible exit
466 * conditions of the receiver.
470 sa.sa_handler = sigchld_handler;
471 sigemptyset(&sa.sa_mask);
473 ATF_REQUIRE_MSG(sigaction(SIGCHLD, &sa, NULL) != -1,
474 "sigaction SIGCHLD: %d", errno);
476 semkey = get_ftok(4160);
477 ATF_REQUIRE_MSG(semkey != (key_t)-1, "get_ftok failed");
479 sender_semid = semget(semkey, 1, IPC_CREAT | 0640);
480 ATF_REQUIRE_MSG(sender_semid != -1, "semget: %d", errno);
481 write_int("sender_semid", sender_semid);
484 atf_tc_skip("SYSV Semaphore not supported");
489 ATF_REQUIRE_MSG(semctl(sender_semid, 0, IPC_STAT, sun) != -1,
490 "semctl IPC_STAT: %d", errno);
492 print_semid_ds(&s_ds, 0640);
494 s_ds.sem_perm.mode = (s_ds.sem_perm.mode & ~0777) | 0600;
497 ATF_REQUIRE_MSG(semctl(sender_semid, 0, IPC_SET, sun) != -1,
498 "semctl IPC_SET: %d", errno);
500 memset(&s_ds, 0, sizeof(s_ds));
503 ATF_REQUIRE_MSG(semctl(sender_semid, 0, IPC_STAT, sun) != -1,
504 "semctl IPC_STAT: %d", errno);
506 ATF_REQUIRE_MSG((s_ds.sem_perm.mode & 0777) == 0600,
507 "IPC_SET of mode didn't hold");
509 print_semid_ds(&s_ds, 0600);
511 for (child_count = 0; child_count < 5; child_count++) {
512 switch ((child_pid = fork())) {
514 atf_tc_fail("fork: %d", errno);
527 * Wait for all of the waiters to be attempting to acquire the
531 i = semctl(sender_semid, 0, GETNCNT);
533 atf_tc_fail("semctl GETNCNT: %d", i);
539 * Now set the thundering herd in motion by initializing the
540 * semaphore to the value 1.
543 ATF_REQUIRE_MSG(semctl(sender_semid, 0, SETVAL, sun) != -1,
544 "sender: semctl SETVAL to 1: %d", errno);
547 * Wait for all children to finish
549 sigemptyset(&sigmask);
551 (void) sigsuspend(&sigmask);
553 c_status = child_status;
555 atf_tc_fail("waitpid: %d", -c_status);
556 else if (WIFEXITED(c_status) == 0)
557 atf_tc_fail("c abnormal exit: %d", c_status);
558 else if (WEXITSTATUS(c_status) != 0)
559 atf_tc_fail("c status: %d",
560 WEXITSTATUS(c_status));
563 ATF_REQUIRE_MSG(semctl(sender_semid, 0,
564 IPC_STAT, sun) != -1,
565 "semctl IPC_STAT: %d", errno);
567 print_semid_ds(&s_ds, 0600);
570 if (child_count <= 0)
574 atf_tc_fail("sender: received unexpected signal");
580 ATF_TC_CLEANUP(sem, tc)
585 * Remove the semaphore if it exists
587 sender_semid = read_int("sender_semid");
588 if (sender_semid != -1)
589 if (semctl(sender_semid, 0, IPC_RMID) == -1)
590 err(1, "semctl IPC_RMID");
594 print_semid_ds(struct semid_ds *sp, mode_t mode)
596 uid_t uid = geteuid();
597 gid_t gid = getegid();
599 printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n",
600 sp->sem_perm.uid, sp->sem_perm.gid,
601 sp->sem_perm.cuid, sp->sem_perm.cgid,
602 sp->sem_perm.mode & 0777);
604 printf("nsems %u\n", sp->sem_nsems);
606 printf("otime: %s", ctime(&sp->sem_otime));
607 printf("ctime: %s", ctime(&sp->sem_ctime));
610 * Sanity check a few things.
613 ATF_REQUIRE_MSG(sp->sem_perm.uid == uid && sp->sem_perm.cuid == uid,
616 ATF_REQUIRE_MSG(sp->sem_perm.gid == gid && sp->sem_perm.cgid == gid,
619 ATF_REQUIRE_MSG((sp->sem_perm.mode & 0777) == mode,
620 "mode mismatch %o != %o", (sp->sem_perm.mode & 0777), mode);
629 if ((semid = semget(semkey, 1, 0)) == -1)
630 err(1, "waiter: semget");
633 * Attempt to acquire the semaphore.
637 s.sem_flg = SEM_UNDO;
639 if (semop(semid, &s, 1) == -1)
640 err(1, "waiter: semop -1");
642 printf("WOO! GOT THE SEMAPHORE!\n");
646 * Release the semaphore and exit.
650 s.sem_flg = SEM_UNDO;
652 if (semop(semid, &s, 1) == -1)
653 err(1, "waiter: semop +1");
659 * Test the SVID-compatible Shared Memory facility.
662 ATF_TC_WITH_CLEANUP(shm);
666 atf_tc_set_md_var(tc, "timeout", "3");
667 atf_tc_set_md_var(tc, "descr", "Checks sysv shared memory");
673 struct shmid_ds s_ds;
680 * Install a SIGSYS handler so that we can exit gracefully if
681 * System V Shared Memory support isn't in the kernel.
684 sa.sa_handler = sigsys_handler;
685 sigemptyset(&sa.sa_mask);
687 ATF_REQUIRE_MSG(sigaction(SIGSYS, &sa, NULL) != -1,
688 "sigaction SIGSYS: %d", errno);
691 * Install a SIGCHLD handler to deal with all possible exit
692 * conditions of the sharer.
696 sa.sa_handler = sigchld_handler;
697 sigemptyset(&sa.sa_mask);
699 ATF_REQUIRE_MSG(sigaction(SIGCHLD, &sa, NULL) != -1,
700 "sigaction SIGCHLD: %d", errno);
702 pgsize = sysconf(_SC_PAGESIZE);
704 shmkey = get_ftok(4160);
705 ATF_REQUIRE_MSG(shmkey != (key_t)-1, "get_ftok failed");
707 ATF_REQUIRE_MSG((sender_shmid = shmget(shmkey, pgsize,
708 IPC_CREAT | 0640)) != -1,
709 "shmget: %d", errno);
710 write_int("sender_shmid", sender_shmid);
712 ATF_REQUIRE_MSG(shmctl(sender_shmid, IPC_STAT, &s_ds) != -1,
713 "shmctl IPC_STAT: %d", errno);
715 print_shmid_ds(&s_ds, 0640);
717 s_ds.shm_perm.mode = (s_ds.shm_perm.mode & ~0777) | 0600;
719 ATF_REQUIRE_MSG(shmctl(sender_shmid, IPC_SET, &s_ds) != -1,
720 "shmctl IPC_SET: %d", errno);
722 memset(&s_ds, 0, sizeof(s_ds));
724 ATF_REQUIRE_MSG(shmctl(sender_shmid, IPC_STAT, &s_ds) != -1,
725 "shmctl IPC_STAT: %d", errno);
727 ATF_REQUIRE_MSG((s_ds.shm_perm.mode & 0777) == 0600,
728 "IPC_SET of mode didn't hold");
730 print_shmid_ds(&s_ds, 0600);
732 shm_buf = shmat(sender_shmid, NULL, 0);
733 ATF_REQUIRE_MSG(shm_buf != (void *) -1, "sender: shmat: %d", errno);
736 * Write the test pattern into the shared memory buffer.
738 strcpy(shm_buf, m2_str);
740 switch ((child_pid = fork())) {
742 atf_tc_fail("fork: %d", errno);
754 * Wait for child to finish
756 sigemptyset(&sigmask);
757 (void) sigsuspend(&sigmask);
760 c_status = child_status;
762 atf_tc_fail("waitpid: %d", -c_status);
763 else if (WIFEXITED(c_status) == 0)
764 atf_tc_fail("c abnormal exit: %d", c_status);
765 else if (WEXITSTATUS(c_status) != 0)
766 atf_tc_fail("c status: %d", WEXITSTATUS(c_status));
768 ATF_REQUIRE_MSG(shmctl(sender_shmid, IPC_STAT,
770 "shmctl IPC_STAT: %d", errno);
772 print_shmid_ds(&s_ds, 0600);
776 atf_tc_fail("sender: received unexpected signal");
780 shmid_cleanup(const char *name)
785 * Remove the shared memory area if it exists.
787 shmid = read_int(name);
789 if (shmctl(shmid, IPC_RMID, NULL) == -1)
790 err(1, "shmctl IPC_RMID");
794 ATF_TC_CLEANUP(shm, tc)
797 shmid_cleanup("sender_shmid");
801 print_shmid_ds(struct shmid_ds *sp, mode_t mode)
803 uid_t uid = geteuid();
804 gid_t gid = getegid();
806 printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n",
807 sp->shm_perm.uid, sp->shm_perm.gid,
808 sp->shm_perm.cuid, sp->shm_perm.cgid,
809 sp->shm_perm.mode & 0777);
811 printf("segsz %lu, lpid %d, cpid %d, nattch %u\n",
812 (u_long)sp->shm_segsz, sp->shm_lpid, sp->shm_cpid,
815 printf("atime: %s", ctime(&sp->shm_atime));
816 printf("dtime: %s", ctime(&sp->shm_dtime));
817 printf("ctime: %s", ctime(&sp->shm_ctime));
820 * Sanity check a few things.
823 ATF_REQUIRE_MSG(sp->shm_perm.uid == uid && sp->shm_perm.cuid == uid,
826 ATF_REQUIRE_MSG(sp->shm_perm.gid == gid && sp->shm_perm.cgid == gid,
829 ATF_REQUIRE_MSG((sp->shm_perm.mode & 0777) == mode, "mode mismatch");
838 shmid = shmget(shmkey, pgsize, 0);
839 ATF_REQUIRE_MSG(shmid != -1, "receiver: shmget:%d", errno);
841 shm_buf = shmat(shmid, NULL, 0);
842 ATF_REQUIRE_MSG(shm_buf != (void *) -1, "receiver: shmat: %d", errno);
844 printf("%s\n", (const char *)shm_buf);
846 ATF_REQUIRE_MSG(strcmp((const char *)shm_buf, m2_str) == 0,
847 "receiver: data isn't correct");
853 ATF_TC_WITH_CLEANUP(shm_remap);
854 ATF_TC_HEAD(shm_remap, tc)
857 atf_tc_set_md_var(tc, "descr", "Checks SHM_REMAP");
860 ATF_TC_BODY(shm_remap, tc)
865 pgsize = sysconf(_SC_PAGESIZE);
867 shmkey = get_ftok(4160);
868 ATF_REQUIRE_MSG(shmkey != (key_t)-1, "get_ftok failed");
870 ATF_REQUIRE_MSG((shmid_remap = shmget(shmkey, pgsize,
871 IPC_CREAT | 0640)) != -1, "shmget: %d", errno);
872 write_int("shmid_remap", shmid_remap);
874 ATF_REQUIRE_MSG((shm_buf = mmap(NULL, pgsize, PROT_READ | PROT_WRITE,
875 MAP_ANON | MAP_PRIVATE, -1, 0)) != MAP_FAILED, "mmap: %d", errno);
877 ATF_REQUIRE_MSG(shmat(shmid_remap, shm_buf, 0) == (void *)-1,
878 "shmat without MAP_REMAP succeeded");
879 ATF_REQUIRE_MSG(shmat(shmid_remap, shm_buf, SHM_REMAP) == shm_buf,
880 "shmat(SHM_REMAP): %d", errno);
883 ATF_TC_CLEANUP(shm_remap, tc)
886 shmid_cleanup("shmid_remap");
888 #endif /* SHM_REMAP */
893 ATF_TP_ADD_TC(tp, msg);
894 ATF_TP_ADD_TC(tp, sem);
895 ATF_TP_ADD_TC(tp, shm);
897 ATF_TP_ADD_TC(tp, shm_remap);
900 return atf_no_error();