X-Git-Url: http://nsz.repo.hu/git/?p=libc-test;a=blobdiff_plain;f=src%2Ffunctional%2Fipc_shm.c;fp=src%2Ffunctional%2Fipc_shm.c;h=7d0086b67bd65b0428b2e9fcd575679c1fbe9425;hp=0000000000000000000000000000000000000000;hb=2cf89517c5b25c2524fe0c0c01ed277d7307a852;hpb=e248db1c46f61cf34548e739bc6ff106013b1ba2 diff --git a/src/functional/ipc_shm.c b/src/functional/ipc_shm.c new file mode 100644 index 0000000..7d0086b --- /dev/null +++ b/src/functional/ipc_shm.c @@ -0,0 +1,117 @@ +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 700 +#endif +#include +#include +#include +#include +#include +#include +#include +#include +#include "test.h" + +static const char path[] = "."; +static const int id = 'x'; + +#define T(f) do{ \ + if ((f)+1 == 0) \ + error("%s failed: %s\n", #f, strerror(errno)); \ +}while(0) + +#define EQ(a,b,fmt) do{ \ + if ((a) != (b)) \ + error("%s == %s failed: " fmt "\n", #a, #b, a, b); \ +}while(0) + +static void set() +{ + time_t t; + key_t k; + int shmid; + struct shmid_ds shmid_ds; + void *p; + + T(t = time(0)); + T(k = ftok(path, id)); + + /* make sure we get a clean shared memory id */ + T(shmid = shmget(k, 100, IPC_CREAT|0666)); + T(shmctl(shmid, IPC_RMID, 0)); + T(shmid = shmget(k, 100, IPC_CREAT|IPC_EXCL|0666)); + + if (test_status) + exit(test_status); + + /* check IPC_EXCL */ + errno = 0; + if (shmget(k, 100, IPC_CREAT|IPC_EXCL|0666) != -1 || errno != EEXIST) + error("shmget(IPC_CREAT|IPC_EXCL) should have failed with EEXIST, got %s\n", strerror(errno)); + + /* check if shmget initilaized the msshmid_ds structure correctly */ + T(shmctl(shmid, IPC_STAT, &shmid_ds)); + EQ(shmid_ds.shm_perm.cuid, geteuid(), "got %d, want %d"); + EQ(shmid_ds.shm_perm.uid, geteuid(), "got %d, want %d"); + EQ(shmid_ds.shm_perm.cgid, getegid(), "got %d, want %d"); + EQ(shmid_ds.shm_perm.gid, getegid(), "got %d, want %d"); + EQ(shmid_ds.shm_perm.mode & 0x1ff, 0666, "got %o, want %o"); + EQ(shmid_ds.shm_segsz, 100, "got %d, want %d"); + EQ(shmid_ds.shm_lpid, 0, "got %d, want %d"); + EQ(shmid_ds.shm_cpid, getpid(), "got %d, want %d"); + EQ((int)shmid_ds.shm_nattch, 0, "got %d, want %d"); + EQ((long)shmid_ds.shm_atime, 0, "got %ld, want %d"); + EQ((long)shmid_ds.shm_dtime, 0, "got %ld, want %d"); + if (shmid_ds.shm_ctime < t) + error("shmid_ds.shm_ctime >= t failed: got %ld, want %ld\n", (long)shmid_ds.shm_ctime, (long)t); + + /* test attach */ + if ((p=shmat(shmid, 0, 0)) == 0) + error("shmat failed: %s\n", strerror(errno)); + T(shmctl(shmid, IPC_STAT, &shmid_ds)); + EQ((int)shmid_ds.shm_nattch, 1, "got %d, want %d"); + EQ(shmid_ds.shm_lpid, getpid(), "got %d, want %d"); + if (shmid_ds.shm_atime < t) + error("shm_atime is %ld want >= %ld\n", (long)shmid_ds.shm_atime, (long)t); + strcpy(p, "test data"); + T(shmdt(p)); +} + +static void get() +{ + key_t k; + int shmid; + void *p; + + T(k = ftok(path, id)); + T(shmid = shmget(k, 0, 0)); + + errno = 0; + if ((p=shmat(shmid, 0, SHM_RDONLY)) == 0) + error("shmat failed: %s\n", strerror(errno)); + + if (strcmp(p, "test data") != 0) + error("reading shared mem failed: got \"%.100s\" want \"test data\"\n", p); + + /* cleanup */ + T(shmdt(p)); + T(shmctl(shmid, IPC_RMID, 0)); +} + +int main(void) +{ + int p; + int status; + + set(); + p = fork(); + if (p == -1) + error("fork failed: %s\n", strerror(errno)); + else if (p == 0) + get(); + else { + T(waitpid(p, &status, 0)); + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) + error("child exit status: %d\n", status); + } + return test_status; +}