source: trunk/src/seismic_processing/ewspectra/activate_module.c @ 4203

Revision 4203, 3.7 KB checked in by scott, 10 years ago (diff)

Added activate_module & its message type; modified ewspectra to use it

Line 
1/******************************************************************************
2 *
3 *      File:                   activate_module.c
4 *
5 *      Function:               Post a message to a specified module
6 *
7 *      Author(s):              Scott Hunter, ISTI
8 *
9 *      Source:                 Started anew.
10 *
11 *  Usage: activate_module <ModuleID> <Ring> [<arg> [<arg> ...]]
12 *
13 *      Change History:
14 *                      5/05/11 Started source
15 *     
16 *****************************************************************************/
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <time.h>
21#include <earthworm_defs.h>
22#include <math.h>
23#include <string.h>
24#include <kom.h>
25#include <ew_spectra.h>
26#include <transport.h>
27#include <ew_spectra_io.h>
28
29char *progname;
30
31/* Things to look up in the earthworm.h tables with getutil.c functions
32 **********************************************************************/
33static long          OutRingKey;    /* key of transport ring for output   */
34static unsigned char InstId;        /* local installation id              */
35static unsigned char MyModId;       /* Module Id for this program         */
36
37static  SHM_INFO  OutRegion;    /* shared memory region to use for output */
38
39MSG_LOGO  GetLogo;                      /* requesting module,type,instid */
40pid_t MyPid;        /* Our own pid, sent with heartbeat for restart purposes */
41       
42int static long    OutMsgSize;          /* size for output msgs    */
43
44int main(int argc, char **argv)
45{
46/* Other variables: */
47   MSG_LOGO      logo;   /* logo of retrieved message             */
48   char *outMsg, *sptr, midStr[20];
49   double start, stop;
50   int i;
51   unsigned char outModID;
52       
53        /* Look up installations of interest
54        ************************************/
55        if ( GetLocalInst( &InstId ) != 0 ) {
56          fprintf( stderr, "error getting local installation id; exiting!\n" );
57          exit( -1 );
58        }
59       
60        if ((progname= strrchr(*argv, (int) '/')) != (char *) 0)
61                progname++;
62        else
63                progname= *argv;
64       
65    /* Check command line arguments */
66    if (argc < 3) {
67                fprintf (stderr, "Usage: %s moduleid ring [arg [arg ...]]\n", progname);
68                return EW_FAILURE;
69    }
70   
71    if ( GetModId( argv[1], &outModID ) ) {
72                fprintf( stderr, "ModuleID '%s' unknown; exiting!\n", argv[1] );
73                exit( -1 );
74        }
75
76        if ( ( OutRingKey = GetKey(argv[2]) ) == -1 ) {
77                fprintf( stderr, "Invalid ring name <%s>; exiting!\n", argv[2]);
78                exit( -1 );
79        }
80
81        /* Build logo
82        *************/
83        logo.instid = InstId;
84        unsigned char ewsModId;
85        int getm = GetModId( "MOD_WILDCARD", &(logo.mod) );
86        int gett = GetType( "TYPE_ACTIVATE_MODULE", &(logo.type) );
87        if ( getm || gett ) {
88                if ( getm )
89                        fprintf( stderr, "MOD_WILDCARD unknown\n" );
90                if ( gett )
91                        fprintf( stderr, "TYPE_ACTIVATE_MODULE unknown\n" );
92                fprintf( stderr, "one or more missing definitions; exiting!\n" );
93                exit( -1 );
94        }
95
96        /* Attach to output ring
97        ************************/
98        tport_attach( &OutRegion, OutRingKey );
99       
100        /* Build & write out message
101        ****************************/
102        sprintf( midStr, "%d", outModID );
103        OutMsgSize = strlen(midStr);
104        for ( i=3; i<argc; i++ ) {
105                if ( strchr( argv[i], ' ' ) || strchr( argv[i], '\t' ) ) {
106                        fprintf( stderr, "Arg %d contains whitespace; exiting!\n", i-2 );
107                        exit(-1);
108                }
109                OutMsgSize += strlen(argv[i])+1;
110        }
111        outMsg = malloc( OutMsgSize );
112        if ( outMsg == NULL ) {
113                fprintf( stderr, "Failed to allocate space for message; exiting!\n" );
114                exit(-1);
115        }
116        sprintf( outMsg, "%d", outModID );
117        sptr = outMsg+strlen(midStr);
118        for ( i=3; i<argc; i++ ) {
119                char *aptr = argv[i];
120                *(sptr++) = ' ';
121                for ( ; *aptr; aptr++, sptr++ )
122                        *sptr = *aptr;
123        }
124        *sptr = 0;
125        if( tport_putmsg( &OutRegion, &logo, OutMsgSize, outMsg ) != PUT_OK )
126        fprintf( stderr, "Error posting message\n" );
127    else
128        printf( "Writing '%s'\n", outMsg );
129               
130        /* Clean up after ourselves
131        ************************/
132        tport_detach( &OutRegion );
133}
Note: See TracBrowser for help on using the repository browser.