]> cygwin.com Git - cygwin-apps/cygutils.git/blame - src/ipc/msgtool.c
rebootstrap
[cygwin-apps/cygutils.git] / src / ipc / msgtool.c
CommitLineData
d4a28ab0
CW
1/*****************************************************************************
2 Excerpt from "Linux Programmer's Guide - Chapter 6"
3 (C)opyright 1994-1995, Scott Burkett
4 *****************************************************************************
5 MODULE: msgtool.c
6 *****************************************************************************
7 A command line tool for tinkering with SysV style Message Queues
8 *****************************************************************************/
bd695173
CW
9/*
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
23 *
24 * See the COPYING file for license information.
25 */
26
27#if HAVE_CONFIG_H
28# include "config.h"
29#endif
d4a28ab0 30
d2b03e6a 31#include "common.h"
bd695173
CW
32
33#if HAVE_SYS_IPC_H
34# include <sys/ipc.h>
35#endif
36#if HAVE_SYS_MSG_H
37# include <sys/msg.h>
38#endif
d4a28ab0
CW
39
40#define MAX_SEND_SIZE 80
41
42struct mymsgbuf {
43 long mtype;
44 char mtext[MAX_SEND_SIZE];
45};
46
47void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text);
48void read_message(int qid, struct mymsgbuf *qbuf, long type);
49void remove_queue(int qid);
50void change_queue_mode(int qid, char *mode);
51void usage(void);
52
53
54int main(int argc, char *argv[])
55{
56 key_t key;
57 int msgqueue_id;
58 struct mymsgbuf qbuf;
59
60 if(argc == 1)
61 usage();
62
63 /* Create unique key via call to ftok() */
64 key = ftok(".", 'm');
65
66 /* Open the queue - create if necessary */
67 if((msgqueue_id = msgget(key, IPC_CREAT|0660)) == -1) {
68 perror("msgget");
69 exit(1);
70 }
71
72 switch(tolower(argv[1][0]))
73 {
74 case 's': send_message(msgqueue_id, (struct mymsgbuf *)&qbuf,
75 atol(argv[2]), argv[3]);
76 break;
77 case 'r': read_message(msgqueue_id, &qbuf, atol(argv[2]));
78 break;
79 case 'd': remove_queue(msgqueue_id);
80 break;
81 case 'm': change_queue_mode(msgqueue_id, argv[2]);
82 break;
83
84 default: usage();
85
86 }
87
88 return(0);
89}
90
91void send_message(int qid, struct mymsgbuf *qbuf, long type, char *text)
92{
93 /* Send a message to the queue */
94 printf("Sending a message ...\n");
95 qbuf->mtype = type;
96 strcpy(qbuf->mtext, text);
97
98 if((msgsnd(qid, (struct msgbuf *)qbuf,
99 strlen(qbuf->mtext)+1, 0)) ==-1)
100 {
101 perror("msgsnd");
102 exit(1);
103 }
104}
105
106void read_message(int qid, struct mymsgbuf *qbuf, long type)
107{
108 /* Read a message from the queue */
109 printf("Reading a message ...\n");
110 qbuf->mtype = type;
111 msgrcv(qid, (struct msgbuf *)qbuf, MAX_SEND_SIZE, type, 0);
112
113 printf("Type: %ld Text: %s\n", qbuf->mtype, qbuf->mtext);
114}
115
116void remove_queue(int qid)
117{
118 /* Remove the queue */
119 msgctl(qid, IPC_RMID, 0);
120}
121
122void change_queue_mode(int qid, char *mode)
123{
124 struct msqid_ds myqueue_ds;
125
126 /* Get current info */
127 msgctl(qid, IPC_STAT, &myqueue_ds);
128
129 /* Convert and load the mode */
130 sscanf(mode, "%ho", &myqueue_ds.msg_perm.mode);
131
132 /* Update the mode */
133 msgctl(qid, IPC_SET, &myqueue_ds);
134}
135
136void usage(void)
137{
138 fprintf(stderr, "msgtool - A utility for tinkering with msg queues\n");
139 fprintf(stderr, "\nUSAGE: msgtool (s)end <type> <messagetext>\n");
140 fprintf(stderr, " (r)ecv <type>\n");
141 fprintf(stderr, " (d)elete\n");
142 fprintf(stderr, " (m)ode <octal mode>\n");
143 exit(1);
d2b03e6a 144}
This page took 0.035433 seconds and 5 git commands to generate.