summaryrefslogtreecommitdiffstats
path: root/xpa/xpaaccess.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2018-01-23 16:54:55 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2018-01-23 16:54:55 (GMT)
commit5bf617b1e9347322b8b16419fd5e74107e8b1c26 (patch)
treee5bbb785b82b35bc62df41bebca8b540078aaf76 /xpa/xpaaccess.c
parent51e1f85047b34f095ed69a3024d696997d2667c8 (diff)
parent0ebcd152c10d2eae6b62f16e7138aa187a8a1bdd (diff)
downloadblt-5bf617b1e9347322b8b16419fd5e74107e8b1c26.zip
blt-5bf617b1e9347322b8b16419fd5e74107e8b1c26.tar.gz
blt-5bf617b1e9347322b8b16419fd5e74107e8b1c26.tar.bz2
Merge commit '0ebcd152c10d2eae6b62f16e7138aa187a8a1bdd' as 'xpa'
Diffstat (limited to 'xpa/xpaaccess.c')
-rw-r--r--xpa/xpaaccess.c212
1 files changed, 212 insertions, 0 deletions
diff --git a/xpa/xpaaccess.c b/xpa/xpaaccess.c
new file mode 100644
index 0000000..81643ac
--- /dev/null
+++ b/xpa/xpaaccess.c
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
+ */
+
+#include <xpap.h>
+
+#define MAX_XPAS 10000
+
+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 [-c] [-h] [-i nsinet] [-m method] [-n] [-t sval,lval] [-u users] [-v|-V] <template> [type]\n", s);
+ fprintf(stderr, "\n");
+ fprintf(stderr, "switches:\n");
+ fprintf(stderr, "\t-c\tcontact each access point individually to see if it is available\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\treturn number of matches instead of \"yes\" or \"no\"\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-v\tprint info about successful access points\n");
+ fprintf(stderr, "\t-V\tprint info and errors about all access points\n");
+ fprintf(stderr, "\t--version display version and exit\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "xpaaccess returns \"yes\" if there are existing XPA access points that match\n");
+ fprintf(stderr, "the template (and optional access type: g,i,s), and returns \"no\" otherwise.\n");
+ fprintf(stderr, "If -n is specified, the number of matches is returned.\n");
+ fprintf(stderr, "Templates are of the form [class:]name. Wildcards *,?,[] are accepted.\n");
+ fprintf(stderr, "\n");
+ fprintf(stderr, "examples:\n");
+ fprintf(stderr, "\tcsh> if( `xpaaccess ds9` == \"yes\") then ...\n" );
+ fprintf(stderr, "\tcsh> set got=`xpaaccess -n ds9 g`\n");
+ fprintf(stderr, "\n(version: %s)\n", XPA_VERSION);
+ exit(0);
+}
+
+/* catch error from pre 2.1 server -- if we find this error, we know the
+ access point is available */
+#define OLD_SERVER(s) strstr(s, "XPA$ERROR invalid xpa command in initialization string")
+
+#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 n=0;
+ int donum=0;
+ int verbosity=0;
+ int contact=0;
+ char cmd[SZ_LINE];
+ char mode[SZ_LINE];
+ char *type=NULL;
+ char *xtmpl=NULL;
+ char **rclasses;
+ char **rnames;
+ char **rmethods;
+ char **rinfos;
+ char *names[MAX_XPAS];
+ char *errs[MAX_XPAS];
+ XPA xpa=NULL;
+
+ /* display version and exit, if necessary */
+ if( (argc == 2) && !strcmp(argv[1], "--version") ){
+ fprintf(stderr, "%s\n", XPA_VERSION);
+ exit(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, "chi:m:nt:u:vVwW")) != -1){
+ switch(c){
+ case 'c':
+ contact=1;
+ break;
+ 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':
+ donum=1;
+ 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;
+ case 'v':
+ verbosity=1;
+ break;
+ case 'V':
+ verbosity=2;
+ break;
+ /* for backward compatibility with 1.0 */
+ case 'w':
+ case 'W':
+ break;
+ }
+ }
+
+ /* we must have a template */
+ if( optind >= argc ){
+ usage(argv[0]);
+ }
+ else{
+ xtmpl = argv[optind];
+ optind++;
+ if( optind < argc ){
+ type = argv[optind];
+ }
+ }
+
+ /* if we need to contact each server ... */
+ if( contact ){
+ got = XPAAccess(xpa, xtmpl, type, mode, names, errs, MAX_XPAS);
+ for(i=0; i<got; i++){
+ if( !errs[i] || OLD_SERVER(errs[i]) ){
+ if( verbosity ) fprintf(stdout, "%s\n", names[i]);
+ n++;
+ }
+ else{
+ if( verbosity >= 2 ) fprintf(stdout, "%s", errs[i]);
+ }
+ if( errs[i] ) xfree(errs[i]);
+ if( names[i] ) xfree(names[i]);
+ }
+ }
+ /* only contact name server */
+ else{
+ n = XPANSLookup(xpa, xtmpl, type, &rclasses, &rnames, &rmethods, &rinfos);
+ /* free up the space */
+ for(i=0; i<n; i++){
+ if( verbosity ){
+ fprintf(stdout, "%s", rmethods[i]);
+ if( strcmp(rinfos[i], XPA_DEF_CLIENT_INFO) )
+ fprintf(stdout, " %s", rinfos[i]);
+ fprintf(stdout, "\n");
+ }
+ /* done with these strings */
+ xfree(rclasses[i]);
+ xfree(rnames[i]);
+ xfree(rmethods[i]);
+ xfree(rinfos[i]);
+ }
+ /* free up arrays returned by name server */
+ if( n > 0 ){
+ xfree(rclasses);
+ xfree(rnames);
+ xfree(rmethods);
+ xfree(rinfos);
+ }
+ }
+
+ /* print out number */
+ if( !verbosity && donum ){
+ fprintf(stdout, "%d\n", n);
+ }
+ /* print out yes/no */
+ else if( !verbosity && !donum ){
+ if( n > 0 )
+ fprintf(stdout, "yes\n");
+ else
+ fprintf(stdout, "no\n");
+ }
+ fflush(stdout);
+ return(n);
+}