/* $Header: getprintstatus.c,v 2.1 87/01/14 13:12:50 ed Exp $ */ /* * $Log: getprintstatus.c,v $ * Revision 2.1 86/10/11 15:42:11 jqj * Some convenience changes from B Jackson @ PARC * * Revision 2.0 85/11/21 07:23:10 jqj * 4.3BSD standard release * * Revision 1.1 85/11/20 13:56:47 jqj * Initial revision * */ #include <stdio.h> #include <sys/types.h> #include <netns/ns.h> #include "Printing3_defs.h" #include <xnscourier/Clearinghouse2.h> #include <xnscourier/except.h> main(argc, argv) int argc; char *argv[]; { GetPrinterStatusResults result; struct ns_addr *destaddr; CourierConnection *conn; char *xnshost; extern struct ns_addr *getXNSaddr(); extern struct ns_addr *CH_LookupAddr(); Clearinghouse2_Name hostname; Clearinghouse2_Name defaultname; extern Clearinghouse2_Name CH_StringToName(); extern char *getenv(); CH_NameDefault(&defaultname); xnshost = getenv("PRINTER"); switch (argc) { case 2: xnshost = argv[1]; case 1: hostname = CH_StringToName(xnshost,&defaultname); if ((destaddr = CH_LookupAddr(hostname)) != NULL) break; /* got a valid host name */ else fprintf(stderr,"Invalid machine name: [%s:%s:%s]\n", hostname.object, hostname.domain, hostname.organization); default: fprintf(stderr,"Usage: %s [machine]\n",argv[0]); exit(1); } if ((conn = CourierOpen(destaddr)) == NULL) { fprintf(stderr,"Can't open connection to %s\n",xnshost); exit(1); } DURING result = GetPrinterStatus(conn,NULL); HANDLER { switch (Exception.Code) { case ServiceUnavailable: fprintf(stderr,"Service unavailable\n"); break; case SystemError: fprintf(stderr,"System Error\n"); break; case Undefined: fprintf(stderr,"Undefined error, number %d\n", CourierErrArgs(UndefinedArgs,problem)); case REJECT_ERROR: fprintf(stderr,"REJECT: type = %d\n", CourierErrArgs(rejectionDetails, designator)); break; default: fprintf(stderr,"Some random error, code %d\n", Exception.Code); break; } exit(1); } END_HANDLER; CourierClose(conn); printf("[%s:%s:%s]\n", hostname.object, hostname.domain, hostname.organization); printresults(result.status); } printresults(status) PrinterStatus status; { int i, typ; static char *spoollist[] = {"available","busy","disabled","full"}; static char *formatlist[] = {"available","busy","disabled"}; static char *printlist[] = {"available","busy","disabled", "needs attention","needs key operator"}; for (i = 0; i < status.length; i++) { switch (status.sequence[i].designator) { case spooler: typ = (int) status.sequence[i].spooler_case; printf("Spooling status: %s\n", spoollist[typ]); break; case formatter: typ = (int) status.sequence[i].formatter_case; printf("Formatting status: %s\n", formatlist[typ]); break; case printer: typ = (int) status.sequence[i].printer_case; printf("Printer status: %s\n", printlist[typ]); break; case media: printmedia(status.sequence[i].media_case); break; } } } printmedia(media) Media media; { int j; for (j = 0; j <media.length; j++) { switch (media.sequence[j].designator) { case paper: printf("Paper #%d: ", j+1); printpaper(media.sequence[j].paper_case); break; default: printf("Unknown medium type\n"); break; } } } printpaper(paper) Paper paper; { switch (paper.designator) { case unknown: printf("unknown\n"); break; case knownSize: switch (paper.knownSize_case) { case usLetter: printf("US letter\n"); break; case usLegal: printf("US legal\n"); break; default: printf("known size %d\n", paper.knownSize_case); break; } break; case otherSize: printf("\tother size: width = %dmm, length = %d mm\n", paper.otherSize_case.width, paper.otherSize_case.length); break; default: printf("Unknown paper type"); break; } }