2 * Copyright (c) 2018 Aniket Pandey
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
19 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 #include <sys/types.h>
48 typedef struct msgstr msgstr_t;
52 static int msqid, shmid, semid;
53 static union semun semarg;
54 static struct pollfd fds[1];
55 static struct msqid_ds msgbuff;
56 static struct shmid_ds shmbuff;
57 static struct semid_ds sembuff;
58 static char ipcregex[BUFFSIZE];
59 static const char *auclass = "ip";
60 static unsigned short semvals[BUFFSIZE];
63 ATF_TC_WITH_CLEANUP(msgget_success);
64 ATF_TC_HEAD(msgget_success, tc)
66 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
70 ATF_TC_BODY(msgget_success, tc)
72 FILE *pipefd = setup(fds, auclass);
73 /* Create a message queue and obtain the corresponding identifier */
74 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
75 /* Check the presence of message queue ID in audit record */
76 snprintf(ipcregex, sizeof(ipcregex),
77 "msgget.*return,success,%d", msqid);
78 check_audit(fds, ipcregex, pipefd);
80 /* Destroy the message queue with ID = msqid */
81 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
84 ATF_TC_CLEANUP(msgget_success, tc)
90 ATF_TC_WITH_CLEANUP(msgget_failure);
91 ATF_TC_HEAD(msgget_failure, tc)
93 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
97 ATF_TC_BODY(msgget_failure, tc)
99 const char *regex = "msgget.*return,failure.*No such file or directory";
100 FILE *pipefd = setup(fds, auclass);
101 ATF_REQUIRE_EQ(-1, msgget((key_t)(-1), 0));
102 check_audit(fds, regex, pipefd);
105 ATF_TC_CLEANUP(msgget_failure, tc)
111 ATF_TC_WITH_CLEANUP(msgsnd_success);
112 ATF_TC_HEAD(msgsnd_success, tc)
114 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
118 ATF_TC_BODY(msgsnd_success, tc)
120 /* Create a message queue and obtain the corresponding identifier */
121 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
123 /* Initialize a msgstr_t structure to store message */
126 memset(msg.mtext, 0, BUFFSIZE);
128 /* Check the presence of message queue ID in audit record */
129 snprintf(ipcregex, sizeof(ipcregex),
130 "msgsnd.*Message IPC.*%d.*return,success", msqid);
132 FILE *pipefd = setup(fds, auclass);
133 ATF_REQUIRE_EQ(0, msgsnd(msqid, &msg, BUFFSIZE, IPC_NOWAIT));
134 check_audit(fds, ipcregex, pipefd);
136 /* Destroy the message queue with ID = msqid */
137 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
140 ATF_TC_CLEANUP(msgsnd_success, tc)
146 ATF_TC_WITH_CLEANUP(msgsnd_failure);
147 ATF_TC_HEAD(msgsnd_failure, tc)
149 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
153 ATF_TC_BODY(msgsnd_failure, tc)
155 const char *regex = "msgsnd.*Message IPC.*return,failure : Bad address";
156 FILE *pipefd = setup(fds, auclass);
157 ATF_REQUIRE_EQ(-1, msgsnd(-1, NULL, 0, IPC_NOWAIT));
158 check_audit(fds, regex, pipefd);
161 ATF_TC_CLEANUP(msgsnd_failure, tc)
167 ATF_TC_WITH_CLEANUP(msgrcv_success);
168 ATF_TC_HEAD(msgrcv_success, tc)
170 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
174 ATF_TC_BODY(msgrcv_success, tc)
177 /* Create a message queue and obtain the corresponding identifier */
178 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
180 /* Initialize two msgstr_t structures to store respective messages */
183 memset(msg1.mtext, 0, BUFFSIZE);
185 /* Send a message to the queue with ID = msqid */
186 ATF_REQUIRE_EQ(0, msgsnd(msqid, &msg1, BUFFSIZE, IPC_NOWAIT));
188 FILE *pipefd = setup(fds, auclass);
189 ATF_REQUIRE((recv_bytes = msgrcv(msqid, &msg2,
190 BUFFSIZE, 0, MSG_NOERROR | IPC_NOWAIT)) != -1);
191 /* Check the presence of queue ID and returned bytes in audit record */
192 snprintf(ipcregex, sizeof(ipcregex),
193 "msgrcv.*Message IPC,*%d.*return,success,%zd", msqid, recv_bytes);
194 check_audit(fds, ipcregex, pipefd);
196 /* Destroy the message queue with ID = msqid */
197 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
200 ATF_TC_CLEANUP(msgrcv_success, tc)
206 ATF_TC_WITH_CLEANUP(msgrcv_failure);
207 ATF_TC_HEAD(msgrcv_failure, tc)
209 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
213 ATF_TC_BODY(msgrcv_failure, tc)
215 const char *regex = "msgrcv.*return,failure : Invalid argument";
216 FILE *pipefd = setup(fds, auclass);
217 ATF_REQUIRE_EQ(-1, msgrcv(-1, NULL, 0, 0, MSG_NOERROR | IPC_NOWAIT));
218 check_audit(fds, regex, pipefd);
221 ATF_TC_CLEANUP(msgrcv_failure, tc)
227 ATF_TC_WITH_CLEANUP(msgctl_rmid_success);
228 ATF_TC_HEAD(msgctl_rmid_success, tc)
230 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
231 "msgctl(2) call for IPC_RMID command");
234 ATF_TC_BODY(msgctl_rmid_success, tc)
236 /* Create a message queue and obtain the corresponding identifier */
237 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
239 FILE *pipefd = setup(fds, auclass);
240 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
241 /* Check the presence of queue ID and IPC_RMID in audit record */
242 snprintf(ipcregex, sizeof(ipcregex),
243 "msgctl.*IPC_RMID.*%d.*return,success", msqid);
244 check_audit(fds, ipcregex, pipefd);
247 ATF_TC_CLEANUP(msgctl_rmid_success, tc)
253 ATF_TC_WITH_CLEANUP(msgctl_rmid_failure);
254 ATF_TC_HEAD(msgctl_rmid_failure, tc)
256 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
257 "msgctl(2) call for IPC_RMID command");
260 ATF_TC_BODY(msgctl_rmid_failure, tc)
262 const char *regex = "msgctl.*IPC_RMID.*return,failur.*Invalid argument";
263 FILE *pipefd = setup(fds, auclass);
264 ATF_REQUIRE_EQ(-1, msgctl(-1, IPC_RMID, NULL));
265 check_audit(fds, regex, pipefd);
268 ATF_TC_CLEANUP(msgctl_rmid_failure, tc)
274 ATF_TC_WITH_CLEANUP(msgctl_stat_success);
275 ATF_TC_HEAD(msgctl_stat_success, tc)
277 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
278 "msgctl(2) call for IPC_STAT command");
281 ATF_TC_BODY(msgctl_stat_success, tc)
283 /* Create a message queue and obtain the corresponding identifier */
284 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
286 FILE *pipefd = setup(fds, auclass);
287 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_STAT, &msgbuff));
288 /* Check the presence of queue ID and IPC_STAT in audit record */
289 snprintf(ipcregex, sizeof(ipcregex),
290 "msgctl.*IPC_STAT.*%d.*return,success", msqid);
291 check_audit(fds, ipcregex, pipefd);
293 /* Destroy the message queue with ID = msqid */
294 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
297 ATF_TC_CLEANUP(msgctl_stat_success, tc)
303 ATF_TC_WITH_CLEANUP(msgctl_stat_failure);
304 ATF_TC_HEAD(msgctl_stat_failure, tc)
306 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
307 "msgctl(2) call for IPC_STAT command");
310 ATF_TC_BODY(msgctl_stat_failure, tc)
312 const char *regex = "msgctl.*IPC_STAT.*return,failur.*Invalid argument";
313 FILE *pipefd = setup(fds, auclass);
314 ATF_REQUIRE_EQ(-1, msgctl(-1, IPC_STAT, &msgbuff));
315 check_audit(fds, regex, pipefd);
318 ATF_TC_CLEANUP(msgctl_stat_failure, tc)
324 ATF_TC_WITH_CLEANUP(msgctl_set_success);
325 ATF_TC_HEAD(msgctl_set_success, tc)
327 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
328 "msgctl(2) call for IPC_SET command");
331 ATF_TC_BODY(msgctl_set_success, tc)
333 /* Create a message queue and obtain the corresponding identifier */
334 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
335 /* Fill up the msgbuff structure to be used with IPC_SET */
336 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_STAT, &msgbuff));
338 FILE *pipefd = setup(fds, auclass);
339 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_SET, &msgbuff));
340 /* Check the presence of message queue ID in audit record */
341 snprintf(ipcregex, sizeof(ipcregex),
342 "msgctl.*IPC_SET.*%d.*return,success", msqid);
343 check_audit(fds, ipcregex, pipefd);
345 /* Destroy the message queue with ID = msqid */
346 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
349 ATF_TC_CLEANUP(msgctl_set_success, tc)
355 ATF_TC_WITH_CLEANUP(msgctl_set_failure);
356 ATF_TC_HEAD(msgctl_set_failure, tc)
358 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
359 "msgctl(2) call for IPC_SET command");
362 ATF_TC_BODY(msgctl_set_failure, tc)
364 const char *regex = "msgctl.*IPC_SET.*return,failure.*Invalid argument";
365 FILE *pipefd = setup(fds, auclass);
366 ATF_REQUIRE_EQ(-1, msgctl(-1, IPC_SET, &msgbuff));
367 check_audit(fds, regex, pipefd);
370 ATF_TC_CLEANUP(msgctl_set_failure, tc)
376 ATF_TC_WITH_CLEANUP(msgctl_illegal_command);
377 ATF_TC_HEAD(msgctl_illegal_command, tc)
379 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
380 "msgctl(2) call for illegal cmd value");
383 ATF_TC_BODY(msgctl_illegal_command, tc)
385 /* Create a message queue and obtain the corresponding identifier */
386 ATF_REQUIRE((msqid = msgget(IPC_PRIVATE, IPC_CREAT | S_IRUSR)) != -1);
388 const char *regex = "msgctl.*illegal command.*failur.*Invalid argument";
389 FILE *pipefd = setup(fds, auclass);
390 ATF_REQUIRE_EQ(-1, msgctl(msqid, -1, &msgbuff));
391 check_audit(fds, regex, pipefd);
393 /* Destroy the message queue with ID = msqid */
394 ATF_REQUIRE_EQ(0, msgctl(msqid, IPC_RMID, NULL));
397 ATF_TC_CLEANUP(msgctl_illegal_command, tc)
403 ATF_TC_WITH_CLEANUP(shmget_success);
404 ATF_TC_HEAD(shmget_success, tc)
406 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
410 ATF_TC_BODY(shmget_success, tc)
412 FILE *pipefd = setup(fds, auclass);
414 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
415 /* Check the presence of shared memory ID in audit record */
416 snprintf(ipcregex, sizeof(ipcregex), "shmget.*ret.*success,%d", shmid);
417 check_audit(fds, ipcregex, pipefd);
419 /* Destroy the shared memory with ID = shmid */
420 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
423 ATF_TC_CLEANUP(shmget_success, tc)
429 ATF_TC_WITH_CLEANUP(shmget_failure);
430 ATF_TC_HEAD(shmget_failure, tc)
432 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
436 ATF_TC_BODY(shmget_failure, tc)
438 const char *regex = "shmget.*return,failure.*No such file or directory";
439 FILE *pipefd = setup(fds, auclass);
440 ATF_REQUIRE_EQ(-1, shmget((key_t)(-1), 0, 0));
441 check_audit(fds, regex, pipefd);
444 ATF_TC_CLEANUP(shmget_failure, tc)
450 ATF_TC_WITH_CLEANUP(shmat_success);
451 ATF_TC_HEAD(shmat_success, tc)
453 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
457 ATF_TC_BODY(shmat_success, tc)
460 /* Create a shared memory segment and obtain the identifier */
462 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
464 FILE *pipefd = setup(fds, auclass);
465 ATF_REQUIRE((intptr_t)(addr = shmat(shmid, NULL, 0)) != -1);
467 /* Check for shared memory ID and process address in record */
468 snprintf(ipcregex, sizeof(ipcregex), "shmat.*Shared Memory "
469 "IPC.*%d.*return,success", shmid);
470 check_audit(fds, ipcregex, pipefd);
472 /* Destroy the shared memory with ID = shmid */
473 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
476 ATF_TC_CLEANUP(shmat_success, tc)
482 ATF_TC_WITH_CLEANUP(shmat_failure);
483 ATF_TC_HEAD(shmat_failure, tc)
485 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
489 ATF_TC_BODY(shmat_failure, tc)
491 const char *regex = "shmat.*Shared Memory IPC.*return,failure";
492 FILE *pipefd = setup(fds, auclass);
493 ATF_REQUIRE_EQ(-1, (intptr_t)shmat(-1, NULL, 0));
494 check_audit(fds, regex, pipefd);
497 ATF_TC_CLEANUP(shmat_failure, tc)
503 ATF_TC_WITH_CLEANUP(shmdt_success);
504 ATF_TC_HEAD(shmdt_success, tc)
506 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
510 ATF_TC_BODY(shmdt_success, tc)
514 snprintf(ipcregex, sizeof(ipcregex), "shmdt.*%d.*return,success", pid);
516 /* Create a shared memory segment and obtain the identifier */
518 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
520 /* Attach the shared memory to calling process's address space */
521 ATF_REQUIRE((intptr_t)(addr = shmat(shmid, NULL, 0)) != -1);
523 FILE *pipefd = setup(fds, auclass);
524 ATF_REQUIRE_EQ(0, shmdt(addr));
525 check_audit(fds, ipcregex, pipefd);
527 /* Destroy the shared memory with ID = shmid */
528 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
531 ATF_TC_CLEANUP(shmdt_success, tc)
537 ATF_TC_WITH_CLEANUP(shmdt_failure);
538 ATF_TC_HEAD(shmdt_failure, tc)
540 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
544 ATF_TC_BODY(shmdt_failure, tc)
546 const char *regex = "shmdt.*return,failure : Invalid argument";
547 FILE *pipefd = setup(fds, auclass);
548 ATF_REQUIRE_EQ(-1, shmdt(NULL));
549 check_audit(fds, regex, pipefd);
552 ATF_TC_CLEANUP(shmdt_failure, tc)
558 ATF_TC_WITH_CLEANUP(shmctl_rmid_success);
559 ATF_TC_HEAD(shmctl_rmid_success, tc)
561 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
562 "shmctl(2) call for IPC_RMID command");
565 ATF_TC_BODY(shmctl_rmid_success, tc)
567 /* Create a shared memory segment and obtain the identifier */
569 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
571 FILE *pipefd = setup(fds, auclass);
572 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
573 /* Check the presence of shmid and IPC_RMID in audit record */
574 snprintf(ipcregex, sizeof(ipcregex),
575 "shmctl.*IPC_RMID.*%d.*return,success", shmid);
576 check_audit(fds, ipcregex, pipefd);
579 ATF_TC_CLEANUP(shmctl_rmid_success, tc)
585 ATF_TC_WITH_CLEANUP(shmctl_rmid_failure);
586 ATF_TC_HEAD(shmctl_rmid_failure, tc)
588 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
589 "shmctl(2) call for IPC_RMID command");
592 ATF_TC_BODY(shmctl_rmid_failure, tc)
594 const char *regex = "shmctl.*IPC_RMID.*return,fail.*Invalid argument";
595 FILE *pipefd = setup(fds, auclass);
596 ATF_REQUIRE_EQ(-1, shmctl(-1, IPC_RMID, NULL));
597 check_audit(fds, regex, pipefd);
600 ATF_TC_CLEANUP(shmctl_rmid_failure, tc)
606 ATF_TC_WITH_CLEANUP(shmctl_stat_success);
607 ATF_TC_HEAD(shmctl_stat_success, tc)
609 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
610 "shmctl(2) call for IPC_STAT command");
613 ATF_TC_BODY(shmctl_stat_success, tc)
615 /* Create a shared memory segment and obtain the identifier */
617 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
619 FILE *pipefd = setup(fds, auclass);
620 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_STAT, &shmbuff));
621 /* Check if shared memory ID and IPC_STAT are present in audit record */
622 snprintf(ipcregex, sizeof(ipcregex),
623 "shmctl.*IPC_STAT.*%d.*return,success", shmid);
624 check_audit(fds, ipcregex, pipefd);
626 /* Destroy the shared memory with ID = shmid */
627 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
630 ATF_TC_CLEANUP(shmctl_stat_success, tc)
636 ATF_TC_WITH_CLEANUP(shmctl_stat_failure);
637 ATF_TC_HEAD(shmctl_stat_failure, tc)
639 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
640 "shmctl(2) call for IPC_STAT command");
643 ATF_TC_BODY(shmctl_stat_failure, tc)
645 const char *regex = "shmctl.*IPC_STAT.*return,fail.*Invalid argument";
646 FILE *pipefd = setup(fds, auclass);
647 ATF_REQUIRE_EQ(-1, shmctl(-1, IPC_STAT, &shmbuff));
648 check_audit(fds, regex, pipefd);
651 ATF_TC_CLEANUP(shmctl_stat_failure, tc)
657 ATF_TC_WITH_CLEANUP(shmctl_set_success);
658 ATF_TC_HEAD(shmctl_set_success, tc)
660 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
661 "shmctl(2) call for IPC_SET command");
664 ATF_TC_BODY(shmctl_set_success, tc)
666 /* Create a shared memory segment and obtain the identifier */
668 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
669 /* Fill up the shmbuff structure to be used with IPC_SET */
670 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_STAT, &shmbuff));
672 FILE *pipefd = setup(fds, auclass);
673 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_SET, &shmbuff));
674 /* Check the presence of shared memory ID in audit record */
675 snprintf(ipcregex, sizeof(ipcregex),
676 "shmctl.*IPC_SET.*%d.*return,success", msqid);
677 check_audit(fds, ipcregex, pipefd);
679 /* Destroy the shared memory with ID = shmid */
680 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
683 ATF_TC_CLEANUP(shmctl_set_success, tc)
689 ATF_TC_WITH_CLEANUP(shmctl_set_failure);
690 ATF_TC_HEAD(shmctl_set_failure, tc)
692 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
693 "shmctl(2) call for IPC_SET command");
696 ATF_TC_BODY(shmctl_set_failure, tc)
698 const char *regex = "shmctl.*IPC_SET.*return,failure.*Invalid argument";
699 FILE *pipefd = setup(fds, auclass);
700 ATF_REQUIRE_EQ(-1, shmctl(-1, IPC_SET, &shmbuff));
701 check_audit(fds, regex, pipefd);
704 ATF_TC_CLEANUP(shmctl_set_failure, tc)
710 ATF_TC_WITH_CLEANUP(shmctl_illegal_command);
711 ATF_TC_HEAD(shmctl_illegal_command, tc)
713 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
714 "shmctl(2) call for illegal cmd value");
717 ATF_TC_BODY(shmctl_illegal_command, tc)
719 /* Create a shared memory segment and obtain the identifier */
721 shmget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
723 const char *regex = "shmctl.*illegal command.*fail.*Invalid argument";
724 FILE *pipefd = setup(fds, auclass);
725 ATF_REQUIRE_EQ(-1, shmctl(shmid, -1, &shmbuff));
726 check_audit(fds, regex, pipefd);
728 /* Destroy the shared memory with ID = shmid */
729 ATF_REQUIRE_EQ(0, shmctl(shmid, IPC_RMID, NULL));
732 ATF_TC_CLEANUP(shmctl_illegal_command, tc)
738 ATF_TC_WITH_CLEANUP(semget_success);
739 ATF_TC_HEAD(semget_success, tc)
741 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
745 ATF_TC_BODY(semget_success, tc)
747 FILE *pipefd = setup(fds, auclass);
749 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
751 /* Check the presence of semaphore set ID in audit record */
752 snprintf(ipcregex, sizeof(ipcregex),
753 "semget.*return,success,%d", semid);
754 check_audit(fds, ipcregex, pipefd);
756 /* Destroy the semaphore set with ID = semid */
757 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
760 ATF_TC_CLEANUP(semget_success, tc)
766 ATF_TC_WITH_CLEANUP(semget_failure);
767 ATF_TC_HEAD(semget_failure, tc)
769 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
773 ATF_TC_BODY(semget_failure, tc)
776 snprintf(ipcregex, sizeof(ipcregex), "semget.*%d.*return,failure", pid);
778 FILE *pipefd = setup(fds, auclass);
779 /* Failure reason: nsems is a negative number */
780 ATF_REQUIRE_EQ(-1, semget(IPC_PRIVATE, -1, 0));
781 check_audit(fds, ipcregex, pipefd);
784 ATF_TC_CLEANUP(semget_failure, tc)
790 ATF_TC_WITH_CLEANUP(semop_success);
791 ATF_TC_HEAD(semop_success, tc)
793 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
797 ATF_TC_BODY(semop_success, tc)
799 /* Create a semaphore set and obtain the set identifier */
801 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
803 /* Initialize a sembuf structure to operate on semaphore set */
804 struct sembuf sop[1] = {{0, 1, 0}};
805 /* Check the presence of semaphore set ID in audit record */
806 snprintf(ipcregex, sizeof(ipcregex),
807 "semop.*Semaphore IPC.*%d.*return,success", semid);
809 FILE *pipefd = setup(fds, auclass);
810 ATF_REQUIRE_EQ(0, semop(semid, sop, sizeof(sop)/sizeof(struct sembuf)));
811 check_audit(fds, ipcregex, pipefd);
813 /* Destroy the semaphore set with ID = semid */
814 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
817 ATF_TC_CLEANUP(semop_success, tc)
823 ATF_TC_WITH_CLEANUP(semop_failure);
824 ATF_TC_HEAD(semop_failure, tc)
826 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
830 ATF_TC_BODY(semop_failure, tc)
832 const char *regex = "semop.*0xffff.*return,failure : Invalid argument";
833 FILE *pipefd = setup(fds, auclass);
834 ATF_REQUIRE_EQ(-1, semop(-1, NULL, 0));
835 check_audit(fds, regex, pipefd);
838 ATF_TC_CLEANUP(semop_failure, tc)
844 ATF_TC_WITH_CLEANUP(semctl_getval_success);
845 ATF_TC_HEAD(semctl_getval_success, tc)
847 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
848 "semctl(2) call for GETVAL command");
851 ATF_TC_BODY(semctl_getval_success, tc)
853 /* Create a semaphore set and obtain the set identifier */
855 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
857 FILE *pipefd = setup(fds, auclass);
858 ATF_REQUIRE_EQ(0, semctl(semid, 0, GETVAL));
859 /* Check the presence of semaphore ID and GETVAL in audit record */
860 snprintf(ipcregex, sizeof(ipcregex),
861 "semctl.*GETVAL.*%d.*return,success", semid);
862 check_audit(fds, ipcregex, pipefd);
864 /* Destroy the semaphore set with ID = semid */
865 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
868 ATF_TC_CLEANUP(semctl_getval_success, tc)
874 ATF_TC_WITH_CLEANUP(semctl_getval_failure);
875 ATF_TC_HEAD(semctl_getval_failure, tc)
877 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
878 "semctl(2) call for GETVAL command");
881 ATF_TC_BODY(semctl_getval_failure, tc)
883 const char *regex = "semctl.*GETVAL.*return,failure : Invalid argument";
884 FILE *pipefd = setup(fds, auclass);
885 ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETVAL));
886 check_audit(fds, regex, pipefd);
889 ATF_TC_CLEANUP(semctl_getval_failure, tc)
895 ATF_TC_WITH_CLEANUP(semctl_setval_success);
896 ATF_TC_HEAD(semctl_setval_success, tc)
898 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
899 "semctl(2) call for SETVAL command");
902 ATF_TC_BODY(semctl_setval_success, tc)
904 /* Create a semaphore set and obtain the set identifier */
906 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
909 FILE *pipefd = setup(fds, auclass);
910 ATF_REQUIRE_EQ(0, semctl(semid, 0, SETVAL, semarg));
911 /* Check the presence of semaphore ID and SETVAL in audit record */
912 snprintf(ipcregex, sizeof(ipcregex),
913 "semctl.*SETVAL.*%d.*return,success", semid);
914 check_audit(fds, ipcregex, pipefd);
916 /* Destroy the semaphore set with ID = semid */
917 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
920 ATF_TC_CLEANUP(semctl_setval_success, tc)
926 ATF_TC_WITH_CLEANUP(semctl_setval_failure);
927 ATF_TC_HEAD(semctl_setval_failure, tc)
929 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
930 "semctl(2) call for SETVAL command");
933 ATF_TC_BODY(semctl_setval_failure, tc)
935 const char *regex = "semctl.*SETVAL.*return,failure : Invalid argument";
936 FILE *pipefd = setup(fds, auclass);
937 ATF_REQUIRE_EQ(-1, semctl(-1, 0, SETVAL, semarg));
938 check_audit(fds, regex, pipefd);
941 ATF_TC_CLEANUP(semctl_setval_failure, tc)
947 ATF_TC_WITH_CLEANUP(semctl_getpid_success);
948 ATF_TC_HEAD(semctl_getpid_success, tc)
950 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
951 "semctl(2) call for GETPID command");
954 ATF_TC_BODY(semctl_getpid_success, tc)
956 /* Create a semaphore set and obtain the set identifier */
958 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
960 FILE *pipefd = setup(fds, auclass);
961 ATF_REQUIRE_EQ(0, semctl(semid, 0, GETPID));
962 /* Check the presence of semaphore ID and GETVAL in audit record */
963 snprintf(ipcregex, sizeof(ipcregex),
964 "semctl.*GETPID.*%d.*return,success", semid);
965 check_audit(fds, ipcregex, pipefd);
967 /* Destroy the semaphore set with ID = semid */
968 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
971 ATF_TC_CLEANUP(semctl_getpid_success, tc)
977 ATF_TC_WITH_CLEANUP(semctl_getpid_failure);
978 ATF_TC_HEAD(semctl_getpid_failure, tc)
980 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
981 "semctl(2) call for GETPID command");
984 ATF_TC_BODY(semctl_getpid_failure, tc)
986 const char *regex = "semctl.*GETPID.*return,failure : Invalid argument";
987 FILE *pipefd = setup(fds, auclass);
988 ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETPID));
989 check_audit(fds, regex, pipefd);
992 ATF_TC_CLEANUP(semctl_getpid_failure, tc)
998 ATF_TC_WITH_CLEANUP(semctl_getncnt_success);
999 ATF_TC_HEAD(semctl_getncnt_success, tc)
1001 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1002 "semctl(2) call for GETNCNT command");
1005 ATF_TC_BODY(semctl_getncnt_success, tc)
1007 /* Create a semaphore set and obtain the set identifier */
1008 ATF_REQUIRE((semid =
1009 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1011 FILE *pipefd = setup(fds, auclass);
1012 ATF_REQUIRE_EQ(0, semctl(semid, 0, GETNCNT));
1013 /* Check the presence of semaphore ID and GETNCNT in audit record */
1014 snprintf(ipcregex, sizeof(ipcregex),
1015 "semctl.*GETNCNT.*%d.*return,success", semid);
1016 check_audit(fds, ipcregex, pipefd);
1018 /* Destroy the semaphore set with ID = semid */
1019 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1022 ATF_TC_CLEANUP(semctl_getncnt_success, tc)
1028 ATF_TC_WITH_CLEANUP(semctl_getncnt_failure);
1029 ATF_TC_HEAD(semctl_getncnt_failure, tc)
1031 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1032 "semctl(2) call for GETNCNT command");
1035 ATF_TC_BODY(semctl_getncnt_failure, tc)
1037 const char *regex = "semctl.*GETNCNT.*return,failure.*Invalid argument";
1038 FILE *pipefd = setup(fds, auclass);
1039 ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETNCNT));
1040 check_audit(fds, regex, pipefd);
1043 ATF_TC_CLEANUP(semctl_getncnt_failure, tc)
1049 ATF_TC_WITH_CLEANUP(semctl_getzcnt_success);
1050 ATF_TC_HEAD(semctl_getzcnt_success, tc)
1052 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1053 "semctl(2) call for GETZCNT command");
1056 ATF_TC_BODY(semctl_getzcnt_success, tc)
1058 /* Create a semaphore set and obtain the set identifier */
1059 ATF_REQUIRE((semid =
1060 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1062 FILE *pipefd = setup(fds, auclass);
1063 ATF_REQUIRE_EQ(0, semctl(semid, 0, GETZCNT));
1064 /* Check the presence of semaphore ID and GETZCNT in audit record */
1065 snprintf(ipcregex, sizeof(ipcregex),
1066 "semctl.*GETZCNT.*%d.*return,success", semid);
1067 check_audit(fds, ipcregex, pipefd);
1069 /* Destroy the semaphore set with ID = semid */
1070 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1073 ATF_TC_CLEANUP(semctl_getzcnt_success, tc)
1079 ATF_TC_WITH_CLEANUP(semctl_getzcnt_failure);
1080 ATF_TC_HEAD(semctl_getzcnt_failure, tc)
1082 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1083 "semctl(2) call for GETZCNT command");
1086 ATF_TC_BODY(semctl_getzcnt_failure, tc)
1088 const char *regex = "semctl.*GETZCNT.*return,failure.*Invalid argument";
1089 FILE *pipefd = setup(fds, auclass);
1090 ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETZCNT));
1091 check_audit(fds, regex, pipefd);
1094 ATF_TC_CLEANUP(semctl_getzcnt_failure, tc)
1100 ATF_TC_WITH_CLEANUP(semctl_getall_success);
1101 ATF_TC_HEAD(semctl_getall_success, tc)
1103 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1104 "semctl(2) call for GETALL command");
1107 ATF_TC_BODY(semctl_getall_success, tc)
1109 /* Create a semaphore set and obtain the set identifier */
1110 ATF_REQUIRE((semid =
1111 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1113 semarg.array = semvals;
1114 FILE *pipefd = setup(fds, auclass);
1115 ATF_REQUIRE(semctl(semid, 0, GETALL, semarg) != -1);
1116 /* Check the presence of semaphore ID and GETALL in audit record */
1117 snprintf(ipcregex, sizeof(ipcregex),
1118 "semctl.*GETALL.*%d.*return,success", semid);
1119 check_audit(fds, ipcregex, pipefd);
1121 /* Destroy the semaphore set with ID = semid */
1122 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1125 ATF_TC_CLEANUP(semctl_getall_success, tc)
1131 ATF_TC_WITH_CLEANUP(semctl_getall_failure);
1132 ATF_TC_HEAD(semctl_getall_failure, tc)
1134 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1135 "semctl(2) call for GETALL command");
1138 ATF_TC_BODY(semctl_getall_failure, tc)
1140 const char *regex = "semctl.*GETALL.*return,failure : Invalid argument";
1141 FILE *pipefd = setup(fds, auclass);
1142 ATF_REQUIRE_EQ(-1, semctl(-1, 0, GETALL, semarg));
1143 check_audit(fds, regex, pipefd);
1146 ATF_TC_CLEANUP(semctl_getall_failure, tc)
1152 ATF_TC_WITH_CLEANUP(semctl_setall_success);
1153 ATF_TC_HEAD(semctl_setall_success, tc)
1155 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1156 "semctl(2) call for SETALL command");
1159 ATF_TC_BODY(semctl_setall_success, tc)
1161 /* Create a semaphore set and obtain the set identifier */
1162 ATF_REQUIRE((semid =
1163 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1165 semarg.array = semvals;
1166 /* Initialize semvals to be used with SETALL */
1167 ATF_REQUIRE(semctl(semid, 0, GETALL, semarg) != -1);
1169 FILE *pipefd = setup(fds, auclass);
1170 ATF_REQUIRE_EQ(0, semctl(semid, 0, SETALL, semarg));
1171 /* Check the presence of semaphore ID and SETALL in audit record */
1172 snprintf(ipcregex, sizeof(ipcregex),
1173 "semctl.*SETALL.*%d.*return,success", semid);
1174 check_audit(fds, ipcregex, pipefd);
1176 /* Destroy the semaphore set with ID = semid */
1177 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1180 ATF_TC_CLEANUP(semctl_setall_success, tc)
1186 ATF_TC_WITH_CLEANUP(semctl_setall_failure);
1187 ATF_TC_HEAD(semctl_setall_failure, tc)
1189 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1190 "semctl(2) call for SETALL command");
1193 ATF_TC_BODY(semctl_setall_failure, tc)
1195 const char *regex = "semctl.*SETALL.*return,failure : Invalid argument";
1196 FILE *pipefd = setup(fds, auclass);
1197 ATF_REQUIRE_EQ(-1, semctl(-1, 0, SETALL, semarg));
1198 check_audit(fds, regex, pipefd);
1201 ATF_TC_CLEANUP(semctl_setall_failure, tc)
1207 ATF_TC_WITH_CLEANUP(semctl_stat_success);
1208 ATF_TC_HEAD(semctl_stat_success, tc)
1210 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1211 "semctl(2) call for IPC_STAT command");
1214 ATF_TC_BODY(semctl_stat_success, tc)
1216 /* Create a semaphore set and obtain the set identifier */
1217 ATF_REQUIRE((semid =
1218 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1220 semarg.buf = &sembuff;
1221 FILE *pipefd = setup(fds, auclass);
1222 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_STAT, semarg));
1223 /* Check the presence of semaphore ID and IPC_STAT in audit record */
1224 snprintf(ipcregex, sizeof(ipcregex),
1225 "semctl.*IPC_STAT.*%d.*return,success", semid);
1226 check_audit(fds, ipcregex, pipefd);
1228 /* Destroy the semaphore set with ID = semid */
1229 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1232 ATF_TC_CLEANUP(semctl_stat_success, tc)
1238 ATF_TC_WITH_CLEANUP(semctl_stat_failure);
1239 ATF_TC_HEAD(semctl_stat_failure, tc)
1241 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1242 "semctl(2) call for IPC_STAT command");
1245 ATF_TC_BODY(semctl_stat_failure, tc)
1247 const char *regex = "semctl.*IPC_STAT.*return,fail.*Invalid argument";
1248 FILE *pipefd = setup(fds, auclass);
1249 ATF_REQUIRE_EQ(-1, semctl(-1, 0, IPC_STAT, semarg));
1250 check_audit(fds, regex, pipefd);
1253 ATF_TC_CLEANUP(semctl_stat_failure, tc)
1259 ATF_TC_WITH_CLEANUP(semctl_set_success);
1260 ATF_TC_HEAD(semctl_set_success, tc)
1262 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1263 "semctl(2) call for IPC_SET command");
1266 ATF_TC_BODY(semctl_set_success, tc)
1268 /* Create a semaphore set and obtain the set identifier */
1269 ATF_REQUIRE((semid =
1270 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1272 semarg.buf = &sembuff;
1273 /* Fill up the sembuff structure to be used with IPC_SET */
1274 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_STAT, semarg));
1276 FILE *pipefd = setup(fds, auclass);
1277 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_SET, semarg));
1278 /* Check the presence of semaphore ID and IPC_SET in audit record */
1279 snprintf(ipcregex, sizeof(ipcregex),
1280 "semctl.*IPC_SET.*%d.*return,success", semid);
1281 check_audit(fds, ipcregex, pipefd);
1283 /* Destroy the semaphore set with ID = semid */
1284 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1287 ATF_TC_CLEANUP(semctl_set_success, tc)
1293 ATF_TC_WITH_CLEANUP(semctl_set_failure);
1294 ATF_TC_HEAD(semctl_set_failure, tc)
1296 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1297 "semctl(2) call for IPC_SET command");
1300 ATF_TC_BODY(semctl_set_failure, tc)
1302 /* Create a semaphore set and obtain the set identifier */
1303 ATF_REQUIRE((semid =
1304 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1306 semarg.buf = &sembuff;
1307 /* Fill up the sembuff structure to be used with IPC_SET */
1308 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_STAT, semarg));
1310 const char *regex = "semctl.*IPC_SET.*return,failure.*Invalid argument";
1311 FILE *pipefd = setup(fds, auclass);
1312 ATF_REQUIRE_EQ(-1, semctl(-1, 0, IPC_SET, semarg));
1313 check_audit(fds, regex, pipefd);
1315 /* Destroy the semaphore set with ID = semid */
1316 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1319 ATF_TC_CLEANUP(semctl_set_failure, tc)
1325 ATF_TC_WITH_CLEANUP(semctl_rmid_success);
1326 ATF_TC_HEAD(semctl_rmid_success, tc)
1328 atf_tc_set_md_var(tc, "descr", "Tests the audit of a successful "
1329 "semctl(2) call for IPC_RMID command");
1332 ATF_TC_BODY(semctl_rmid_success, tc)
1334 /* Create a semaphore set and obtain the set identifier */
1335 ATF_REQUIRE((semid =
1336 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1338 FILE *pipefd = setup(fds, auclass);
1339 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID, semarg));
1340 /* Check the presence of semaphore ID and IPC_RMID in audit record */
1341 snprintf(ipcregex, sizeof(ipcregex),
1342 "semctl.*IPC_RMID.*%d.*return,success", semid);
1343 check_audit(fds, ipcregex, pipefd);
1346 ATF_TC_CLEANUP(semctl_rmid_success, tc)
1352 ATF_TC_WITH_CLEANUP(semctl_rmid_failure);
1353 ATF_TC_HEAD(semctl_rmid_failure, tc)
1355 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1356 "semctl(2) call for IPC_RMID command");
1359 ATF_TC_BODY(semctl_rmid_failure, tc)
1361 const char *regex = "semctl.*IPC_RMID.*return,fail.*Invalid argument";
1362 FILE *pipefd = setup(fds, auclass);
1363 ATF_REQUIRE_EQ(-1, semctl(-1, 0, IPC_RMID, semarg));
1364 check_audit(fds, regex, pipefd);
1367 ATF_TC_CLEANUP(semctl_rmid_failure, tc)
1373 ATF_TC_WITH_CLEANUP(semctl_illegal_command);
1374 ATF_TC_HEAD(semctl_illegal_command, tc)
1376 atf_tc_set_md_var(tc, "descr", "Tests the audit of an unsuccessful "
1377 "semctl(2) call for illegal cmd value");
1380 ATF_TC_BODY(semctl_illegal_command, tc)
1382 /* Create a semaphore set and obtain the set identifier */
1383 ATF_REQUIRE((semid =
1384 semget(IPC_PRIVATE, 1, IPC_CREAT | S_IRUSR)) != -1);
1386 const char *regex = "semctl.*illegal command.*fail.*Invalid argument";
1387 FILE *pipefd = setup(fds, auclass);
1388 ATF_REQUIRE_EQ(-1, semctl(semid, 0, -1));
1389 check_audit(fds, regex, pipefd);
1391 /* Destroy the semaphore set with ID = semid */
1392 ATF_REQUIRE_EQ(0, semctl(semid, 0, IPC_RMID));
1395 ATF_TC_CLEANUP(semctl_illegal_command, tc)
1403 ATF_TP_ADD_TC(tp, msgget_success);
1404 ATF_TP_ADD_TC(tp, msgget_failure);
1405 ATF_TP_ADD_TC(tp, msgsnd_success);
1406 ATF_TP_ADD_TC(tp, msgsnd_failure);
1407 ATF_TP_ADD_TC(tp, msgrcv_success);
1408 ATF_TP_ADD_TC(tp, msgrcv_failure);
1410 ATF_TP_ADD_TC(tp, msgctl_rmid_success);
1411 ATF_TP_ADD_TC(tp, msgctl_rmid_failure);
1412 ATF_TP_ADD_TC(tp, msgctl_stat_success);
1413 ATF_TP_ADD_TC(tp, msgctl_stat_failure);
1414 ATF_TP_ADD_TC(tp, msgctl_set_success);
1415 ATF_TP_ADD_TC(tp, msgctl_set_failure);
1416 ATF_TP_ADD_TC(tp, msgctl_illegal_command);
1418 ATF_TP_ADD_TC(tp, shmget_success);
1419 ATF_TP_ADD_TC(tp, shmget_failure);
1420 ATF_TP_ADD_TC(tp, shmat_success);
1421 ATF_TP_ADD_TC(tp, shmat_failure);
1422 ATF_TP_ADD_TC(tp, shmdt_success);
1423 ATF_TP_ADD_TC(tp, shmdt_failure);
1425 ATF_TP_ADD_TC(tp, shmctl_rmid_success);
1426 ATF_TP_ADD_TC(tp, shmctl_rmid_failure);
1427 ATF_TP_ADD_TC(tp, shmctl_stat_success);
1428 ATF_TP_ADD_TC(tp, shmctl_stat_failure);
1429 ATF_TP_ADD_TC(tp, shmctl_set_success);
1430 ATF_TP_ADD_TC(tp, shmctl_set_failure);
1431 ATF_TP_ADD_TC(tp, shmctl_illegal_command);
1433 ATF_TP_ADD_TC(tp, semget_success);
1434 ATF_TP_ADD_TC(tp, semget_failure);
1435 ATF_TP_ADD_TC(tp, semop_success);
1436 ATF_TP_ADD_TC(tp, semop_failure);
1438 ATF_TP_ADD_TC(tp, semctl_getval_success);
1439 ATF_TP_ADD_TC(tp, semctl_getval_failure);
1440 ATF_TP_ADD_TC(tp, semctl_setval_success);
1441 ATF_TP_ADD_TC(tp, semctl_setval_failure);
1442 ATF_TP_ADD_TC(tp, semctl_getpid_success);
1443 ATF_TP_ADD_TC(tp, semctl_getpid_failure);
1444 ATF_TP_ADD_TC(tp, semctl_getncnt_success);
1445 ATF_TP_ADD_TC(tp, semctl_getncnt_failure);
1446 ATF_TP_ADD_TC(tp, semctl_getzcnt_success);
1447 ATF_TP_ADD_TC(tp, semctl_getzcnt_failure);
1448 ATF_TP_ADD_TC(tp, semctl_getall_success);
1449 ATF_TP_ADD_TC(tp, semctl_getall_failure);
1450 ATF_TP_ADD_TC(tp, semctl_setall_success);
1451 ATF_TP_ADD_TC(tp, semctl_setall_failure);
1452 ATF_TP_ADD_TC(tp, semctl_stat_success);
1453 ATF_TP_ADD_TC(tp, semctl_stat_failure);
1454 ATF_TP_ADD_TC(tp, semctl_set_success);
1455 ATF_TP_ADD_TC(tp, semctl_set_failure);
1456 ATF_TP_ADD_TC(tp, semctl_rmid_success);
1457 ATF_TP_ADD_TC(tp, semctl_rmid_failure);
1458 ATF_TP_ADD_TC(tp, semctl_illegal_command);
1460 return (atf_no_error());