140266059SGregory Neil Shapiro /*
25dd76dd0SGregory Neil Shapiro * Copyright (c) 2000-2002, 2004, 2005 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro * All rights reserved.
440266059SGregory Neil Shapiro *
540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set
640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of
740266059SGregory Neil Shapiro * the sendmail distribution.
840266059SGregory Neil Shapiro */
940266059SGregory Neil Shapiro
1040266059SGregory Neil Shapiro #include <sm/gen.h>
114313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: t-shm.c,v 1.23 2013-11-22 20:51:43 ca Exp $")
1240266059SGregory Neil Shapiro
1340266059SGregory Neil Shapiro #include <stdio.h>
1440266059SGregory Neil Shapiro
1540266059SGregory Neil Shapiro #if SM_CONF_SHM
1640266059SGregory Neil Shapiro # include <stdlib.h>
1740266059SGregory Neil Shapiro # include <unistd.h>
1840266059SGregory Neil Shapiro # include <sys/wait.h>
1940266059SGregory Neil Shapiro
2040266059SGregory Neil Shapiro # include <sm/heap.h>
2140266059SGregory Neil Shapiro # include <sm/string.h>
2240266059SGregory Neil Shapiro # include <sm/test.h>
23*2fb4f839SGregory Neil Shapiro # include <sm/conf.h>
2440266059SGregory Neil Shapiro # include <sm/shm.h>
2540266059SGregory Neil Shapiro
2640266059SGregory Neil Shapiro # define SHMSIZE 1024
2740266059SGregory Neil Shapiro # define SHM_MAX 6400000
2840266059SGregory Neil Shapiro # define T_SHMKEY 21
2940266059SGregory Neil Shapiro
3040266059SGregory Neil Shapiro
3140266059SGregory Neil Shapiro /*
3240266059SGregory Neil Shapiro ** SHMINTER -- interactive testing of shared memory
3340266059SGregory Neil Shapiro **
3440266059SGregory Neil Shapiro ** Parameters:
3540266059SGregory Neil Shapiro ** owner -- create segment.
3640266059SGregory Neil Shapiro **
3740266059SGregory Neil Shapiro ** Returns:
3840266059SGregory Neil Shapiro ** 0 on success
3940266059SGregory Neil Shapiro ** < 0 on failure.
4040266059SGregory Neil Shapiro */
4140266059SGregory Neil Shapiro
4240266059SGregory Neil Shapiro int shminter __P((bool));
4340266059SGregory Neil Shapiro
4440266059SGregory Neil Shapiro int
shminter(owner)4540266059SGregory Neil Shapiro shminter(owner)
4640266059SGregory Neil Shapiro bool owner;
4740266059SGregory Neil Shapiro {
4840266059SGregory Neil Shapiro int *shm, shmid;
49e92d3f3fSGregory Neil Shapiro int i, t;
5040266059SGregory Neil Shapiro
5140266059SGregory Neil Shapiro shm = (int *) sm_shmstart(T_SHMKEY, SHMSIZE, 0, &shmid, owner);
5240266059SGregory Neil Shapiro if (shm == (int *) 0)
5340266059SGregory Neil Shapiro {
5440266059SGregory Neil Shapiro perror("shminit failed");
5540266059SGregory Neil Shapiro return -1;
5640266059SGregory Neil Shapiro }
5740266059SGregory Neil Shapiro
5840266059SGregory Neil Shapiro while ((t = getchar()) != EOF)
5940266059SGregory Neil Shapiro {
6040266059SGregory Neil Shapiro switch (t)
6140266059SGregory Neil Shapiro {
6240266059SGregory Neil Shapiro case 'c':
6340266059SGregory Neil Shapiro *shm = 0;
6440266059SGregory Neil Shapiro break;
6540266059SGregory Neil Shapiro case 'i':
6640266059SGregory Neil Shapiro ++*shm;
6740266059SGregory Neil Shapiro break;
6840266059SGregory Neil Shapiro case 'd':
6940266059SGregory Neil Shapiro --*shm;
7040266059SGregory Neil Shapiro break;
7140266059SGregory Neil Shapiro case 's':
7240266059SGregory Neil Shapiro sleep(1);
7340266059SGregory Neil Shapiro break;
7440266059SGregory Neil Shapiro case 'l':
7540266059SGregory Neil Shapiro t = *shm;
7640266059SGregory Neil Shapiro for (i = 0; i < SHM_MAX; i++)
7740266059SGregory Neil Shapiro {
7840266059SGregory Neil Shapiro ++*shm;
7940266059SGregory Neil Shapiro }
8040266059SGregory Neil Shapiro if (*shm != SHM_MAX + t)
8140266059SGregory Neil Shapiro fprintf(stderr, "error: %d != %d\n",
8240266059SGregory Neil Shapiro *shm, SHM_MAX + t);
8340266059SGregory Neil Shapiro break;
8440266059SGregory Neil Shapiro case 'v':
8540266059SGregory Neil Shapiro printf("shmval: %d\n", *shm);
8640266059SGregory Neil Shapiro break;
8713d88268SGregory Neil Shapiro case 'S':
8813d88268SGregory Neil Shapiro i = sm_shmsetowner(shmid, getuid(), getgid(), 0644);
8913d88268SGregory Neil Shapiro printf("sm_shmsetowner=%d\n", i);
9013d88268SGregory Neil Shapiro break;
9140266059SGregory Neil Shapiro }
9240266059SGregory Neil Shapiro }
9340266059SGregory Neil Shapiro return sm_shmstop((void *) shm, shmid, owner);
9440266059SGregory Neil Shapiro }
9540266059SGregory Neil Shapiro
9640266059SGregory Neil Shapiro
9740266059SGregory Neil Shapiro /*
9840266059SGregory Neil Shapiro ** SHMBIG -- testing of shared memory
9940266059SGregory Neil Shapiro **
10040266059SGregory Neil Shapiro ** Parameters:
10140266059SGregory Neil Shapiro ** owner -- create segment.
10240266059SGregory Neil Shapiro ** size -- size of segment.
10340266059SGregory Neil Shapiro **
10440266059SGregory Neil Shapiro ** Returns:
10540266059SGregory Neil Shapiro ** 0 on success
10640266059SGregory Neil Shapiro ** < 0 on failure.
10740266059SGregory Neil Shapiro */
10840266059SGregory Neil Shapiro
10940266059SGregory Neil Shapiro int shmbig __P((bool, int));
11040266059SGregory Neil Shapiro
11140266059SGregory Neil Shapiro int
shmbig(owner,size)11240266059SGregory Neil Shapiro shmbig(owner, size)
11340266059SGregory Neil Shapiro bool owner;
11440266059SGregory Neil Shapiro int size;
11540266059SGregory Neil Shapiro {
11640266059SGregory Neil Shapiro int *shm, shmid;
11740266059SGregory Neil Shapiro int i;
11840266059SGregory Neil Shapiro
11940266059SGregory Neil Shapiro shm = (int *) sm_shmstart(T_SHMKEY, size, 0, &shmid, owner);
12040266059SGregory Neil Shapiro if (shm == (int *) 0)
12140266059SGregory Neil Shapiro {
12240266059SGregory Neil Shapiro perror("shminit failed");
12340266059SGregory Neil Shapiro return -1;
12440266059SGregory Neil Shapiro }
12540266059SGregory Neil Shapiro
12640266059SGregory Neil Shapiro for (i = 0; i < size / sizeof(int); i++)
12740266059SGregory Neil Shapiro shm[i] = i;
12840266059SGregory Neil Shapiro for (i = 0; i < size / sizeof(int); i++)
12940266059SGregory Neil Shapiro {
13040266059SGregory Neil Shapiro if (shm[i] != i)
13140266059SGregory Neil Shapiro {
13240266059SGregory Neil Shapiro fprintf(stderr, "failed at %d: %d", i, shm[i]);
13340266059SGregory Neil Shapiro }
13440266059SGregory Neil Shapiro }
13540266059SGregory Neil Shapiro
13640266059SGregory Neil Shapiro return sm_shmstop((void *) shm, shmid, owner);
13740266059SGregory Neil Shapiro }
13840266059SGregory Neil Shapiro
13940266059SGregory Neil Shapiro
14040266059SGregory Neil Shapiro /*
14140266059SGregory Neil Shapiro ** SHMTEST -- test of shared memory
14240266059SGregory Neil Shapiro **
14340266059SGregory Neil Shapiro ** Parameters:
14440266059SGregory Neil Shapiro ** owner -- create segment.
14540266059SGregory Neil Shapiro **
14640266059SGregory Neil Shapiro ** Returns:
14740266059SGregory Neil Shapiro ** 0 on success
14840266059SGregory Neil Shapiro ** < 0 on failure.
14940266059SGregory Neil Shapiro */
15040266059SGregory Neil Shapiro
15140266059SGregory Neil Shapiro # define MAX_CNT 10
15240266059SGregory Neil Shapiro
153b6bacd31SGregory Neil Shapiro int shmtest __P((int));
154b6bacd31SGregory Neil Shapiro
15540266059SGregory Neil Shapiro int
shmtest(owner)15640266059SGregory Neil Shapiro shmtest(owner)
15740266059SGregory Neil Shapiro int owner;
15840266059SGregory Neil Shapiro {
15940266059SGregory Neil Shapiro int *shm, shmid;
16040266059SGregory Neil Shapiro int cnt = 0;
16140266059SGregory Neil Shapiro
16240266059SGregory Neil Shapiro shm = (int *) sm_shmstart(T_SHMKEY, SHMSIZE, 0, &shmid, owner);
16340266059SGregory Neil Shapiro if (shm == (int *) 0)
16440266059SGregory Neil Shapiro {
16540266059SGregory Neil Shapiro perror("shminit failed");
16640266059SGregory Neil Shapiro return -1;
16740266059SGregory Neil Shapiro }
16840266059SGregory Neil Shapiro
16940266059SGregory Neil Shapiro if (owner)
17040266059SGregory Neil Shapiro {
17140266059SGregory Neil Shapiro int r;
17240266059SGregory Neil Shapiro
17313d88268SGregory Neil Shapiro r = sm_shmsetowner(shmid, getuid(), getgid(), 0660);
17413d88268SGregory Neil Shapiro SM_TEST(r == 0);
17540266059SGregory Neil Shapiro *shm = 1;
17640266059SGregory Neil Shapiro while (*shm == 1 && cnt++ < MAX_CNT)
17740266059SGregory Neil Shapiro sleep(1);
17840266059SGregory Neil Shapiro SM_TEST(cnt <= MAX_CNT);
17940266059SGregory Neil Shapiro
18040266059SGregory Neil Shapiro /* release and re-acquire the segment */
18140266059SGregory Neil Shapiro r = sm_shmstop((void *) shm, shmid, owner);
18240266059SGregory Neil Shapiro SM_TEST(r == 0);
18340266059SGregory Neil Shapiro shm = (int *) sm_shmstart(T_SHMKEY, SHMSIZE, 0, &shmid, owner);
18440266059SGregory Neil Shapiro SM_TEST(shm != (int *) 0);
18540266059SGregory Neil Shapiro }
18640266059SGregory Neil Shapiro else
18740266059SGregory Neil Shapiro {
18840266059SGregory Neil Shapiro while (*shm != 1 && cnt++ < MAX_CNT)
18940266059SGregory Neil Shapiro sleep(1);
19040266059SGregory Neil Shapiro SM_TEST(cnt <= MAX_CNT);
19140266059SGregory Neil Shapiro *shm = 2;
19240266059SGregory Neil Shapiro
19340266059SGregory Neil Shapiro /* wait a momemt so the segment is still in use */
19440266059SGregory Neil Shapiro sleep(2);
19540266059SGregory Neil Shapiro }
19640266059SGregory Neil Shapiro return sm_shmstop((void *) shm, shmid, owner);
19740266059SGregory Neil Shapiro }
19840266059SGregory Neil Shapiro
19940266059SGregory Neil Shapiro int
main(argc,argv)20040266059SGregory Neil Shapiro main(argc, argv)
20140266059SGregory Neil Shapiro int argc;
20240266059SGregory Neil Shapiro char *argv[];
20340266059SGregory Neil Shapiro {
20440266059SGregory Neil Shapiro bool interactive = false;
20540266059SGregory Neil Shapiro bool owner = false;
20640266059SGregory Neil Shapiro int big = -1;
20740266059SGregory Neil Shapiro int ch;
20840266059SGregory Neil Shapiro int r = 0;
20940266059SGregory Neil Shapiro int status;
21040266059SGregory Neil Shapiro extern char *optarg;
21140266059SGregory Neil Shapiro
21240266059SGregory Neil Shapiro # define OPTIONS "b:io"
21340266059SGregory Neil Shapiro while ((ch = getopt(argc, argv, OPTIONS)) != -1)
21440266059SGregory Neil Shapiro {
21540266059SGregory Neil Shapiro switch ((char) ch)
21640266059SGregory Neil Shapiro {
21740266059SGregory Neil Shapiro case 'b':
21840266059SGregory Neil Shapiro big = atoi(optarg);
21940266059SGregory Neil Shapiro break;
22040266059SGregory Neil Shapiro
22140266059SGregory Neil Shapiro case 'i':
22240266059SGregory Neil Shapiro interactive = true;
22340266059SGregory Neil Shapiro break;
22440266059SGregory Neil Shapiro
22540266059SGregory Neil Shapiro case 'o':
22640266059SGregory Neil Shapiro owner = true;
22740266059SGregory Neil Shapiro break;
22840266059SGregory Neil Shapiro
22940266059SGregory Neil Shapiro default:
23040266059SGregory Neil Shapiro break;
23140266059SGregory Neil Shapiro }
23240266059SGregory Neil Shapiro }
23340266059SGregory Neil Shapiro
23440266059SGregory Neil Shapiro if (interactive)
23540266059SGregory Neil Shapiro r = shminter(owner);
23640266059SGregory Neil Shapiro else if (big > 0)
23740266059SGregory Neil Shapiro r = shmbig(true, big);
23840266059SGregory Neil Shapiro else
23940266059SGregory Neil Shapiro {
24040266059SGregory Neil Shapiro pid_t pid;
241605302a5SGregory Neil Shapiro extern int SmTestNumErrors;
24240266059SGregory Neil Shapiro
24340266059SGregory Neil Shapiro if ((pid = fork()) < 0)
24440266059SGregory Neil Shapiro {
24540266059SGregory Neil Shapiro perror("fork failed\n");
24640266059SGregory Neil Shapiro return -1;
24740266059SGregory Neil Shapiro }
24840266059SGregory Neil Shapiro
24940266059SGregory Neil Shapiro sm_test_begin(argc, argv, "test shared memory");
25040266059SGregory Neil Shapiro if (pid == 0)
25140266059SGregory Neil Shapiro {
25240266059SGregory Neil Shapiro /* give the parent the chance to setup data */
25340266059SGregory Neil Shapiro sleep(1);
25440266059SGregory Neil Shapiro r = shmtest(false);
25540266059SGregory Neil Shapiro }
25640266059SGregory Neil Shapiro else
25740266059SGregory Neil Shapiro {
25840266059SGregory Neil Shapiro r = shmtest(true);
25940266059SGregory Neil Shapiro (void) wait(&status);
26040266059SGregory Neil Shapiro }
26140266059SGregory Neil Shapiro SM_TEST(r == 0);
262605302a5SGregory Neil Shapiro if (SmTestNumErrors > 0)
263605302a5SGregory Neil Shapiro printf("add -DSM_CONF_SHM=0 to confENVDEF in devtools/Site/site.config.m4\nand start over.\n");
26440266059SGregory Neil Shapiro return sm_test_end();
26540266059SGregory Neil Shapiro }
26640266059SGregory Neil Shapiro return r;
26740266059SGregory Neil Shapiro }
26840266059SGregory Neil Shapiro #else /* SM_CONF_SHM */
26940266059SGregory Neil Shapiro int
27040266059SGregory Neil Shapiro main(argc, argv)
27140266059SGregory Neil Shapiro int argc;
27240266059SGregory Neil Shapiro char *argv[];
27340266059SGregory Neil Shapiro {
27440266059SGregory Neil Shapiro printf("No support for shared memory configured on this machine\n");
27540266059SGregory Neil Shapiro return 0;
27640266059SGregory Neil Shapiro }
27740266059SGregory Neil Shapiro #endif /* SM_CONF_SHM */
278