#ifndef lint static char *RCSid = "$Header: /f/osi/others/ntp/RCS/ntq.c,v 7.1 91/02/22 09:34:05 mrose Interim $"; #endif /* * NTP query program - useful for debugging, Specific to OSI. * * $Log: ntq.c,v $ * Revision 7.1 91/02/22 09:34:05 mrose * Interim 6.8 * * Revision 7.0 90/12/10 17:21:47 mrose * *** empty log message *** * * Revision 1.1 90/08/14 10:14:25 jpo * Initial revision * */ #include "ntp.h" #include <varargs.h> #include "NTP-ops.h" #include "NTP-types.h" char *myname; int sleeptime = 30; char *mycontext = "ntp"; char *mypci = "ntp pci"; int query_result (), query_error (); void ros_adios (), ros_advise (), acs_adios (), acs_advise (), advise (), adios (); PE build_bind_arg (); main (argc, argv) int argc; char **argv; { extern char *optarg; extern int optind; int opt; myname = argv[0]; while((opt = getopt(argc, argv, "-s")) != EOF) switch (opt) { case 's': sleeptime = atoi (optarg); break; default: fprintf (stderr, "Usage: %s [-s] host\n", myname); break; } argc -= optind; argv += optind; isodetailor (myname, 0); if (argc < 1) adios (NULLCP, "Usage: %s [-s] host", myname); monitor (*argv); exit (0); } monitor (host) char *host; { int sd; sd = mk_connect (host); for (;;) { send_request (sd); sleep (sleeptime); } } int mk_connect (addr) char *addr; { int sd; struct SSAPref sfs; register struct SSAPref *sf; register struct PSAPaddr *pa; struct AcSAPconnect accs; register struct AcSAPconnect *acc = &accs; struct AcSAPindication acis; register struct AcSAPindication *aci = &acis; register struct AcSAPabort *aca = &aci -> aci_abort; AEI aei; OID ctx, pci; struct PSAPctxlist pcs; register struct PSAPctxlist *pc = &pcs; struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; PE pep[1]; if ((pa = str2paddr (addr)) == NULLPA) { advise ( NULLCP, "Can't translate %s", addr); return NOTOK; } pep[0] = build_bind_arg (pa); if ((ctx = ode2oid (mycontext)) == NULLOID) { advise ( NULLCP, "%s: unknown object descriptor", mycontext); return NOTOK; } if ((ctx = oid_cpy (ctx)) == NULLOID) { advise ( "memory", "out of"); return NOTOK; } if ((pci = ode2oid (mypci)) == NULLOID) { advise ( NULLCP, "%s: unknown object descriptor", mypci); return NOTOK; } if ((pci = oid_cpy (pci)) == NULLOID) { advise ( "memory", "out of"); return NOTOK; } pc -> pc_nctx = 1; pc -> pc_ctx[0].pc_id = 1; pc -> pc_ctx[0].pc_asn = pci; pc -> pc_ctx[0].pc_atn = NULLOID; if ((sf = addr2ref (PLocalHostName ())) == NULL) { sf = &sfs; (void) bzero ((char *) sf, sizeof *sf); } if (AcAssocRequest (ctx, NULLAEI, NULLAEI, NULLPA, pa, pc, NULLOID, 0, ROS_MYREQUIRE, SERIAL_NONE, 0, sf, pep, 1, NULLQOS, acc, aci) == NOTOK) acs_adios (aca, "A-ASSOCIATE.REQUEST"); pe_free (pep[0]); if (acc -> acc_result != ACS_ACCEPT) ac_failed (acc); sd = acc -> acc_sd; ACCFREE (acc); if (RoSetService (sd, RoPService, roi) == NOTOK) ros_adios (rop, "set RO/PS fails"); return sd; } int ac_failed (acc) struct AcSAPconnect *acc; { if (acc -> acc_ninfo > 0) { struct type_NTP_BindError *binderr; char *cp = NULLCP; if (decode_NTP_BindError (acc -> acc_info[0], 1, NULLINT, NULLVP, &binderr) != NOTOK) { if (binderr -> supplementary) cp = qb2str (binderr -> supplementary); switch (binderr -> reason) { case int_NTP_reason_refused: adios (NULLCP, "connection refused: %s", cp ? cp : ""); break; case int_NTP_reason_validation: adios (NULLCP, "validation failure: %s", cp ? cp : ""); break; case int_NTP_reason_version: adios (NULLCP, "version mismatch: %s", cp ? cp : ""); break; case int_NTP_reason_badarg: adios (NULLCP, "bad connect argument: %s", cp ? cp : ""); break; case int_NTP_reason_congested: adios (NULLCP, "congested: %s", cp ? cp : ""); break; default: adios (NULLCP, "Unknown reason (%d) %s", binderr -> reason, cp ? cp : ""); break; } free_NTP_BindError (binderr); } } adios (NULLCP, "Connection failed: %s", AcErrString (acc -> acc_result)); } send_request (sd) int sd; { struct RoSAPindication rois; register struct RoSAPindication *roi = &rois; register struct RoSAPpreject *rop = &roi -> roi_preject; switch (RyStub (sd, table_NTP_Operations, operation_NTP_query, RyGenID (sd), NULLIP, NULLCP, query_result, query_error, ROS_SYNC, roi)) { case NOTOK: if (ROS_FATAL (rop -> rop_reason)) ros_adios (rop, "STUB"); ros_advise (rop, "STUB"); break; case OK: /* got a result/error response */ break; case DONE: /* got RO-END? */ adios (NULLCP, "got RO-END.INDICATION"); /* NOTREACHED */ default: adios (NULLCP, "unknown return from RyStub"); /* NOTREACHED */ } } int query_result (sd, id, dummy, result, roi) int sd, id, dummy; register struct type_NTP_ClockInfoList *result; struct RoSAPindication *roi; { struct type_NTP_ClockInfo *clock; char *p, c; int i; printf (" %4.4s %4.4s %5.5s %8.8s %8.8s %8.8s %s\n", "Stratum", "Poll", "Reach", "Delay", "Offset", "Disp", "host"); for (i = 0; i < 44; i++) putchar('-'); putchar ('\n'); for (; result; result = result -> next) { clock = result -> ClockInfo; c = ' '; if (bit_test (clock -> flags, bit_NTP_flags_configured)) c = '-'; if (bit_test (clock -> flags, bit_NTP_flags_sane)) c = '.'; if (bit_test (clock -> flags, bit_NTP_flags_candidate)) c = '+'; if (bit_test (clock -> flags, bit_NTP_flags_selected)) c = '>'; if (bit_test (clock -> flags, bit_NTP_flags_inactive)) c = '!'; putchar (c); printf ("%4d", clock -> stratum); printf (" %4d", clock -> timer); printf (" %03o", clock -> reachability); printf (" %8d", clock -> estdelay); printf (" %8d", clock -> estoffset); printf (" %8d", clock -> estdisp); p = qb2str (clock -> remoteAddress); printf (" %s", p); free(p); if (c == '>') { struct type_NTP_ClockIdentifier *ci = clock -> reference; p = qb2str(ci -> un.referenceClock); printf (" (%s)", p); free (p); } putchar ('\n'); } return OK; } query_error (sd, id, error, parameter, roi) int sd, id, error; register struct type_IMISC_IA5List *parameter; struct RoSAPindication *roi; { register struct RyError *rye; if (error == RY_REJECT) { advise (NULLCP, "%s", RoErrString ((int) parameter)); return OK; } if (rye = finderrbyerr (table_NTP_Errors, error)) advise (NULLCP, "%s", rye -> rye_name); else advise (NULLCP, "Error %d", error); return OK; } static PE build_bind_arg () { struct type_NTP_BindArgument *bindarg; char *str; PE pe; bindarg = (struct type_NTP_BindArgument *) calloc (1, sizeof *bindarg); bindarg -> version = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_BITS); bit_on (bindarg -> version, bit_NTP_version_version__1); bit_on (bindarg -> version, bit_NTP_version_version__2); bindarg -> mode = (struct type_NTP_BindMode *) calloc (1, sizeof *bindarg->mode); bindarg -> mode -> parm = int_NTP_BindMode_query; if (encode_NTP_BindArgument (&pe, 1, NULLINT, NULLCP, bindarg) == NOTOK) pe = NULLPE; else pe -> pe_context = 3; free_NTP_BindArgument (bindarg); return pe; } void ros_adios (rop, event) register struct RoSAPpreject *rop; char *event; { ros_advise (rop, event); _exit (1); } void ros_advise (rop, event) register struct RoSAPpreject *rop; char *event; { char buffer[BUFSIZ]; if (rop -> rop_cc > 0) (void) sprintf (buffer, "[%s] %*.*s", RoErrString (rop -> rop_reason), rop -> rop_cc, rop -> rop_cc, rop -> rop_data); else (void) sprintf (buffer, "[%s]", RoErrString (rop -> rop_reason)); advise (NULLCP, "%s: %s", event, buffer); } /* ^L */ void acs_adios (aca, event) register struct AcSAPabort *aca; char *event; { acs_advise (aca, event); _exit (1); } void acs_advise (aca, event) register struct AcSAPabort *aca; char *event; { char buffer[BUFSIZ]; if (aca -> aca_cc > 0) (void) sprintf (buffer, "[%s] %*.*s", AcErrString (aca -> aca_reason), aca -> aca_cc, aca -> aca_cc, aca -> aca_data); else (void) sprintf (buffer, "[%s]", AcErrString (aca -> aca_reason)); advise (NULLCP, "%s: %s (source %d)", event, buffer, aca -> aca_source); } #ifndef lint void _advise (); void adios (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); _exit (1); } #else /* VARARGS */ void adios (what, fmt) char *what, *fmt; { adios (what, fmt); } #endif #ifndef lint void advise (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); } static void _advise (ap) va_list ap; { char buffer[BUFSIZ]; asprintf (buffer, ap); (void) fflush (stdout); fprintf (stderr, "%s: ", myname); (void) fputs (buffer, stderr); (void) fputc ('\n', stderr); (void) fflush (stderr); } #else /* VARARGS */ void advise (what, fmt) char *what, *fmt; { advise (what, fmt); } #endif #ifndef lint void ryr_advise (va_alist) va_dcl { va_list ap; va_start (ap); _advise (ap); va_end (ap); } #else /* VARARGS */ void ryr_advise (what, fmt) char *what, *fmt; { ryr_advise (what, fmt); } #endif