int Xfer_CvtNRTS(struct xfer_cnf *cnf, struct xfer_wav *wav, struct nrts_packet *packet) { static unsigned long host_order = 0; struct xfer_wavgen1 *wavgen; struct xfer_cnfgen1 *cnfptr; int standx, chnndx; if (wav->format != XFER_WAVGEN1) return -1; if (host_order == 0) host_order = util_order(); cnfptr = (struct xfer_cnfgen1 *) &cnf->type.gen1; wavgen = (struct xfer_wavgen1 *) &wav->type.gen1; standx = wavgen->standx; chnndx = wavgen->chnndx; strcpy(packet->sname, cnfptr->sta[standx].name); strcpy(packet->cname, cnfptr->sta[standx].chn[chnndx].name); strcpy(packet->instype, cnfptr->sta[standx].chn[chnndx].instype); packet->beg.time = wavgen->tofs; packet->beg.code = ' '; packet->beg.qual = 0; packet->tear = (float) wavgen->tear; packet->sint = cnfptr->sta[standx].chn[chnndx].sint; packet->calib = cnfptr->sta[standx].chn[chnndx].calib; packet->calper = cnfptr->sta[standx].chn[chnndx].calper; packet->vang = cnfptr->sta[standx].chn[chnndx].vang; packet->vang = cnfptr->sta[standx].chn[chnndx].vang; packet->hang = cnfptr->sta[standx].chn[chnndx].hang; packet->wrdsiz = cnfptr->sta[standx].chn[chnndx].wrdsiz; packet->nsamp = wavgen->nsamp; packet->order = host_order; /* protocol guarantees this */ packet->type = 0; packet->hlen = 0; packet->dlen = wavgen->nbyte; packet->header = wavgen->data; packet->data = wavgen->data; packet->end.time = packet->beg.time + ((float) (packet->nsamp - 1) * packet->sint); packet->end.code = ' '; packet->end.qual = 0; return 0; }
int seed_fsdh(struct seed_fsdh *dest, char *src) { int swap; char tbuff[10]; assert(sizeof(short) == 2); assert(sizeof(long) == 4); sscanf(src, "%06dD ", &dest->seqno); memcpy(dest->staid, src+ 8, 5); dest->staid[5] = 0; util_strtrm(dest->staid); memcpy(dest->locid, src+13, 2); dest->locid[2] = 0; util_strtrm(dest->locid); memcpy(dest->chnid, src+15, 3); dest->chnid[3] = 0; util_strtrm(dest->chnid); memcpy(dest->netid, src+18, 2); dest->netid[2] = 0; util_strtrm(dest->netid); dest->start = seed_ttodt(src+20, &dest->order); memcpy(&dest->nsamp, src+30, 2); memcpy(&dest->srfact, src+32, 2); memcpy(&dest->srmult, src+34, 2); memcpy(&dest->active, src+36, 1); memcpy(&dest->ioclck, src+37, 1); memcpy(&dest->qual, src+38, 1); memcpy(&dest->more, src+39, 1); memcpy(&dest->tcorr, src+40, 4); memcpy(&dest->bod, src+44, 2); memcpy(&dest->first, src+46, 2); if (dest->swap = (dest->order != util_order())) { util_sswap(&dest->nsamp, 1); util_sswap(&dest->srfact, 1); util_sswap(&dest->srmult, 1); util_lswap(&dest->tcorr, 1); util_sswap(&dest->bod, 1); util_sswap(&dest->first, 1); } return 0; }
void seed_load1000(char *dest, struct seed_b1000 *src, unsigned long order) { int swap; short type = 1000, stmp; char unused = 0; swap = (order != util_order()); assert(sizeof(short) == 2); stmp = type; if (swap) util_sswap(&stmp, 1); memcpy(dest, &stmp, 2); stmp = src->next; if (swap) util_sswap(&stmp, 1); memcpy(dest + 2, &stmp, 2); memcpy(dest + 4, &src->format, 1); memcpy(dest + 5, &src->order, 1); memcpy(dest + 6, &src->length, 1); memcpy(dest + 7, &unused, 1); }
int init(int argc, char **argv, char **home, struct edes_params *edes, char *buffer) { size_t edes_len; FILE *cfp; int i, j, k, nsys, sint, datlen, rev; char *log = NULL, *dbspec = DEFAULT_DBSPEC, *mapname; int debug = NRTS_DEFLOG; int to = NRTS_DEFTCPTO; char *system[MAXSYS]; char fname[MAXPATHLEN+1]; struct nrts_files *file; struct xfer_packet *packet; struct rlimit rlimit; DBIO *db; int nice, nerror; ISI_STREAM_NAME name; ISI_COORDS coords; ISI_INST inst; BOOL dump, incomplete; static char PeerString[MAXPATHLEN], *peer; static char *fid = "init"; *home = NULL; nice = 1; dump = FALSE; /* Get command line arguments */ for (i = 1; i < argc; i++) { if (strncmp(argv[i], "db=", strlen("db=")) == 0) { dbspec = argv[i] + strlen("db="); } else if (strncmp(argv[i], "home=", strlen("home=")) == 0) { *home = argv[i] + strlen("home="); } else if (strncmp(argv[i], "debug=", strlen("debug=")) == 0) { debug = atoi(argv[i]+strlen("debug=")); } else if (strncmp(argv[i], "log=", strlen("log=")) == 0) { log = argv[i] + strlen("log="); } else if (strncmp(argv[i], "to=", strlen("to=")) == 0) { to = atoi(argv[i] + strlen("to=")); } else if (strcasecmp(argv[i], "+dbd") == 0) { dump = TRUE; } else if (strcasecmp(argv[i], "-dbd") == 0) { dump = FALSE; } else if (strcmp(argv[i], "config") == 0) { fprintf(stderr, "nrts_edes config is no longer required\n"); exit(0); } else if (strcmp(argv[i], "+nice") == 0) { nice = 1; } else if (strcmp(argv[i], "-nice") == 0) { nice = 0; } else { xfer_errno = XFER_EFAULT; return -1; } } /* Determine working home */ if (*home == NULL) { *home = getenv(NRTS_HOME); } if (*home == NULL) { *home = NRTS_DEFHOME; } /* Start logging facility */ peer = util_peer(fileno(stdin), PeerString, MAXPATHLEN); if (peer != NULL) { if (NotOnSilentList(peer)) { util_logopen(log, 1, NRTS_MAXLOG, debug, NULL, argv[0]); util_log(2, VersionIdentString); util_log(2, "Connection from %s", PeerString); } } else { util_logopen(log, 1, NRTS_MAXLOG, debug, NULL, argv[0]); util_log(2, VersionIdentString); util_log(2, "Connection from <can't determine peer string>\n"); } if (chdir(*home) != 0) { util_log(1, "%s: can't chdir %s: %s", fid, *home, syserrmsg(errno)); xfer_errno = XFER_EFAULT; return -2; } /* Connect to database */ if ((db = dbioOpen(dbspec, NULL)) == NULL) { util_log(1, "dbioOpen failed"); return -3; } /* Set niceness */ set_wait_flag(nice); /* Initialize Xfer routines */ if (Xfer_ServInit(*home, to) != XFER_OK) { util_log(1, "%s: Xfer_ServInit: %s", fid, Xfer_ErrStr()); xfer_errno = XFER_EFAULT; return -4; } /* Check implementation limits */ if (XFER_SNAMLEN < NRTS_SNAMLEN) { util_log(1, "%s: increase XFER_SNAMLEN", fid); xfer_errno = XFER_ELIMIT; return -5; } if (XFER_CNAMLEN < NRTS_CNAMLEN) { util_log(1, "%s: increase XFER_CNAMLEN", fid); xfer_errno = XFER_ELIMIT; return -6; } if (XFER_INAMLEN < NRTS_INAMLEN) { util_log(1, "%s: increase XFER_INAMLEN", fid); xfer_errno = XFER_ELIMIT; return -7; } if (XFER_MAXSTA < NRTS_MAXSTA) { util_log(1, "%s: increase XFER_MAXSTA", fid); xfer_errno = XFER_ELIMIT; return -8; } if (XFER_MAXCHN < NRTS_MAXCHN) { util_log(1, "%s: increase XFER_MAXCHN", fid); xfer_errno = XFER_ELIMIT; return -9; } /* Get info about all supported systems */ if ((nsys = nrts_systems(*home, system, MAXSYS)) < 0) { util_log(1, "%s: nrts_systems: status %d", fid, nsys); xfer_errno = XFER_EFAULT; return -10; } edes->tstamp = time(NULL); edes->nsys = nsys; edes->isd = fileno(stdin); edes->osd = fileno(stdout); utilSetNonBlockingSocket(edes->isd); utilSetNonBlockingSocket(edes->osd); /* Set the resource limits for number of open files to the max */ if (getrlimit(RLIMIT_NOFILE, &rlimit) != 0) { util_log(1, "can't get resource limits: %s", syserrmsg(errno)); xfer_errno = XFER_EFAULT; return -11; } rlimit.rlim_cur = rlimit.rlim_max; if (setrlimit(RLIMIT_NOFILE, &rlimit) != 0) { util_log(1, "can't set resource limits: %s", syserrmsg(errno)); xfer_errno = XFER_EFAULT; return -12; } /* Get NRTS system information for everything on this host */ for (nerror = 0, i = 0; i < edes->nsys; i++) { /* Determine dl file names for this system */ file = nrts_files(home, system[i]); /* Get mmapd NRTS system descriptor */ if (nrts_mmap(file->sys, "r", NRTS_SYSTEM, edes->map + i) != 0) { util_log(1, "%s: nrts_mmap: %s: %s", fid, system[i], syserrmsg(errno) ); xfer_errno = XFER_EFAULT; return -13; } *(SYS) = *((struct nrts_sys *) edes->map[i].ptr); if (SYS->nsta != 1) { util_log(1, "%s: %s has %d stations, not allowed", fid, system[i], SYS->nsta); return -14; } /* Open dl header file */ if ((edes->inf[i].hfd = open(file->hdr, O_RDONLY)) < 0) { util_log(1, "%s: can't open dl hdr file `%s': %s", fid, file->hdr, syserrmsg(errno) ); xfer_errno = XFER_EFAULT; return -15; } /* Open dl data file */ if ((edes->inf[i].dfd = open(file->dat, O_RDONLY)) < 0) { util_log(1, "%s: can't open dl dat file `%s': %s", fid, file->dat, syserrmsg(errno) ); xfer_errno = XFER_EFAULT; return -16; } /* Determine raw packet decoders */ switch (SYS->type) { case NRTS_IDA: edes->decode[i] = ida_decode; rev = ((struct nrts_ida *) SYS->info)->rev; mapname = ((struct nrts_ida *) SYS->info)->map; ida_decode_init(dump); break; case NRTS_IDA10: edes->decode[i] = ida10_decode; rev = 10; mapname = NULL; ida10_decode_init(dump); break; default: util_log(1, "%s: unsupported system `%d'", fid, SYS->type); xfer_errno = XFER_EFAULT; return -17; } if ((edes->inf[i].ida = idaCreateHandle(SYS->sta[0].name, rev, mapname, db, NULL, 0)) == NULL) { util_log(1, "%s: idaCreateHandle failed for site %s, rev %d", fid, SYS->sta[0].name, rev); return -18; } /* Load static parameters from the database */ for (j = 0; j < SYS->nsta; j++) { isidbLookupCoords(db, SSTA->name, (UINT32) edes->tstamp, &coords); CSTA->lat = coords.lat; CSTA->lon = coords.lon; CSTA->elev = coords.elev; CSTA->depth = coords.depth; for (k = 0; k < SSTA->nchn; k++) { incomplete = FALSE; isiStaChnLocToStreamName(SSTA->name, SCHN->name, NULL, &name); isidbLookupInst(db, &name, (UINT32) edes->tstamp, &inst); CCHN->calib = inst.calib; CCHN->calper = inst.calper; CCHN->hang = inst.hang; CCHN->vang = inst.vang; memcpy(CCHN->instype, inst.type, NRTS_INAMLEN); CCHN->instype[NRTS_INAMLEN] = 0; if (!isidbLookupSint(db, &name, &sint)) { incomplete = TRUE; } else if (!isidbLookupDatlen(db, &name, &datlen)) { incomplete = TRUE; } else if (!isidbLookupWrdsiz(db, &name, &CCHN->wrdsiz)) { incomplete = TRUE; } if (incomplete) { util_log(1, "WARNING: incomplete sint map for %s:%s", SSTA->name, SCHN->name); ++nerror; } else { CCHN->sint = (float) sint / 1000.0; CCHN->order = util_order(); CCHN->paklen = CCHN->sint * (datlen / CCHN->wrdsiz); } } } } if (nerror != 0) { util_log(1, "ERROR - incomplete sint database"); xfer_errno = XFER_EFAULT; return -19; } /* Load server specific signal handlers */ if (handlers(fileno(stdout)) != 0) { util_log(1, "%s: load signal handler(s): %s", fid, *home, syserrmsg(errno)); xfer_errno = XFER_EFAULT; return -20; } return 0; }