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

Revision 7519, 19.2 KB checked in by baker, 7 weeks ago (diff)

cleanup warning: variable set but not used [-Wunused-but-set-variable]

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