Beispiel #1
0
static int Respond(long pier, long pid)
{
	ASSERT(!pier || !pid);	
	void** gc = NULL;
	
	char* Wfifo = String(RUN_PATH "/%ld.0/%ld", pier, pid);	
	ASSERT(Wfifo == NULL);
	gcCollect(&gc, &Wfifo);

	int Wfd = open(Wfifo, O_WRONLY, 0);
	ASSERT(-1 == Wfd);
	
	int n_read		= 0;
	size_t total		= 0;
	char buf[PIPE_BUF]	= {'\0', };
	errno = 0;
	while((n_read = read(STDIN, buf, sizeof(buf))))
	{
		if(-1 == n_read)
		{
			if(errno == EINTR
				|| errno == EAGAIN
				|| errno == EWOULDBLOCK
				|| errno == EPIPE)
			{
				errno = 0;
				continue;
			}
			break;
		}

		errno = 0;
		int n = Write(Wfd, buf, n_read);
		ASSERT(errno);
		total += n_read;
	}
	close(Wfd);
	
	char* answer = "Status: 200 OK" NL NL;
	Write(STDOUT, answer, strlen(answer));
	
	gcClean(gc);

	return 0;
}
Beispiel #2
0
termPo allocateObject(heapPo H, clssPo clss, size_t amnt) {
  if ((((ptrPo) currHeap->curr) + amnt) < ((ptrPo) (currHeap->limit))) {
    termPo t = currHeap->curr;
    H->curr = H->curr + amnt;
    t->clss = clss;
#ifdef TRACEMEM
    if (traceMemory) {
      numAllocated++;
      totalAllocated += amnt;
    }
    if (validateMemory) {
      verifyHeap(H);
    }
#endif
    return t;
  } else if (gcCollect(H, amnt) == Ok)
    return allocateObject(H, clss, amnt);
  else
    return Null;
}
Beispiel #3
0
static int Pier(long connect)
{
	ASSERT(!connect);	
	void** gc = NULL;
	pid_t my_pid = getpid();

	char** lstEnv = getEnv();
	ASSERT(lstEnv == NULL);

	char* Rpath = String(RUN_PATH "/%ld.0", connect);	
	ASSERT(Rpath == NULL);
	gcCollect(&gc, &Rpath);
	if (-1 == mkdir(Rpath, 00700))
	{
		ASSERT(errno != EEXIST);
		errno = 0;
	}

	char* Rfifo = String(RUN_PATH "/%ld.0/%ld", connect, my_pid);	
	ASSERT(Rfifo == NULL);
	gcCollect(&gc, &Rfifo);
	
	ASSERT(-1 == MkFifo(Rfifo));		

	char* Wfifo = String(RUN_PATH "/%ld", connect);	
	ASSERT(Wfifo == NULL);
	gcCollect(&gc, &Wfifo);

	char* lock_name = String(RUN_PATH "/%ld.lock", connect);	
	ASSERT(lock_name == NULL);
	gcCollect(&gc, &lock_name);

	int Lfd = open(lock_name, O_RDWR);
	if (-1 == Lfd)
	{
		char* answer = String("Status: 434 Requested host unavailable" NL NL \
			"434 Requested host unavailable.");
		gcCollect(&gc, &answer);
		Write(STDOUT, answer, strlen(answer));
		lstFree(lstEnv);
		gcClean(gc);
		unlink(Rfifo);

		return 0;
	}

	if(-1 == lockf(Lfd, F_LOCK, 0L))
	{
		char* answer = String("Status: 434 Requested host unavailable" NL NL \
			"434 Requested host unavailable.");
		gcCollect(&gc, &answer);
		Write(STDOUT, answer, strlen(answer));
		lstFree(lstEnv);
		gcClean(gc);
		unlink(Rfifo);

		return 0;
	}

	int Wfd = open(Wfifo, O_WRONLY | O_SYNC, 0);
	if (-1 == Wfd)
	{
		char* answer = String("Status: 434 Requested host unavailable" NL NL \
			"434 Requested host unavailable.");
		gcCollect(&gc, &answer);
		Write(STDOUT, answer, strlen(answer));
		lstFree(lstEnv);
		gcClean(gc);
		unlink(Rfifo);

		return 0;
	}

	/*
	int i = 0;
	char** lstEnv2 = getEnv();
	for (; lstEnv2[i]; ++i)
	{
		TRACE("%s\n", lstEnv2[i]);
	}
	*/
	
	char* header = String("%d" NL, my_pid);	
	ASSERT(header == NULL);
	gcCollect(&gc, &header);

	ASSERT(-1 == replaceStrFormat(&header, "", "%s %s %s" NL, 
		getenv("REQUEST_METHOD") ? getenv("REQUEST_METHOD") : "GET", 
		getenv("REQUEST_URI"),
		getenv("SERVER_PROTOCOL") ? getenv("SERVER_PROTOCOL") : "HTTP/1.1"));

	char** lstHttpEnv = lstEgrep(lstEnv, "^HTTP_.+$");
	if (lstHttpEnv)
	{
		addHeader(&header, lstHttpEnv);
	}
	
	char** lstContentEnv = lstEgrep(lstEnv, "^CONTENT_.+$");
	if (lstContentEnv)
	{
		addHeader(&header, lstContentEnv);
	}
	
	ASSERT(-1 == replaceStrFormat(&header, "", NL));
	errno = 0;
	int n = Write(Wfd, header, strlen(header));
	ASSERT(errno);

	int n_read		= 0;
	size_t total		= 0;
	char buf[PIPE_BUF]	= {'\0', };
	errno = 0;
	while((n_read = read(0, buf, sizeof(buf))))
	{
		if(-1 == n_read)
		{
			if(errno == EINTR
				|| errno == EAGAIN
				|| errno == EWOULDBLOCK
				|| errno == EPIPE)
			{
				errno = 0;
				continue;
			}
			break;
		}

		errno = 0;
		int n = Write(Wfd, buf, n_read);
		ASSERT(errno);
		total += n;
	}
	ASSERT(-1 == close(Wfd));

	//TRACE("\n%d %d >>\n", getpid(), time(NULL));

	int Rfd = open(Rfifo, O_RDONLY, 0);	
	ASSERT(-1 == Rfd);

	n_read	= 0;
	total	= 0;
	errno = 0;
	while((n_read = read(Rfd, buf, sizeof(buf))))
	{
		if(-1 == n_read)
		{
			if(errno == EINTR
				|| errno == EAGAIN
				|| errno == EWOULDBLOCK
				|| errno == EPIPE)
			{
				errno = 0;
				continue;
			}
			break;
		}

		errno = 0;
		int n = Write(STDOUT, buf, n_read);
		ASSERT(errno);
		total += n_read;
	}
	
	//TRACE("\n%d %d <<\n", getpid(), time(NULL));
	
	ASSERT(-1 == close(Rfd));
	ASSERT(-1 == lockf(Lfd, F_ULOCK, 0L));
	ASSERT(-1 == close(Lfd));
	ASSERT(-1 == unlink(Rfifo));

	lstFree(lstEnv);
	lstFree(lstHttpEnv);
	lstFree(lstContentEnv);
	gcClean(gc);
	
	return 0;
}
Beispiel #4
0
static int Connect(long connect)
{
	ASSERT(!connect);
	void** gc = NULL;
	
	char* Rfifo = String(RUN_PATH "/%ld", connect);	
	ASSERT(Rfifo == NULL);
	gcCollect(&gc, &Rfifo);

	char* lock_name = String(RUN_PATH "/%ld.lock", connect);	
	ASSERT(lock_name == NULL);
	gcCollect(&gc, &lock_name);

	ASSERT(-1 == creat(lock_name, 00600));	
	ASSERT(-1 == MkFifo(Rfifo));
	
	char* answer = String("Status: 200 OK" NL NL);
	ASSERT(answer == NULL);
	gcCollect(&gc, &answer);
	Write(1, answer, strlen(answer));

	for (;;)
	{
		int Rfd = open(Rfifo, O_RDONLY | O_NONBLOCK, 0);		
		ASSERT(-1 == Rfd);
	
		fd_set set;
		FD_ZERO(&set);
		FD_SET(Rfd, &set);
		struct timeval t = { SEC_TO_PING, 0 };
		int rd = select(Rfd + 1, &set, NULL, NULL, &t);
		ASSERT(-1 == rd);
		FD_CLR(Rfd, &set);
		if (!rd)
		{
			errno = 0;
			Write(STDOUT, "0", 1);
			ASSERT(errno);
			close(Rfd);
			continue;
		}
		
		int n_read		= 0;
		size_t total		= 0;
		char buf[PIPE_BUF]	= {'\0', };
		errno = 0;
		while((n_read = read(Rfd, buf, sizeof(buf) - 1)))
		{
			if(-1 == n_read)
			{
				if(errno == EINTR
					|| errno == EAGAIN
					|| errno == EWOULDBLOCK
					|| errno == EPIPE)
				{
					errno = 0;
					continue;
				}
				break;
			}

			errno = 0;
			int n = Write(STDOUT, buf, n_read);
			ASSERT(errno);
			total += n;
		}
		close(Rfd);
	}

	unlink(Rfifo);
	unlink(lock_name);
	gcClean(gc);
}
Beispiel #5
0
int WriteCSSflatFiles(const char *WorkSetName, const char *basename)
{
   FILE *ptr;
   struct affiliationList *af = 0;
   struct arrivalList *ar     = 0;
   struct assocList *as       = 0;
   struct eventList *ev       = 0;
   struct gregionList *gr     = 0;
   struct instrumentList *in  = 0;
   struct origerrList *oe     = 0;
   struct originList *orig      = 0;
   struct remarkList *re      = 0;
   struct sensorList *se      = 0;
   struct siteList *si        = 0;
   struct sitechanList *sc    = 0;
   struct stassocList *sa     = 0;
   struct wfdiscList *w       = 0;
   struct wftagList *wt       = 0;
   struct sacdataList *sd     = 0;
   DBlist tree;
   char*  FileName;

   if(!basename || ! strlen(basename)){
     css_error("Invalid basename.\n");
      return 0;
   }


   if(!WorkSetName || !strlen(WorkSetName) ){
      css_error("Invalid worksetname. Cannot write CSS binary data to file.\n");
      return 0;
   }

   if(!smChangeDefaultWorksetByName( (char*)WorkSetName )){
      css_error("Workset %s is empty orig does not exist\n", WorkSetName);
      return 0;
   }
   tree = smGetDefaultTree();
   if(!tree)return 0;

   gcCollect ( tree ) ;

   if(HasAffiliationStructs( tree ) ){
      FileName = MakeFileName( basename, "affiliation");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(af = (struct affiliationList*) dblNextTableInstance(af, tree, dbl_LIST_AFFILIATION) ) ) break;
         if(!WriteAffiliationRecord(af, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(af);
      fclose(ptr);
      free(FileName);
   }



   if(HasArrivalStructs( tree ) ){
      FileName = MakeFileName( basename, "arrival");
      if(! (ptr = fopen( FileName, "w" ) ) ){
        css_error("Unable to open output file (%s)\n",FileName);
        return 0;
      }
   
      do{
         if(!(ar = (struct arrivalList*) dblNextTableInstance(ar, tree, dbl_LIST_ARRIVAL) ) ) break;
         if(!WriteArrivalRecord(ar, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(ar);
      fclose(ptr);
      free(FileName);
   }



   if(HasAssocStructs( tree ) ){
      FileName = MakeFileName( basename, "assoc");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(as = (struct assocList*) dblNextTableInstance(as, tree, dbl_LIST_ASSOC) ) ) break;
         if(!WriteAssocRecord(as, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(as);
      fclose(ptr);
      free(FileName);
   }


   if(HasEventStructs( tree ) ){
      FileName = MakeFileName( basename, "event");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(ev = (struct eventList*) dblNextTableInstance(ev, tree, dbl_LIST_EVENT) ) ) break;
         if(!WriteEventRecord(ev, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(ev);
      fclose(ptr);
      free(FileName);
   }


   if(HasGregionStructs( tree ) ){
      FileName = MakeFileName( basename, "gregion");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(gr = (struct gregionList*) dblNextTableInstance(gr, tree, dbl_LIST_GREGION) ) ) break;
         if(!WriteGregionRecord(gr, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(gr);
      fclose(ptr);
      free(FileName);
   }



   if(HasInstrumentStructs( tree ) ){
      FileName = MakeFileName( basename, "instrument");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(in = (struct instrumentList*) dblNextTableInstance(in, tree, dbl_LIST_INSTRUMENT) ) ) break;
         if(!WriteInstrumentRecord(in, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(in);
      fclose(ptr);
      free(FileName);
   }



   if(HasOrigerrStructs( tree ) ){
      FileName = MakeFileName( basename, "origerr");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(oe = (struct origerrList*) dblNextTableInstance(oe, tree, dbl_LIST_ORIGERR) ) ) break;
         if(!WriteOrigerrRecord(oe, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(oe);
      fclose(ptr);
      free(FileName);
   }


   if(HasOriginStructs( tree ) ){
      FileName = MakeFileName( basename, "origin");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(orig = (struct originList*) dblNextTableInstance(orig, tree, dbl_LIST_ORIGIN) ) ) break;
         if(!WriteOriginRecord(orig, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(orig);
      fclose(ptr);
      free(FileName);
   }


   if(HasRemarkStructs( tree ) ){
      FileName = MakeFileName( basename, "remark");
      if(! (ptr = fopen( FileName, "w" ) ) ){
        css_error("Unable to open output file (%s)\n",FileName);
        return 0;
      }
   
      do{
         if(!(re = (struct remarkList*) dblNextTableInstance(re, tree, dbl_LIST_REMARK) ) ) break;
         if(!WriteRemarkRecord(re, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(re);
      fclose(ptr);
      free(FileName);
   }



   if(HasSensorStructs( tree ) ){
      FileName = MakeFileName( basename, "sensor");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(se = (struct sensorList*) dblNextTableInstance(se, tree, dbl_LIST_SENSOR) ) ) break;
         if(!WriteSensorRecord(se, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(se);
      fclose(ptr);
      free(FileName);
   }


   if(HasSiteStructs( tree ) ){
      FileName = MakeFileName( basename, "site");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(si = (struct siteList*) dblNextTableInstance(si, tree, dbl_LIST_SITE) ) ) break;
         if(!WriteSiteRecord(si, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(si);
      fclose(ptr);
      free(FileName);
   }



   if(HasSitechanStructs( tree ) ){
      FileName = MakeFileName( basename, "sitechan");
      if(! (ptr = fopen( FileName, "w" ) ) ){
        css_error("Unable to open output file (%s)\n",FileName);
        return 0;
      }
   
      do{
         if(!(sc = (struct sitechanList*) dblNextTableInstance(sc, tree, dbl_LIST_SITECHAN) ) ) break;
         if(!WriteSitechanRecord(sc, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(sc);
      fclose(ptr);
      free(FileName);
   }



   if(HasStassocStructs( tree ) ){
      FileName = MakeFileName( basename, "stassoc");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(sa = (struct stassocList*) dblNextTableInstance(sa, tree, dbl_LIST_SITECHAN) ) ) break;
         if(!WriteStassocRecord(sa, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(sa);
      fclose(ptr);
      free(FileName);
   }




   if(HasWfdiscStructs( tree ) ){
      FileName = MakeFileName( basename, "wfdisc");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(w = (struct wfdiscList*) dblNextTableInstance(w, tree, dbl_LIST_WFDISC) ) ) break;
         if(!WriteWfdiscRecord(basename, w, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(w);
      fclose(ptr);
      free(FileName);
   }



   if(HasWftagStructs( tree ) ){
      FileName = MakeFileName( basename, "wftag");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(wt = (struct wftagList*) dblNextTableInstance(wt, tree, dbl_LIST_WFTAG) ) ) break;
         if(!WriteWftagRecord(wt, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(wt);
      fclose(ptr);
      free(FileName);
   }



   if(HasSacdataStructs( tree ) ){
      FileName = MakeFileName( basename, "sacdata");
      if(! (ptr = fopen( FileName, "w" ) ) ){
         css_error("Unable to open output file (%s)\n",FileName);
         return 0;
      }
   
      do{
         if(!(sd = (struct sacdataList*) dblNextTableInstance(sd, tree, dbl_LIST_SACDATA) ) ) break;
         if(!WriteSacdataRecord(sd, ptr) ){
            fclose(ptr);
            free(FileName);
            return 0;
         }
      }while(sd);
      fclose(ptr);
      free(FileName);
   }


   return 1;
}
Beispiel #6
0
void 
xcutim ( int *nerr )
{
    /* declare variables */
    char kcutSave[ 2 ][ 9 ] ,
	 defaultWorksetName[] = "workset01" ,
	 *worksetName = NULL ;
    int i;
    char *tmp;
    double dtmp[2];
    int idx , jdx , jdfl ,
	nBounds ,
	nOriginalFiles = cmdfm.ndfl ,
	nSacFiles = 0 ,
	refTimeType = IB ;

    const int charsInBase = 9 ;

    int lname = FALSE , lnotused , lcutSave ;
    const int lcuttrue = TRUE ;

    int nlen , ndx1 , ndx2 ;

    float ocutSave[ 2 ] ;

    double refTime ;	/* subract this from the picks. */

    DBlist tree ;

    struct cutPair {
	char kbase[ 2 ][ 9 ] ;
	float offset[ 2 ] ;
    } bounds[ MAXPAIRS ] ;

    /* save current global values */
    lcutSave = cmdfm.lcut ;
    ocutSave[ 0 ] = cmdfm.ocut[ 0 ] ;
    ocutSave[ 1 ] = cmdfm.ocut[ 1 ] ;
    strcpy ( kcutSave[ 0 ] , kmdfm.kcut[ 0 ] ) ;
    strcpy ( kcutSave[ 1 ] , kmdfm.kcut[ 1 ] ) ;

    /* PARSING PHASE */
    /* -- "COMMIT|RECALLTRACE|ROLLBACK":
	  how to treat existing data */
    if ( lckeyExact ( "COMMIT" , 7 ) )
	cmdfm.icomORroll = COMMIT ;
    else if (lckeyExact ( "RECALLTRACE" , 12 ) )
	cmdfm.icomORroll = RECALL ;
    else if ( lckeyExact ( "RECALL" , 7 ) )
	cmdfm.icomORroll = RECALL ;
    else if ( lckeyExact ( "ROLLBACK" , 9 ) )
	cmdfm.icomORroll = ROLLBACK ;

    /* Get the limits of the cut. */
    for ( nBounds = 0 ; nBounds < MAXPAIRS ; nBounds++ ) {
      if ( !lcrtw ( &lnotused, (bounds[ nBounds ].kbase[0]), charsInBase, dtmp) ) {
        break ;
      } else {
        bounds[ nBounds ].offset[0] = (float) dtmp[0];
        bounds[ nBounds ].offset[1] = (float) dtmp[1];
      }

      if ( !strcmp ( bounds[ nBounds ].kbase [ 0 ] , "A       " ) &&
           !strcmp ( bounds[ nBounds ].kbase [ 1 ] , "F       " ) ) {
        break ;
      }
    } /* end for */

    /* CHECKING PHASE */

    /* - Check for null data file list. */
    vflist( nerr );
    if( *nerr != 0 )
	return ;

    /* - Check to make sure all files are evenly spaced time series files. */
    vfeven( nerr );
    if( *nerr != 0 )
	return ;

    /* Check that the resulting number of files won't exceed max */
    if ( cmdfm.ndfl * nBounds > MDFL ) {
	*nerr = 1403 ;
	return ;
    }

    /* Check that cut point information is of the proper form. */
    for ( idx = 0 ; idx < nBounds ; idx++ ) {
	for ( jdx = 0 ; jdx < 2 ; jdx++ ) {
	    char *test = &( bounds[ idx ].kbase[ jdx ][ 0 ] ) ;

	    if ( *test != 'A' &&	/* first arrival */
		 *test != 'B' &&	/* begin time of trace */
		 *test != 'E' &&	/* end time of trace */
		 *test != 'F' &&	/* end of event */
		 *test != 'O' &&	/* origin */
		 *test != 'T' &&	/* zero seconds */
		 *test != 'Z' ) {
		*nerr = 1405 ;
		return ;
	    }
	    if ( *test == 'T' ) {
		if ( !isdigit ( *(test+1) ) ) {
		    *nerr = 1405 ;
		    return ;
		}
		if ( strcmp ( test + 2 , "      " ) ) {
		    *nerr = 1405 ;
		    return ;
		}
	    } /* end if ( *test == 'T' ) */
	    else {
		if ( strcmp ( test + 1 , "       " ) ) {
		    *nerr = 1405 ;
		    return ;
		}
	    }
	}
    } /* end for ( idx ) */

    /* EXECUTION PHASE */

    /* - Commit or rollback data according to lmore and cmdfm.icomORroll */
    alignFiles ( nerr ) ;
    if ( *nerr )
	return ;

    /* Get necessary SeisMgr information */
    tree = smGetDefaultTree () ;

    /* Remove all waveforms from Sacmem */
    deleteAllSacFiles ( nerr , FALSE ) ;	/* don't delete file names */
    if ( *nerr )
	return ;

    /* set logical cut to TRUE */
    cmdfm.lcut = TRUE ;

    /* Loop between pairs of cut points */
    for ( idx = 0 ; idx < nBounds ; idx++ ) {
	struct wfdiscList *wfL = NULL ;

	/* reset cut parameters. */
	strcpy ( kmdfm.kcut[ 0 ] , bounds[ idx ].kbase[ 0 ] ) ;
	strcpy ( kmdfm.kcut[ 1 ] , bounds[ idx ].kbase[ 1 ] ) ;
	cmdfm.ocut[ 0 ] = bounds[ idx ].offset[ 0 ] ;
	cmdfm.ocut[ 1 ] = bounds[ idx ].offset[ 1 ] ;

	/* Loop between waveforms in SeisMgr */
	do {
	    /* Get next waveform. */
	    if ( ! ( wfL = dblNextTableInstance ( wfL , tree , dbl_LIST_WFDISC ) ) )
		break ;

	    /* Get the header to go with the waveform */
	    sacHeaderFromCSS( tree, &( globalSacHeader[ nSacFiles ] ),
			      wfL, refTimeType, &refTime, cmdfm.nMagSpec) ;

	    /* Get picks according to the preferences file and
	       pickauth and pickphase commands. */
        nSacFiles++;
	    prefPicksToHeader( &( globalSacHeader[ nSacFiles ] ), nSacFiles,
				wfL->element, tree, refTime, nerr ) ;

	    if ( *nerr ) {
		setmsg ( "WARNING" , 1401 ) ;
		outmsg () ;
		clrmsg () ;
		*nerr = 0 ;
	    }

	    if ( !lname && nSacFiles > nOriginalFiles )
		lname = TRUE ;

	    /* Create a SAC file, fill the header and waveform. */
	    CSStoSAC( nSacFiles, &( globalSacHeader[ nSacFiles-1 ] ),
		      wfL->seis, lname , lcuttrue , nerr ) ;
	    if ( *nerr ) {
		setmsg ( "WARNING" , 1402 ) ;
		outmsg () ;
		clrmsg () ;
		*nerr = 0 ;
	    }
	} while ( wfL ) ; /* End loop between waveforms in SeisMgr */

    } /* End loop between pairs of cut points. */

    /* Make nBounds copies of sac filenames */
    for ( idx = 1 ; idx < nBounds ; idx++ ) {
        for(i = 0; i < nOriginalFiles; i++) {
            tmp = string_list_get(datafiles, i);
            string_list_put(datafiles, tmp, strlen(tmp));
        }
    }

    /* Set global number of files */
    cmdfm.ndfl = nSacFiles ;

    /* Remove all waveforms from SeisMgr */
    /*smDeleteDefaultTree() ;*/
    worksetName = smGetDefaultWorksetName () ;
    if ( worksetName )
	smDeleteWorksetByName ( worksetName ) ;    
    else
	worksetName = defaultWorksetName ;

    /* Read each waveform from Sacmem back to SeisMgr */
    for ( jdfl = 1 ; jdfl <= nSacFiles ; jdfl++ ) {
	sacSACdata newData ;

	getfil ( jdfl , FALSE , &nlen , &ndx1 , &ndx2 , nerr ) ;
	if ( *nerr ) {
	    *nerr = 1406 ;
	    goto L_ERROR ;
	}

	newData.dataType = globalSacHeader[ jdfl - 1 ].iftype ;
	newData.xarray   = cmmem.sacmem[ cmdfm.ndxdta[ jdfl - 1 ][ 1 ] ] ;
	newData.yarray   = cmmem.sacmem[ cmdfm.ndxdta[ jdfl - 1 ][ 0 ] ] ;
	globalSacHeader[ jdfl-1 ].b = *begin ;
	globalSacHeader[ jdfl-1 ].e = *ennd ;
	globalSacHeader[ jdfl-1 ].npts = *npts ;

	sacLoadFromHeaderAndData( &( globalSacHeader[ jdfl-1 ] ) , &newData ,
	                         worksetName , FALSE , jdfl-1 , TRUE , TRUE ) ;
    } /* end for ( jdfl ) */

    /* clean up garbage in SeisMgr */
    tree = smGetDefaultTree () ;
    gcCollect ( tree ) ;

    /* Make sure to reset global cut values whether the command worked or not. */
L_ERROR:
    cmdfm.lcut = lcutSave ;
    cmdfm.ocut[ 0 ] = ocutSave[ 0 ] ;
    cmdfm.ocut[ 1 ] = ocutSave[ 1 ] ;
    strcpy ( kmdfm.kcut[ 0 ] , kcutSave[ 0 ] ) ;
    strcpy ( kmdfm.kcut[ 1 ] , kcutSave[ 1 ] ) ;

} /* end xcutim() */