Changeset View
Changeset View
Standalone View
Standalone View
head/contrib/netbsd-tests/kernel/t_sysv.c
Show First 20 Lines • Show All 66 Lines • ▼ Show 20 Lines | |||||
void print_semid_ds(struct semid_ds *, mode_t); | void print_semid_ds(struct semid_ds *, mode_t); | ||||
void waiter(void); | void waiter(void); | ||||
void print_shmid_ds(struct shmid_ds *, mode_t); | void print_shmid_ds(struct shmid_ds *, mode_t); | ||||
void sharer(void); | void sharer(void); | ||||
#define MESSAGE_TEXT_LEN 256 | #define MESSAGE_TEXT_LEN 256 | ||||
struct mymsg { | struct testmsg { | ||||
long mtype; | long mtype; | ||||
char mtext[MESSAGE_TEXT_LEN]; | char mtext[MESSAGE_TEXT_LEN]; | ||||
}; | }; | ||||
const char *m1_str = "California is overrated."; | const char *m1_str = "California is overrated."; | ||||
const char *m2_str = "The quick brown fox jumped over the lazy dog."; | const char *m2_str = "The quick brown fox jumped over the lazy dog."; | ||||
size_t pgsize; | size_t pgsize; | ||||
#define MTYPE_1 1 | #define MTYPE_1 1 | ||||
#define MTYPE_1_ACK 2 | #define MTYPE_1_ACK 2 | ||||
#define MTYPE_2 3 | #define MTYPE_2 3 | ||||
#define MTYPE_2_ACK 4 | #define MTYPE_2_ACK 4 | ||||
pid_t child_pid; | pid_t child_pid; | ||||
key_t msgkey, semkey, shmkey; | key_t msgkey, semkey, shmkey; | ||||
int maxloop = 1; | int maxloop = 1; | ||||
#ifndef __FreeBSD__ | |||||
union semun { | union semun { | ||||
int val; /* value for SETVAL */ | int val; /* value for SETVAL */ | ||||
struct semid_ds *buf; /* buffer for IPC_{STAT,SET} */ | struct semid_ds *buf; /* buffer for IPC_{STAT,SET} */ | ||||
u_short *array; /* array for GETALL & SETALL */ | u_short *array; /* array for GETALL & SETALL */ | ||||
}; | }; | ||||
#endif | |||||
/* Writes an integer to a file. To be used from the body of the test | /* Writes an integer to a file. To be used from the body of the test | ||||
* cases below to pass any global identifiers to the cleanup routine. */ | * cases below to pass any global identifiers to the cleanup routine. */ | ||||
static void | static void | ||||
write_int(const char *path, const int value) | write_int(const char *path, const int value) | ||||
{ | { | ||||
int output; | int output; | ||||
▲ Show 20 Lines • Show All 59 Lines • ▼ Show 20 Lines | key_t get_ftok(int id) | ||||
ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp() failed: %d", errno); | ATF_REQUIRE_MSG(tmpdir != NULL, "mkdtemp() failed: %d", errno); | ||||
strlcpy(token_dir, tmpdir, sizeof(token_dir)); | strlcpy(token_dir, tmpdir, sizeof(token_dir)); | ||||
strlcpy(token_key, tmpdir, sizeof(token_key)); | strlcpy(token_key, tmpdir, sizeof(token_key)); | ||||
strlcat(token_key, "/token_key", sizeof(token_key)); | strlcat(token_key, "/token_key", sizeof(token_key)); | ||||
/* Create the file, since ftok() requires it to exist! */ | /* Create the file, since ftok() requires it to exist! */ | ||||
fd = open(token_key, O_RDWR | O_CREAT | O_EXCL); | fd = open(token_key, O_RDWR | O_CREAT | O_EXCL, 0600); | ||||
if (fd == -1) { | if (fd == -1) { | ||||
rmdir(tmpdir); | rmdir(tmpdir); | ||||
atf_tc_fail("open() of temp file failed: %d", errno); | atf_tc_fail("open() of temp file failed: %d", errno); | ||||
return (key_t)-1; | return (key_t)-1; | ||||
} else | } else | ||||
close(fd); | close(fd); | ||||
key = ftok(token_key, id); | key = ftok(token_key, id); | ||||
Show All 11 Lines | ATF_TC_HEAD(msg, tc) | ||||
atf_tc_set_md_var(tc, "timeout", "3"); | atf_tc_set_md_var(tc, "timeout", "3"); | ||||
atf_tc_set_md_var(tc, "descr", "Checks sysvmsg passing"); | atf_tc_set_md_var(tc, "descr", "Checks sysvmsg passing"); | ||||
} | } | ||||
ATF_TC_BODY(msg, tc) | ATF_TC_BODY(msg, tc) | ||||
{ | { | ||||
struct sigaction sa; | struct sigaction sa; | ||||
struct msqid_ds m_ds; | struct msqid_ds m_ds; | ||||
struct mymsg m; | struct testmsg m; | ||||
sigset_t sigmask; | sigset_t sigmask; | ||||
int sender_msqid; | int sender_msqid; | ||||
int loop; | int loop; | ||||
int c_status; | int c_status; | ||||
/* | /* | ||||
* Install a SIGSYS handler so that we can exit gracefully if | * Install a SIGSYS handler so that we can exit gracefully if | ||||
* System V Message Queue support isn't in the kernel. | * System V Message Queue support isn't in the kernel. | ||||
▲ Show 20 Lines • Show All 128 Lines • ▼ Show 20 Lines | ATF_TC_CLEANUP(msg, tc) | ||||
*/ | */ | ||||
sender_msqid = read_int("sender_msqid"); | sender_msqid = read_int("sender_msqid"); | ||||
if (sender_msqid != -1) | if (sender_msqid != -1) | ||||
if (msgctl(sender_msqid, IPC_RMID, NULL) == -1) | if (msgctl(sender_msqid, IPC_RMID, NULL) == -1) | ||||
err(1, "msgctl IPC_RMID"); | err(1, "msgctl IPC_RMID"); | ||||
} | } | ||||
void | void | ||||
print_msqid_ds(mp, mode) | print_msqid_ds(struct msqid_ds *mp, mode_t mode) | ||||
struct msqid_ds *mp; | |||||
mode_t mode; | |||||
{ | { | ||||
uid_t uid = geteuid(); | uid_t uid = geteuid(); | ||||
gid_t gid = getegid(); | gid_t gid = getegid(); | ||||
printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n", | printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n", | ||||
mp->msg_perm.uid, mp->msg_perm.gid, | mp->msg_perm.uid, mp->msg_perm.gid, | ||||
mp->msg_perm.cuid, mp->msg_perm.cgid, | mp->msg_perm.cuid, mp->msg_perm.cgid, | ||||
mp->msg_perm.mode & 0777); | mp->msg_perm.mode & 0777); | ||||
Show All 15 Lines | print_msqid_ds(struct msqid_ds *mp, mode_t mode) | ||||
ATF_REQUIRE_MSG(mp->msg_perm.gid == gid && mp->msg_perm.cgid == gid, | ATF_REQUIRE_MSG(mp->msg_perm.gid == gid && mp->msg_perm.cgid == gid, | ||||
"gid mismatch"); | "gid mismatch"); | ||||
ATF_REQUIRE_MSG((mp->msg_perm.mode & 0777) == mode, "mode mismatch"); | ATF_REQUIRE_MSG((mp->msg_perm.mode & 0777) == mode, "mode mismatch"); | ||||
} | } | ||||
void | void | ||||
receiver() | receiver(void) | ||||
{ | { | ||||
struct mymsg m; | struct testmsg m; | ||||
int msqid, loop; | int msqid, loop; | ||||
if ((msqid = msgget(msgkey, 0)) == -1) | if ((msqid = msgget(msgkey, 0)) == -1) | ||||
err(1, "receiver: msgget"); | err(1, "receiver: msgget"); | ||||
for (loop = 0; loop < maxloop; loop++) { | for (loop = 0; loop < maxloop; loop++) { | ||||
/* | /* | ||||
* Receive the first message, print it, and send an ACK. | * Receive the first message, print it, and send an ACK. | ||||
▲ Show 20 Lines • Show All 188 Lines • ▼ Show 20 Lines | ATF_TC_CLEANUP(sem, tc) | ||||
*/ | */ | ||||
sender_semid = read_int("sender_semid"); | sender_semid = read_int("sender_semid"); | ||||
if (sender_semid != -1) | if (sender_semid != -1) | ||||
if (semctl(sender_semid, 0, IPC_RMID) == -1) | if (semctl(sender_semid, 0, IPC_RMID) == -1) | ||||
err(1, "semctl IPC_RMID"); | err(1, "semctl IPC_RMID"); | ||||
} | } | ||||
void | void | ||||
print_semid_ds(sp, mode) | print_semid_ds(struct semid_ds *sp, mode_t mode) | ||||
struct semid_ds *sp; | |||||
mode_t mode; | |||||
{ | { | ||||
uid_t uid = geteuid(); | uid_t uid = geteuid(); | ||||
gid_t gid = getegid(); | gid_t gid = getegid(); | ||||
printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n", | printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n", | ||||
sp->sem_perm.uid, sp->sem_perm.gid, | sp->sem_perm.uid, sp->sem_perm.gid, | ||||
sp->sem_perm.cuid, sp->sem_perm.cgid, | sp->sem_perm.cuid, sp->sem_perm.cgid, | ||||
sp->sem_perm.mode & 0777); | sp->sem_perm.mode & 0777); | ||||
Show All 13 Lines | print_semid_ds(struct semid_ds *sp, mode_t mode) | ||||
ATF_REQUIRE_MSG(sp->sem_perm.gid == gid && sp->sem_perm.cgid == gid, | ATF_REQUIRE_MSG(sp->sem_perm.gid == gid && sp->sem_perm.cgid == gid, | ||||
"gid mismatch"); | "gid mismatch"); | ||||
ATF_REQUIRE_MSG((sp->sem_perm.mode & 0777) == mode, | ATF_REQUIRE_MSG((sp->sem_perm.mode & 0777) == mode, | ||||
"mode mismatch %o != %o", (sp->sem_perm.mode & 0777), mode); | "mode mismatch %o != %o", (sp->sem_perm.mode & 0777), mode); | ||||
} | } | ||||
void | void | ||||
waiter() | waiter(void) | ||||
{ | { | ||||
struct sembuf s; | struct sembuf s; | ||||
int semid; | int semid; | ||||
if ((semid = semget(semkey, 1, 0)) == -1) | if ((semid = semget(semkey, 1, 0)) == -1) | ||||
err(1, "waiter: semget"); | err(1, "waiter: semget"); | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 152 Lines • ▼ Show 20 Lines | ATF_TC_CLEANUP(shm, tc) | ||||
*/ | */ | ||||
sender_shmid = read_int("sender_shmid"); | sender_shmid = read_int("sender_shmid"); | ||||
if (sender_shmid != -1) | if (sender_shmid != -1) | ||||
if (shmctl(sender_shmid, IPC_RMID, NULL) == -1) | if (shmctl(sender_shmid, IPC_RMID, NULL) == -1) | ||||
err(1, "shmctl IPC_RMID"); | err(1, "shmctl IPC_RMID"); | ||||
} | } | ||||
void | void | ||||
print_shmid_ds(sp, mode) | print_shmid_ds(struct shmid_ds *sp, mode_t mode) | ||||
struct shmid_ds *sp; | |||||
mode_t mode; | |||||
{ | { | ||||
uid_t uid = geteuid(); | uid_t uid = geteuid(); | ||||
gid_t gid = getegid(); | gid_t gid = getegid(); | ||||
printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n", | printf("PERM: uid %d, gid %d, cuid %d, cgid %d, mode 0%o\n", | ||||
sp->shm_perm.uid, sp->shm_perm.gid, | sp->shm_perm.uid, sp->shm_perm.gid, | ||||
sp->shm_perm.cuid, sp->shm_perm.cgid, | sp->shm_perm.cuid, sp->shm_perm.cgid, | ||||
sp->shm_perm.mode & 0777); | sp->shm_perm.mode & 0777); | ||||
Show All 15 Lines | print_shmid_ds(struct shmid_ds *sp, mode_t mode) | ||||
ATF_REQUIRE_MSG(sp->shm_perm.gid == gid && sp->shm_perm.cgid == gid, | ATF_REQUIRE_MSG(sp->shm_perm.gid == gid && sp->shm_perm.cgid == gid, | ||||
"gid mismatch"); | "gid mismatch"); | ||||
ATF_REQUIRE_MSG((sp->shm_perm.mode & 0777) == mode, "mode mismatch"); | ATF_REQUIRE_MSG((sp->shm_perm.mode & 0777) == mode, "mode mismatch"); | ||||
} | } | ||||
void | void | ||||
sharer() | sharer(void) | ||||
{ | { | ||||
int shmid; | int shmid; | ||||
void *shm_buf; | void *shm_buf; | ||||
shmid = shmget(shmkey, pgsize, 0); | shmid = shmget(shmkey, pgsize, 0); | ||||
ATF_REQUIRE_MSG(shmid != -1, "receiver: shmget:%d", errno); | ATF_REQUIRE_MSG(shmid != -1, "receiver: shmget:%d", errno); | ||||
shm_buf = shmat(shmid, NULL, 0); | shm_buf = shmat(shmid, NULL, 0); | ||||
Show All 20 Lines |