blob: 2c66ae60f3e5e418d4045d44bd907ee959ade588 [file] [log] [blame]
/*
* Copyright (C) Bull S.A. 1996
* Copyright (c) International Business Machines Corp., 2001
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/*---------------------------------------------------------------------+
| message_queue_test_05 |
| ==================================================================== |
| |
| Description: Creates N message queues. Creates three and deletes |
| one until N is reached. |
| |
| Algorithm: o Loop until N message queues have been created |
| - Create three message queues |
| - Delete one message queue |
| |
| o Delete all of the message queues |
| |
| System calls: The following system calls are made |
| |
| o msgctl () - provides message control operations |
| o msgget () - gets a message queue identifier |
| |
| Usage: message_queue_test_05 [-n num_queues] [-d] |
| |
| where: [-n] number of message queues to create |
| [-d] debug option |
| |
| To compile: cc -o message_queue_test_05 message_queue_test_05. |
| |
| Last update: Ver. 1.2, 2/26/94 14:10:17 |
| |
| Change Activity |
| |
| Version Date Name Reason |
| 0.1 032789 CTU Initial version |
| 1.2 111993 DJK Modify for AIX version 4.1 |
| 1.3 022694 DJK Moved to Prod directory |
| |
+---------------------------------------------------------------------*/
#include <errno.h>
#include <fcntl.h>
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/ipc.h>
#ifdef _LINUX_
// defines struct msgbuf
#define __USE_GNU
#endif
#include <sys/msg.h>
#include <sys/types.h>
/*
* Defines
*
* MAX_MESSAGE_QUEUES: maximum number of message queues to create
*
* DEFAULT_MESSAGE_QUEUES: default number of message queues to create
* unless specified with [-n] command line option
*
* USAGE: usage statement macro
*/
#ifdef _LINUX_
#define MAX_MESSAGE_QUEUES 128
#define DEFAULT_MESSAGE_QUEUES 10
#else
#define MAX_MESSAGE_QUEUES 4096
#define DEFAULT_MESSAGE_QUEUES 1000
#endif
#define USAGE "\nUsage: %s [-n num_message_queues] [-d]\n\n"
/*
* Function prototypes
*
* parse_args (): Parse command line arguments
* sys_error (): System error message function
* error (): Error message function
* cleanup (): Cleanup function for the test
*/
static void parse_args (int, char **);
static void sys_error (const char *, int);
static void error (const char *, int);
static void cleanup (int qnum);
/*
* Global variables
*
* max_queues: maximum number of message queues allowed (system limit)
* msqid_array: array containing the unique message queue identifiers
* debug: debugging flag, set with [-d] command line option
*/
int max_queues = DEFAULT_MESSAGE_QUEUES;
int msqid_array [MAX_MESSAGE_QUEUES];
int debug = 0;
/*---------------------------------------------------------------------+
| main |
| ==================================================================== |
| |
| Function: Main program (see prolog for more details) |
| |
| Returns: (0) Successful completion |
| (-1) Error occurred |
| |
+---------------------------------------------------------------------*/
int main (int argc, char **argv)
{
int nqueues = 0; /* Current number of message queues */
int i; /* Loop index */
int mode = 0777; /* Misc mode bits */
/*
* Parse command line arguments and print out program header
*/
parse_args (argc, argv);
printf ("%s: IPC Message Queue TestSuite program\n", *argv);
printf ("\n\tCreating %d message queues ...\n", max_queues);
while (nqueues < max_queues) {
for (i=0; i<3; i++) {
if (debug) printf ("\tcreating queue [%d]\n", nqueues);
if ((msqid_array [nqueues++]
= msgget (IPC_PRIVATE, IPC_CREAT|mode)) < 0)
{
cleanup(nqueues);
sys_error ("msgget failed", __LINE__);
}
if (nqueues > MAX_MESSAGE_QUEUES)
break;
}
/*
* Delete the last message queue...
*/
if (msgctl (msqid_array [--nqueues], IPC_RMID, 0) < 0)
sys_error ("msgctl (IPC_RMID) failed", __LINE__);
if (debug) printf ("\tremoved queue [%d]\n", nqueues);
}
printf ("\n\tAll message queues created successfully\n");
cleanup(nqueues);
printf ("\nsuccessful!\n");
return (0);
}
/*---------------------------------------------------------------------+
| parse_args () |
| ==================================================================== |
| |
| Function: Parse the command line arguments & initialize global |
| variables. |
| |
| Updates: (command line options) |
| |
| [-n] num: number of message queues to create |
| |
+---------------------------------------------------------------------*/
static void parse_args (int argc, char **argv)
{
int opt;
int errflag = 0;
char *program_name = *argv;
extern char *optarg; /* Command line option */
/*
* Parse command line options.
*/
while ((opt = getopt(argc, argv, "n:d")) != EOF) {
switch (opt) {
case 'n': /* number of queues to create */
max_queues = atoi (optarg);
break;
case 'd': /* debug */
debug++;
break;
default:
errflag++;
break;
}
}
if (max_queues > MAX_MESSAGE_QUEUES)
errflag++;
if (errflag) {
fprintf (stderr, USAGE, program_name);
exit (2);
}
}
/*---------------------------------------------------------------------+
| sys_error () |
| ==================================================================== |
| |
| Function: Creates system error message and calls error () |
| |
+---------------------------------------------------------------------*/
static void sys_error (const char *msg, int line)
{
char syserr_msg [256];
sprintf (syserr_msg, "%s: %s\n", msg, strerror (errno));
error (syserr_msg, line);
}
/*---------------------------------------------------------------------+
| error () |
| ==================================================================== |
| |
| Function: Prints out message and exits... |
| |
+---------------------------------------------------------------------*/
static void error (const char *msg, int line)
{
fprintf (stderr, "ERROR [line: %d] %s\n", line, msg);
exit (-1);
}
/*---------------------------------------------------------------------+
| cleanup() |
| ==================================================================== |
| cleanup() - performs all message queues cleanup for this test at |
| completion or premature exit. |
| Remove the temporary message queues created. |
| |
+---------------------------------------------------------------------*/
void cleanup(int qnum)
{
/*
* Remove the allocated message queues.
*/
while (qnum > 0) {
if (msqid_array [--qnum] < 0)
continue;
if (msgctl (msqid_array [qnum], IPC_RMID, 0) < 0)
sys_error ("msgctl (IPC_RMID) failed", __LINE__);
if (debug) printf ("\tremoved queue [%d]\n", qnum);
}
}