]> cygwin.com Git - cygwin-apps/cygutils.git/blob - src/ipc/shmtool.c
Make coding style consistent throughout
[cygwin-apps/cygutils.git] / src / ipc / shmtool.c
1 /*****************************************************************************
2 Excerpt from "Linux Programmer's Guide - Chapter 6"
3 (C)opyright 1994-1995, Scott Burkett
4 *****************************************************************************
5 MODULE: shmtool.c
6 *****************************************************************************
7 A command line tool for tinkering with shared memory
8
9 *****************************************************************************/
10 /*
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15 *
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 * GNU General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 *
25 * See the COPYING file for license information.
26 */
27
28 #if HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #include "common.h"
33
34 #if HAVE_SYS_IPC_H
35 # include <sys/ipc.h>
36 #endif
37 #if HAVE_SYS_SHM_H
38 # include <sys/shm.h>
39 #endif
40
41 #define SEGSIZE 100
42
43 main (int argc, char *argv[])
44 {
45 key_t key;
46 int shmid, cntr;
47 char *segptr;
48
49 if (argc == 1)
50 usage ();
51
52 /* Create unique key via call to ftok() */
53 key = ftok (".", 'S');
54
55 /* Open the shared memory segment - create if necessary */
56 if ((shmid = shmget (key, SEGSIZE, IPC_CREAT | IPC_EXCL | 0666)) == -1)
57 {
58 printf ("Shared memory segment exists - opening as client\n");
59
60 /* Segment probably already exists - try as a client */
61 if ((shmid = shmget (key, SEGSIZE, 0)) == -1)
62 {
63 perror ("shmget");
64 exit (1);
65 }
66 }
67 else
68 {
69 printf ("Creating new shared memory segment\n");
70 }
71
72 /* Attach (map) the shared memory segment into the current process */
73 if ((segptr = shmat (shmid, 0, 0)) == ((char *) -1))
74 {
75 perror ("shmat");
76 exit (1);
77 }
78
79 switch (tolower (argv[1][0]))
80 {
81 case 'w':
82 writeshm (shmid, segptr, argv[2]);
83 break;
84 case 'r':
85 readshm (shmid, segptr);
86 break;
87 case 'd':
88 removeshm (shmid);
89 break;
90 case 'm':
91 changemode (shmid, argv[2]);
92 break;
93 default:
94 usage ();
95
96 }
97 }
98
99 writeshm (int shmid, char *segptr, char *text)
100 {
101 strcpy (segptr, text);
102 printf ("Done...\n");
103 }
104
105 readshm (int shmid, char *segptr)
106 {
107 printf ("segptr: %s\n", segptr);
108 }
109
110 removeshm (int shmid)
111 {
112 shmctl (shmid, IPC_RMID, 0);
113 printf ("Shared memory segment marked for deletion\n");
114 }
115
116 changemode (int shmid, char *mode)
117 {
118 struct shmid_ds myshmds;
119
120 /* Get current values for internal data structure */
121 shmctl (shmid, IPC_STAT, &myshmds);
122
123 /* Display old permissions */
124 printf ("Old permissions were: %o\n", myshmds.shm_perm.mode);
125
126 /* Convert and load the mode */
127 sscanf (mode, "%o", &myshmds.shm_perm.mode);
128
129 /* Update the mode */
130 shmctl (shmid, IPC_SET, &myshmds);
131
132 printf ("New permissions are : %o\n", myshmds.shm_perm.mode);
133 }
134
135 usage ()
136 {
137 fprintf (stderr, "shmtool - A utility for tinkering with shared memory\n");
138 fprintf (stderr, "\nUSAGE: shmtool (w)rite <text>\n");
139 fprintf (stderr, " (r)ead\n");
140 fprintf (stderr, " (d)elete\n");
141 fprintf (stderr, " (m)ode change <octal mode>\n");
142 exit (1);
143 }
This page took 0.040794 seconds and 5 git commands to generate.