コード例 #1
0
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;
}
コード例 #2
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;
}
コード例 #3
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);
}
コード例 #4
0
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;
}