source: trunk/src/archiving/ew2mseed/ew2mseed.c @ 7220

Revision 7220, 19.2 KB checked in by baker, 7 months ago (diff)

fix logit() format mismatches

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1#define _XOPEN_SOURCE 500
2 
3/*=====================================================================
4// Copyright (C) 2000-2010 Instrumental Software Technologies, Inc.
5//
6// Redistribution and use in source and binary forms, with or without
7// modification, are permitted provided that the following conditions
8// are met:
9// 1. Redistributions of source code, or portions of this source code,
10//    must retain the above copyright notice, this list of conditions
11//    and the following disclaimer.
12// 2. Redistributions in binary form must reproduce the above copyright
13//    notice, this list of conditions and the following disclaimer in
14//    the documentation and/or other materials provided with the
15//    distribution.
16// 3. All advertising materials mentioning features or use of this
17//    software must display the following acknowledgment:
18//    "This product includes software developed by Instrumental
19//    Software Technologies, Inc. (http://www.isti.com)"
20// 4. If the software is provided with, or as part of a commercial
21//    product, or is used in other commercial software products the
22//    customer must be informed that "This product includes software
23//    developed by Instrumental Software Technologies, Inc.
24//    (http://www.isti.com)"
25// 5. The names "Instrumental Software Technologies, Inc." and "ISTI"
26//    must not be used to endorse or promote products derived from
27//    this software without prior written permission. For written
28//    permission, please contact "info@isti.com".
29// 6. Products derived from this software may not be called "ISTI"
30//    nor may "ISTI" appear in their names without prior written
31//    permission of Instrumental Software Technologies, Inc.
32// 7. Redistributions of any form whatsoever must retain the following
33//    acknowledgment:
34//    "This product includes software developed by Instrumental
35//    Software Technologies, Inc. (http://www.isti.com/)."
36// THIS SOFTWARE IS PROVIDED BY INSTRUMENTAL SOFTWARE
37// TECHNOLOGIES, INC. "AS IS" AND ANY EXPRESSED OR IMPLIED
38// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
39// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
40// DISCLAIMED.  IN NO EVENT SHALL INSTRUMENTAL SOFTWARE TECHNOLOGIES,
41// INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
42// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
43// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
44// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
45// HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
46// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
47// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
48// OF THE POSSIBILITY OF SUCH DAMAGE.
49//=====================================================================
50//  A current version of the software can be found at
51//                http://www.isti.com
52//  Bug reports and comments should be directed to
53//  Instrumental Software Technologies, Inc. at info@isti.com
54//=====================================================================
55// This work was funded by the IRIS Data Management Center
56// http://www.iris.washington.edu
57//=====================================================================
58*/
59
60
61/*
62**   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE
63**   CHECKED IT OUT USING THE COMMAND CHECKOUT.
64**
65**    $Id$
66**
67**      Revision history:
68**      $Log$
69**      Revision 1.1  2010/03/10 17:14:58  paulf
70**      first check in of ew2mseed to EW proper
71**
72**      Revision 1.16  2010/01/21 23:30:36  ilya
73**      Service
74**     
75**      Revision 1.15  2008/12/30 02:25:27  ilya
76**      Modified build process
77**     
78**      Revision 1.14  2007/09/17 17:31:33  ilya
79**      Tested SNCL fixes on Solaris
80**     
81**      Revision 1.13  2007/04/12 19:21:04  hal
82**      Added ew7.0+ support (-dSUPPORT_SCNL) and linux port (-D_LINUX)
83**     
84**      -Hal
85**     
86**      Revision 1.12  2006/09/20 21:53:58  ilya
87**      Apperantly fixed the lepseconds bug
88**     
89**      Revision 1.11  2006/07/17 17:26:02  ilya
90**      7/17/06
91**     
92**      Revision 1.10  2005/03/23 03:24:25  ilya
93**      Fixed alighnment of data in BUD volumes
94**     
95**      Revision 1.9  2005/03/22 22:24:42  ilya
96**      Bug fixed: writng in the wrong file
97**     
98**      Revision 1.8  2003/05/16 01:04:18  ilya
99**      Added StartLatency
100**     
101**      Revision 1.7  2003/03/12 19:09:34  ilya
102**      Patched condition generated by buggy waverserver
103**     
104**      Revision 1.6  2002/11/22 16:39:26  ilya
105**      Moved file name update down to processing routines from main()
106**     
107**      Revision 1.5  2002/05/03 02:35:09  ilya
108**      BUG fix: MSEED records -> wrong files
109**     
110**      Revision 1.4  2002/04/11 20:07:13  ilya
111**      Add disabling of catchup mechanism
112**     
113**      Revision 1.3  2002/04/02 14:42:01  ilya
114**      Version 02-Apr-2002: catchup algorithm
115**     
116**      Revision 1.2  2002/03/25 20:47:48  ilya
117**      Fixed segFaults
118**     
119**      Revision 1.1.1.1  2002/01/24 18:32:05  ilya
120**      Exporting only ew2mseed!
121**     
122**      Revision 1.1.1.1  2001/11/20 21:47:00  ilya
123**      First CVS commit
124**     
125 * Revision 1.13  2001/03/15  16:46:23  comserv
126 *  Modifications to add configurable SocketReconnect and to
127 *  reduce a number of menu updates
128 * main lopp is strongly modified
129 *
130 * Revision 1.12  2001/02/27  22:58:18  comserv
131 * Modifications to decrease socket connections:
132 *  updateMenu()        replaces processWsAppendMenu() in main
133 *      if (retVal == EW2MSEED_TOO_EARLY)
134 * main()" postprocessing after processSingleSCN() is modified.
135 *  int processSingleSCN (RINGS *rn, WS_MENU_QUEUE_REC *mq)
136 * is modified to return WS_ERR... values not EW_SUCCESS or EW_FAILURE.
137 *
138 * Revision 1.11  2001/02/23  21:34:29  comserv
139 * service version
140 *
141 * Revision 1.10  2001/02/23  21:32:47  comserv
142 *  added the level 5 of verosity w_clientsII.c debug....
143 * in main()
144 *              if (j==30*rn.SCN_avail)   IGD 02/23/01 increased from 30
145 *
146 * Revision 1.9  2001/02/13  21:00:48  comserv
147 * Changes in ws_requests.c
148 *
149 * Revision 1.8  2001/02/12  18:42:01  comserv
150 * Modifications in ws_requests.c
151 *
152 * Revision 1.7  2001/02/12  17:48:35  comserv
153 * Modifications of sample rate in ew2mseed.h
154 *
155 * Revision 1.6  2001/02/06  05:54:50  comserv
156 *      code is added to prevent writing MSEED records (calling processSingleSCN) if
157 *      the endTime on tank is before requested endTime. This prevents ew2mseed from creating
158 *      MSEED records with too few data points in cases ew2mseed preformance is faster
159 *       than real-time
160 *
161 * Revision 1.5  2001/01/17  21:47:35  comserv
162 * Copyright is changed, version is inserted
163 *
164 * Revision 1.4  2001/01/08  22:53:54  comserv
165 * Modifications to reduce the latency time
166 *
167 * Revision 1.3  2001/01/04  13:36:09  comserv
168 * Fixed the bug preventing writing data to the new file if the
169 * old file is empty
170 *
171 * Revision 1.2  2000/11/17  20:30:55  comserv
172 * processWsGetTraceBin is fixed and then moved to ws_requests.c
173 *
174 * Revision 1.1  2000/11/17  06:55:44  comserv
175 * Initial revision
176 *
177*/
178
179/* Standard includes */
180
181#include <stdio.h>
182#include <string.h>
183#include <stdlib.h>
184#include <signal.h>
185
186/* Includes from Earthworm distribution */
187#include "earthworm.h"
188#include <qlib2.h>
189
190
191
192
193/* Local includes */
194#include "ew2mseed.h"
195#define VERSION "ew2mseed: r5878 2013-08-19 paulf $"
196
197
198  int main(int argc, char **argv)
199  {
200        int loopCount;  /* IGD 02/29/02 Counter of loops over all available SCNs */
201        int i;
202        int retVal, retVal1;
203        RINGS rn;
204        int hworder, dworder;
205        WS_MENU_QUEUE_REC menu_queue;
206        menu_queue.head = NULL;
207        menu_queue.tail = NULL;
208 
209        fprintf(stdout, "%s\n", VERSION);
210
211        /* Check command line arguments
212        ******************************/
213        if (argc != 2)
214        {
215                fprintf (stderr, "Usage: ew2mseed <configfile>\n");
216                exit (EW_FAILURE);
217        }
218
219
220        /* Check for the compilation flags
221         * Program should be compiled with either _SPARC or _INTEL flag
222         * Only _SPARC is supported
223        **************************************/
224        if (checkCompilationFlags(argv[0]) < 0)
225                exit(EW_FAILURE); 
226       
227
228        /* Put the configuration file name in the rn structure
229        ***************************************/ 
230        rn.configFile = calloc(1, strlen(*(argv+1))+1);
231
232        strncpy (rn.configFile, *(argv+1), strlen(*(argv+1))+1);
233
234        /*  Read configuration
235         ***************************************/ 
236        retVal = ew2mseed_config (&rn);
237        if (retVal != EW_SUCCESS)
238        {
239                fprintf(stderr, "ew2mseed: Error reading config file\n");
240                exit (EW_FAILURE);
241        }
242       
243        /* IGD 03/14/01 Set timeout values in each traceRec
244         ****************************************/     
245        ew2mseedUpdateTimeout (&rn);
246
247        /* Start logging mechanism if required
248         ***************************************/ 
249        logit_init (argv[1], (short) 0, 1024, rn.logSwitch);
250        logit ("pt" , "ew2mseed: Read command file <%s>\n", argv[1]);
251        d20 = (char *) calloc(1, 21); /* alloc global char date line */
252        d20a = (char *) calloc (1, 21); 
253        /* Log the configuration 
254         ***************************************/ 
255         ew2mseed_logconfig(&rn);
256       
257        /* If rn.verbosity == 5,
258         * we log the ws_client.c debug messages
259         * IGD 04/01/02 Tests with this version shows that
260         * the program crashes if it logs WS_ERR_TIMEOUT in
261         * wsGetTraceBin, so we disable logging of clients
262         * at least for a while
263         ***********************************************/
264        /* if (rn.verbosity == 5)
265                setWsClient_ewDebug (1);
266         */
267        /* Check if we set a lock and if the lock is set exist
268         ****************************************************/
269        if (checkLock(rn.LockFile) < 0)
270        {
271                logit ("pt", "ew2mseed: lock %s is set by the other instance of ew2mseed\n", 
272                        rn.LockFile);
273                exit(-15);
274        }
275        /* Set rn.bufLen to zero : rn.bufLen is a length of our single data buffer
276         ********************************/
277        rn.bufLen = 0;
278
279        /* Initialize waveserver wave server menu linked list 
280         ***************************************/ 
281        rn.WS_avail =  processWsAppendMenu (&rn, &menu_queue);
282
283        logit ("pt", "ew2mseed: got menu from %d WaveServers (out of %d)\n", 
284                rn.WS_avail, rn.WS_num);
285
286        /* Fill PSCN strucuture
287          **************************************/ 
288         rn.SCN_avail = fillPSCN (&rn, &menu_queue);
289
290        if (rn.SCN_avail == 0)
291        {  /* IGD : is this a right solution? */
292                logit ("pt", "no valid SCN are found in waveservers, program exits NOW!!!\n");
293                wsKillMenu (&menu_queue);
294                exit(-1);
295        } 
296        /* Init and Handle the MSEED file structure
297         **************************************/ 
298        retVal = filesHandler (&rn);
299
300        /* Get the requested block reading size and the
301        ** sample rate for each SNC from the Wave Servers
302         **************************************/ 
303        retVal = getParamsFromWS (&rn, &menu_queue);
304
305        /* Initialize qlib2 in NO_EXIT mode
306         *************************************/
307        init_qlib2(1);
308        /* IGD 07/25/2012 -> Force big endian on data */
309        hworder = set_hdr_wordorder (SEED_BIG_ENDIAN);
310        dworder = set_data_wordorder (SEED_BIG_ENDIAN);
311
312        /*      Create SCN infinite Ring loop
313         **************************************/
314        makeSNCLoop (&rn);     
315       
316 
317        logit ("", "-------------------------------------\n");
318        logit ("pt", "ew2mseed: entering the Main Loop\n");     
319
320        /* IGD 02/29/02 Set accounting stuff */
321        i = 0;
322        loopCount = 0;
323
324        /* Set signals
325        **********************************/
326        signal (SIGALRM, signal_handler);       /*03/14/01 IGD */
327        signal (SIGINT, signal_handler);
328        signal (SIGTERM, signal_handler);
329        signal (SIGUSR1, signal_handler);
330        sigignore(SIGPIPE);
331        ew_signal_flag = EW2MSEED_OK; /*global variable ! */
332        alarm((unsigned int) rn.TimeoutSeconds);
333
334        /* Main loop
335         **************/
336        while (1)
337        {       
338
339                sighold(SIGALRM);       /* 03/14/01 IGD */
340                sighold(SIGINT);
341                sighold(SIGTERM);
342                sighold(SIGUSR1);
343
344                /* IGD 03/29/02 Count loops to rearrange priorities */
345                if (i >= rn.SCN_avail)
346                {
347                        loopCount++;
348                        i = 0;
349                        if (loopCount >= rn.LoopsBeforeService)
350                        {
351                                loopCount = 0;
352                                if (rn.usePriority == 1) /* IGD 04/11/02 */
353                                        (void) updatePriorityValues(&rn);
354                        }
355                }       
356
357/*            IGD 11/21/02 This code is moved to processSingleSCN() to prevent empty files creation
358 *
359 *              if (rn.scnRing->newFileJulTime <= rn.scnRing->traceRec.reqStarttime )
360 *              {
361 *                      free(rn.scnRing->curMseedFile);
362 *                      rn.scnRing->curMseedFile = ew2mseedUpdateFileName
363 *                      (&(rn.scnRing->traceRec), rn.scnRing->dir,
364 *                              rn.scnRing->locId);
365 *                      rn.scnRing->newFileJulTime = findNewFileJulTime (rn.scnRing->traceRec.reqStarttime);
366 *                      rn.scnRing->mseedSeqNo = 1;
367 *                      logit ("pt", "New file is avaialble for writing: %s\n",
368 *                              rn.scnRing->curMseedFile);
369 *              }
370 */
371                        /* IGD 03/14/01 If there is no WS available
372                         * we sleep for 20 seconds and try to get menu again
373                         *****************************************/     
374                        if (rn.WS_avail == 0)
375                        {       sleep(20);
376                                ew_signal_flag = EW2MSEED_ALARM; /* This will force the program to request a menu */   
377                                continue;
378                        }
379
380                retVal = updateSingleSCNtimes (&rn, &menu_queue);
381
382                /* IGD 02/06/01
383                 * Obvious fix: if the endTime of request is after the endTime in tank
384                 * we update the tank times, but do not attempt to create MSEED
385                 ****************************************************/
386                if (retVal == EW2MSEED_TOO_EARLY)
387                {       
388                        sleep(2);       /* IGD 01/24/02 Sandy requested */
389                        if (rn.verbosity > 3)   /* IGD 03/15/01 Do nothing*/
390                                logit("pt", "updateMenu skipped\n");                   
391                }
392                else if (retVal == EW2MSEED_TIME2_UPDATE_MENU)
393                        rn.WS_avail = updateMenu(&rn, &menu_queue); /* IGD 03/15/01 */
394                else  /* here we try to actually create MSEED records */
395                {       
396                        retVal1 = processSingleSCN (&rn, &menu_queue);
397                        if (retVal1 != WS_ERR_NONE) /* IGD changed 02/27/01 */ 
398                        {
399                                if (retVal1 == WS_ERR_NO_CONNECTION ||          /* Cases when socket is closed */
400                                    retVal1 == WS_ERR_BUFFER_OVERFLOW ||
401                                    retVal1 == WS_ERR_TIMEOUT || 
402                                    retVal1 == WS_ERR_BROKEN_CONNECTION  || 
403                                    retVal1 == WS_ERR_SOCKET) 
404                                {
405                                        wsKillMenu(&menu_queue);
406                                        rn.WS_avail = processWsAppendMenu(&rn, &menu_queue);
407                                        alarm((unsigned int) rn.TimeoutSeconds);
408                                }
409                                else                                            /* Socket is not required an update */
410                                        rn.WS_avail = updateMenu(&rn, &menu_queue); /* IGD new 02/26/01 */
411                                if (rn.WS_avail == 0)
412                                        continue;               
413                                retVal = updateSingleSCNtimes (&rn, &menu_queue);
414                        }
415                }
416
417                rn.scnRing = rn.scnRing->next;
418                i++; 
419                sigrelse(SIGINT);
420                sigrelse(SIGTERM);
421                sigrelse(SIGUSR1);
422                sigrelse(SIGALRM);
423                if (ew_signal_flag != EW2MSEED_OK)
424                {
425                        if (ew_signal_flag == EW2MSEED_ALARM)
426                        {
427                                /* Kill the old menu and get the new one
428                                 ***************************************/
429                                wsKillMenu(&menu_queue);
430                                rn.WS_avail = processWsAppendMenu(&rn, &menu_queue);
431                                /* Rest the alarm
432                                 ***************/
433                                alarm((unsigned int) rn.TimeoutSeconds);
434                                /* reset the flag
435                                 ******************/
436                                ew_signal_flag = EW2MSEED_OK; /*global variable ! */
437                        }
438                        if (ew_signal_flag == EW2MSEED_TERMINATE)
439 
440                        /* Gracefullly finish the program
441                         **********************************/
442                                finish_handler(&rn);
443                        else if (ew_signal_flag == EW2MSEED_MAKE_REPORT)
444                                ew2mseedGenReport(&rn);
445                        else
446                                continue;                               
447                }
448               
449        }
450
451/* We should never get here
452********************************************/
453  logit ("pt", "closing WS connections and exiting\n");
454  wsKillMenu (&menu_queue);     
455  exit(0); 
456 } 
457
458 /****************************************************************/
459  int processSingleSCN (RINGS *rn, WS_MENU_QUEUE_REC *mq)
460  {
461        char message[200];
462        int retVal;     
463
464        if (rn->verbosity > 2) logit ("", "--------------------------------------\n");
465
466        if (rn->verbosity > 2) logit ("pt",  "Begin processing  %s %s %s\n",
467                        rn->scnRing->traceRec.sta, rn->scnRing->traceRec.net,
468                        rn->scnRing->traceRec.chan);
469 
470
471 
472        /* Get the buffer from the waveserver; process the response
473        *********************************************/
474        rn->scnRing->traceRec.pBuf = rn->pBuf;
475        rn->scnRing->traceRec.bufLen = rn->bufLen;
476
477        /*IGD 03/29/02 We increase the timeout for those snippets which are large */
478        retVal = processWsGetTraceBin (&(rn->scnRing->traceRec), 
479                                mq, rn->TravelTimeout*1000 * 
480                                        rn->scnRing->priority);
481        /* If the below statement is true, we have to increase the buffer accordingly
482         * IGD 03/18/02 checking for err condition is added
483         **********************************************************/
484        if (retVal == WS_ERR_BUFFER_OVERFLOW && rn->scnRing->traceRec.bufLen > rn->bufLen)      {
485                rn->bufLen = rn->scnRing->traceRec.bufLen;
486                free (rn->pBuf);
487                rn->pBuf = (char *) calloc(1, rn->bufLen);
488                if (rn->pBuf == NULL)
489                {
490                        fprintf(stderr, "Attempt to re-allocate %ld bytes for rn->pBuf failed\n", 
491                                rn->bufLen);
492                        logit("pt", "Attempt to re-allocate %ld bytes for rn->pBuf failed\n",
493                                 rn->bufLen);
494                        perror("The reason:");
495                        exit(-13);
496                }
497        }
498
499       
500        if (rn->scnRing->traceRec.reqEndtime <= rn->scnRing->traceRec.reqStarttime)
501        {                               
502                logit ("pt", "WARNING: <%s %s %s> requested end time %s <= requested starttime time %s\n",
503                                rn->scnRing->traceRec.sta,
504                                rn->scnRing->traceRec.net,
505                                rn->scnRing->traceRec.chan,
506                                strDate(rn->scnRing->traceRec.reqEndtime, d20),
507                                strDate(rn->scnRing->traceRec.reqStarttime, d20a));
508#ifdef SUPPORT_SCNL
509                retVal = WS_ERR_SCNL_NOT_IN_MENU;               
510#else
511                retVal = WS_ERR_SCN_NOT_IN_MENU;               
512#endif
513                rn->scnRing->traceRec.reqStarttime += 2.; /* add two  second; one is not right */
514                rn->scnRing->traceRec.reqEndtime = rn->scnRing->traceRec.reqStarttime + rn->scnRing->timeInterval;     
515                logit ("pt", "WARNING: <%s %s %s> requested interval is reset to <%s - %s>\n",
516                                rn->scnRing->traceRec.sta,
517                                rn->scnRing->traceRec.net,
518                                rn->scnRing->traceRec.chan,
519                                strDate(rn->scnRing->traceRec.reqStarttime, d20), 
520                                strDate(rn->scnRing->traceRec.reqEndtime, d20a));                               
521        }
522
523        /*
524         * IGD 08/11/03 Checking the sanity of the output of wsGetTraceBin
525         */
526        if (rn->scnRing->traceRec.actEndtime > (rn->scnRing->tankEndtime + 100))
527        {
528                logit ("pt", "WARNING: <%s %s %s> end time from WaveServer  %s > requested tank end time %s\n",
529                                rn->scnRing->traceRec.sta,
530                                rn->scnRing->traceRec.net,
531                                rn->scnRing->traceRec.chan,
532                                strDate(rn->scnRing->traceRec.actEndtime, d20), 
533                                strDate(rn->scnRing->tankEndtime, d20a));
534#ifdef SUPPORT_SCNL
535                retVal = WS_ERR_SCNL_NOT_IN_MENU;               
536#else
537                retVal = WS_ERR_SCN_NOT_IN_MENU;               
538#endif
539                rn->scnRing->traceRec.reqStarttime += 100.; /* add two  second; one is not right */
540                rn->scnRing->traceRec.reqEndtime = rn->scnRing->traceRec.reqStarttime + rn->scnRing->timeInterval;     
541                logit ("pt", "WARNING: <%s %s %s> requested interval is reset to <%s - %s>\n",
542                                rn->scnRing->traceRec.sta,
543                                rn->scnRing->traceRec.net,
544                                rn->scnRing->traceRec.chan,
545                                strDate(rn->scnRing->traceRec.reqStarttime, d20), 
546                                strDate(rn->scnRing->traceRec.reqEndtime, d20a));       
547        }
548
549        if (retVal != WS_ERR_NONE)  /* IGD 02/27/01 changed */
550        {       
551                return retVal;
552        }
553
554
555        /* IGD 11/21/02 Here we gonna change the date of the file is required
556         * We moved the snippet here from the main function to prevent a creation
557         * of empty files: i.e., we only bother to create a new file is processWsGetTraceBin
558         * returned real data.
559         */
560        if (rn->scnRing->newFileJulTime <= rn->scnRing->traceRec.reqStarttime )
561        {
562                free(rn->scnRing->curMseedFile);
563                rn->scnRing->curMseedFile = ew2mseedUpdateFileName
564                        (&(rn->scnRing->traceRec), rn->scnRing->dir, 
565                        rn->scnRing->locId);
566                rn->scnRing->newFileJulTime = findNewFileJulTime (rn->scnRing->traceRec.reqStarttime);
567                rn->scnRing->mseedSeqNo = 1;
568                logit ("pt", "New file is avaialble for writing: %s\n",
569                        rn->scnRing->curMseedFile);
570        }
571
572        retVal =createMseed (rn->scnRing,
573                                rn->verbosity);
574
575        sprintf(message, "createMseed %s %s %s %s ", 
576                rn->scnRing->traceRec.sta, rn->scnRing->traceRec.chan, 
577                rn->scnRing->traceRec.net, rn->scnRing->locId); 
578        if (rn->verbosity > 3) LogWsErr(message, retVal);
579
580
581        return retVal;
582  }
Note: See TracBrowser for help on using the repository browser.