diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2017-10-26 16:45:12 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2017-10-26 16:45:12 (GMT) |
commit | 6054f36bb658916bd231b9002efb94444e2871c8 (patch) | |
tree | a815500ec9bf0e100f4075a825213605c382def0 /xpaget.c | |
download | blt-6054f36bb658916bd231b9002efb94444e2871c8.zip blt-6054f36bb658916bd231b9002efb94444e2871c8.tar.gz blt-6054f36bb658916bd231b9002efb94444e2871c8.tar.bz2 |
Squashed 'xpa/' content from commit d6a54301
git-subtree-dir: xpa
git-subtree-split: d6a543018b46c5a6c47b5ff91e0e131549595ca6
Diffstat (limited to 'xpaget.c')
-rw-r--r-- | xpaget.c | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/xpaget.c b/xpaget.c new file mode 100644 index 0000000..ea70121 --- /dev/null +++ b/xpaget.c @@ -0,0 +1,225 @@ +/* + * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory + */ + +#include <xpap.h> + +extern char *optarg; +extern int optind; + +#ifdef ANSI_FUNC +void +usage (char *s) +#else +void usage(s) + char *s; +#endif +{ + fprintf(stderr, "\n"); + fprintf(stderr, "usage:\n"); + fprintf(stderr, " %s [-h] [-i nsinet] [-m method] [-n] [-s] [-t sval,lval] [-u users] <tmpl|host:port> [paramlist]\n", s); + fprintf(stderr, "\n"); + fprintf(stderr, "switches:\n"); + fprintf(stderr, "\t-h\tprint this message\n"); + fprintf(stderr, "\t-i\toverride XPA_NSINET environment variable\n"); + fprintf(stderr, "\t-m\toverride XPA_METHOD environment variable\n"); + fprintf(stderr, "\t-n\tdon't wait for message after server completes (kind of useless!)\n"); + fprintf(stderr, "\t-s\tserver mode\n"); + fprintf(stderr, "\t-t \toverride XPA_[SHORT,LONG]_TIMEOUT environment variables\n"); + fprintf(stderr, "\t-u\toverride XPA_NSUSERS environment variable\n"); + fprintf(stderr, "\t--version display version and exit\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "Data will be retrieved from access points matching the template or host:port.\n"); + fprintf(stderr, "Templates are of the form [class:]name. Wildcards *,?,[] are accepted.\n"); + fprintf(stderr, "A set of qualifying parameters can be appended.\n"); + fprintf(stderr, "\n"); + fprintf(stderr, "examples:\n"); + fprintf(stderr, "\tcsh> xpaget ds9 file\n"); + fprintf(stderr, "\tcsh> xpaget bynars.harvard.edu:1147\n"); + fprintf(stderr, "\n(version: %s)\n", XPA_VERSION); + exit(1); +} + +#ifdef ANSI_FUNC +int +main (int argc, char **argv) +#else +int +main(argc, argv) + int argc; + char **argv; +#endif +{ + int i; + int c; + int got; + int lp; + int errcode=0; + int server=0; + int maxhosts=XPA_MAXHOSTS; + char *paramlist=NULL; + char *xtemplate=NULL; + char lbuf[SZ_LINE]; + char tbuf[SZ_LINE]; + char mode[SZ_LINE]; + char cmd[SZ_LINE]; + char *s; + char **errs=NULL; + char **names=NULL; + int fds[1]; + XPA xpa=NULL; + + /* display version and exit, if necessary */ + if( (argc == 2) && !strcmp(argv[1], "--version") ){ + fprintf(stderr, "%s\n", XPA_VERSION); + exit(0); + } + + /* make sure we have enough arguments */ + if( argc < 2 ) + usage(argv[0]); + + /* start with no mode flag */ + *mode = '\0'; + + /* we want the args in the same order in which they arrived, and + gnu getopt sometimes changes things without this */ + putenv("POSIXLY_CORRECT=true"); + + /* process switch arguments */ + while ((c = getopt(argc, argv, "hi:m:nst:u:wW")) != -1){ + switch(c){ + case 'h': + usage(argv[0]); + case 'i': + snprintf(cmd, SZ_LINE, "XPA_NSINET=%s", optarg); + putenv(xstrdup(cmd)); + break; + case 'm': + snprintf(cmd, SZ_LINE, "XPA_METHOD=%s", optarg); + putenv(xstrdup(cmd)); + break; + case 'n': + if( *mode != '\0' ) + strcat(mode, ","); + strcat(mode, "ack=false"); + break; + case 's': + server = 1; + xpa = XPAOpen(NULL); + break; + case 't': + { + int xip=0; + char xbuf[SZ_LINE]; + newdtable(",;"); + if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){ + snprintf(cmd, SZ_LINE, "XPA_SHORT_TIMEOUT=%s", xbuf); + putenv(xstrdup(cmd)); + } + if( word(optarg, xbuf, &xip) && *xbuf && (*xbuf != '*') ){ + snprintf(cmd, SZ_LINE, "XPA_LONG_TIMEOUT=%s", xbuf); + putenv(xstrdup(cmd)); + } + freedtable(); + } + break; + case 'u': + snprintf(cmd, SZ_LINE, "XPA_NSUSERS=%s", optarg); + putenv(xstrdup(cmd)); + break; + /* for backward compatibility with 1.0 */ + case 'w': + case 'W': + break; + } + } + + /* no explicit host:port specified, so we should have a name */ + if( optind >= argc ){ + /* in server mode, we can skip the host on the command line */ + if( !server ) + usage(argv[0]); + } + else{ + xtemplate = xstrdup(argv[optind]); + optind++; + } + + /* make the paramlist */ + paramlist = XPAArgvParamlist(argc, argv, optind); + + /* init variables for names and ports */ + if( (s=(char *)getenv("XPA_MAXHOSTS")) != NULL ) + maxhosts = atoi(s); + names = (char **)xcalloc(maxhosts, sizeof(char *)); + errs = (char **)xcalloc(maxhosts, sizeof(char *)); + + /* we only send to stdout */ + fds[0] = fileno(stdout); + +again: + /* if we are in server mode, we might have to read a line from stdin + to grab the template and paramlist */ + if( server && (xtemplate==NULL) ){ + /* read description of template and paramlist */ + if( fgets(lbuf, SZ_LINE, stdin) == NULL ) + exit(errcode); + if( (*lbuf == '#') || (*lbuf == '\n') ) + goto again; + lp = 0; + if( word(lbuf, tbuf, &lp) && !strcmp(tbuf, "xpaget") && + word(lbuf, tbuf, &lp) ){ + xtemplate = xstrdup(tbuf); + paramlist = xstrdup(&(lbuf[lp])); + nowhite(paramlist, paramlist); + } + else{ + fprintf(stderr, "XPA$ERROR invalid command: %s", lbuf); + exit(++errcode); + } + } + + /* process xpa requests */ + got = XPAGetFd(xpa, xtemplate, paramlist, mode, fds, names, errs, -maxhosts); + if( got == 0 ){ + fprintf(stderr, "XPA$ERROR no 'xpaget' access points match template: %s\n", + xtemplate); + errcode++; + } + else{ + /* display errors and free up strings */ + for(i=0; i<got; i++){ + if( errs[i] != NULL ){ + fprintf(stderr, "%s", errs[i]); + xfree(errs[i]); + errcode++; + } + if( names[i] != NULL ) + xfree(names[i]); + } + } + + /* free the paramlist */ + if( paramlist!= NULL ){ + xfree(paramlist); + paramlist = NULL; + } + /* and the template */ + if( xtemplate != NULL ){ + xfree(xtemplate); + xtemplate = NULL; + } + + /* if we are in server mode, go back for more */ + if( server ) + goto again; + else{ + /* clean up */ + if( errs ) xfree(errs); + if( names ) xfree(names); + XPACleanup(); + exit(errcode); + } + return(0); +} |