2 * Copyright (c) 1990,1994 Regents of The University of Michigan.
3 * All Rights Reserved. See COPYRIGHT.
7 #include <sys/syslog.h>
10 #include <sys/types.h>
11 #include <netatalk/at.h>
12 #include <atalk/atp.h>
16 #include <kerberos/krb.h>
28 struct papfile *in, *out;
30 char *start, *stop, *p;
31 struct comment *comment = compeek();
34 switch ( markline( &start, &stop, in )) {
42 if ( comgetflags() == 0 ) { /* started */
43 if ( comment->c_end ) {
47 consumetomark( start, stop, in );
52 if ( comcmp( start, stop, comment->c_end, 0 ) == 0 ) {
53 for ( p = start; p < stop; p++ ) {
64 APPEND( out, p, stop - p + 1 );
66 consumetomark( start, stop, in );
71 consumetomark( start, stop, in );
76 char *LoginOK = "LoginOK\n";
77 char *LoginFailed = "LoginFailed\n";
79 #define h2b(x) (isdigit((x))?(x)-'0':(isupper((x))?(x)-'A':(x)-'a')+10)
82 struct papfile *in, *out;
84 char *start, *stop, *p;
86 struct comment *comment = compeek();
91 switch ( markline( &start, &stop, in )) {
99 p = start + strlen( comment->c_begin );
100 while ( *p == ' ' ) {
104 bzero( &tkt, sizeof( tkt ));
105 for ( i = 0, t = tkt.dat; p < stop; p += 2, t++, i++ ) {
106 *t = ( h2b( (unsigned char)*p ) << 4 ) +
107 h2b( (unsigned char)*( p + 1 ));
111 if (( rc = krb_rd_req( &tkt, "LaserWriter", printer->p_name,
112 0, &ad, "" )) != RD_AP_OK ) {
113 syslog( LOG_ERR, "cq_k4login: %s", krb_err_txt[ rc ] );
114 APPEND( out, LoginFailed, strlen( LoginFailed ));
116 consumetomark( start, stop, in );
119 syslog( LOG_INFO, "cq_k4login: %s.%s@%s", ad.pname, ad.pinst,
121 lp_person( ad.pname );
122 lp_host( ad.prealm );
124 APPEND( out, LoginOK, strlen( LoginOK ));
126 consumetomark( start, stop, in );
130 char *uameth = "UMICHKerberosIV\n*\n";
133 struct papfile *in, *out;
136 struct comment *c, *comment = compeek();
139 switch ( markline( &start, &stop, in )) {
147 if ( comgetflags() == 0 ) { /* start */
148 if (( printer->p_flags & P_AUTH ) == 0 ) { /* no kerberos */
149 if ( comswitch( queries, cq_default ) < 0 ) {
150 syslog( LOG_ERR, "cq_uameth: can't find default!" );
157 if ( comcmp( start, stop, comment->c_end, 0 ) == 0 ) { /* end */
158 APPEND( out, uameth, strlen( uameth ));
164 consumetomark( start, stop, in );
172 if ( printer->p_flags & P_SPOOLED ) {
173 APPEND( out, "true\n", 5 );
185 /* check for spooler? XXX */
186 if ( printer->p_pagecost_msg != NULL ) {
187 APPEND( out, printer->p_pagecost_msg,
188 strlen( printer->p_pagecost_msg ));
189 } else if ( printer->p_flags & P_ACCOUNT ) {
193 sprintf( cost, "%d", printer->p_pagecost );
194 APPEND( out, cost, strlen( cost ));
198 APPEND( out, "\n", 1 );
208 if ( lp_pagecost() != 0 ) {
211 sprintf( balance, "$%1.2f\n", printer->p_balance );
212 APPEND( out, balance, strlen( balance ));
221 { "UMICHCostPerPage", gq_pagecost },
223 { "UMICHUserBalance", gq_balance },
225 { "UMICHListQueue", gq_true },
226 { "UMICHDeleteJob", gq_true },
231 struct papfile *in, *out;
233 char *start, *stop, *p, *q;
234 struct comment *comment = compeek();
239 switch ( markline( &start, &stop, in )) {
247 if ( comgetflags() == 0 ) { /* started */
250 for ( p = start; p < stop; p++ ) {
256 for ( p++; p < stop; p++ ) {
257 if ( *p != ' ' && *p != '\t' ) {
262 for ( q = p; q < stop; q++ ) {
263 if ( *q == ' ' || *q == '\t' || *q == '\r' || *q == '\n' ) {
268 for ( gq = genqueries; gq->gq_name; gq++ ) {
269 if (( strlen( gq->gq_name ) == q - p ) &&
270 ( strncmp( gq->gq_name, p, q - p ) == 0 )) {
274 if ( gq->gq_name == NULL || gq->gq_handler == NULL ||
275 (gq->gq_handler)( out ) < 0 ) {
276 if ( comswitch( queries, cq_default ) < 0 ) {
277 syslog( LOG_ERR, "cq_feature: can't find default!" );
283 if ( comcmp( start, stop, comment->c_end, 0 ) == 0 ) {
285 consumetomark( start, stop, in );
290 consumetomark( start, stop, in );
294 cq_font_answer( start, stop, out )
298 char *p, *q, buf[ 256 ];
299 struct ppd_font *pfo;
303 while (( *p == ' ' || *p == '\t' ) && p < stop ) {
308 while ( *p != ' ' && *p != '\t' &&
309 *p != '\n' && *p != '\r' && p < stop ) {
316 APPEND( out, "/", 1 );
317 APPEND( out, buf, strlen( buf ));
318 APPEND( out, ":", 1 );
320 if (( pfo = ppd_font( buf )) == NULL ) {
321 APPEND( out, "No\n", 3 );
323 APPEND( out, "Yes\n", 4 );
332 struct papfile *in, *out;
334 char *start, *stop, *p;
335 struct comment *comment = compeek();
338 switch ( markline( &start, &stop, in )) {
346 if ( comgetflags() == 0 ) {
349 for ( p = start; p < stop; p++ ) {
356 cq_font_answer( p, stop, out );
358 if ( comgetflags() == 1 &&
359 comcmp( start, stop, comcont, 0 ) == 0 ) {
362 for ( p = start; p < stop; p++ ) {
369 cq_font_answer( p, stop, out );
372 if ( comcmp( start, stop, comment->c_end, 0 ) == 0 ) {
373 APPEND( out, "*\n", 2 );
375 consumetomark( start, stop, in );
381 consumetomark( start, stop, in );
385 cq_feature( in, out )
386 struct papfile *in, *out;
388 char *start, *stop, *p;
389 struct comment *comment = compeek();
390 struct ppd_feature *pfe;
393 switch ( markline( &start, &stop, in )) {
401 if ( comgetflags() == 0 ) {
404 /* parse for feature */
405 for ( p = start; p < stop; p++ ) {
411 while ( *p == ' ' ) {
415 if (( pfe = ppd_feature( p, stop - p )) == NULL ) {
416 if ( comswitch( queries, cq_default ) < 0 ) {
417 syslog( LOG_ERR, "cq_feature: can't find default!" );
423 APPEND( out, pfe->pd_value, strlen( pfe->pd_value ));
424 APPEND( out, "\r", 1 );
426 if ( comcmp( start, stop, comment->c_end, 0 ) == 0 ) {
428 consumetomark( start, stop, in );
433 consumetomark( start, stop, in );
437 static const char *psver = "*PSVersion\n";
438 static const char *prod = "*Product\n";
440 cq_printer( in, out )
441 struct papfile *in, *out;
443 char *start, *stop, *p;
444 struct comment *c, *comment = compeek();
445 struct ppd_feature *pdpsver, *pdprod;
448 switch ( markline( &start, &stop, in )) {
456 if ( comgetflags() == 0 ) {
459 if (( pdpsver = ppd_feature( psver, strlen( psver ))) == NULL ) {
460 if ( comswitch( queries, cq_default ) < 0 ) {
461 syslog( LOG_ERR, "cq_printer: can't find default!" );
467 for ( p = pdpsver->pd_value; *p != '\0'; p++ ) {
473 syslog( LOG_ERR, "cq_printer: can't parse PSVersion!" );
474 if ( comswitch( queries, cq_default ) < 0 ) {
475 syslog( LOG_ERR, "cq_printer: can't find default!" );
481 if (( pdprod = ppd_feature( prod, strlen( prod ))) == NULL ) {
482 if ( comswitch( queries, cq_default ) < 0 ) {
483 syslog( LOG_ERR, "cq_printer: can't find default!" );
490 APPEND( out, p + 1, strlen( p + 1 ));
491 APPEND( out, "\r", 1 );
494 APPEND( out, pdpsver->pd_value, p - pdpsver->pd_value );
495 APPEND( out, "\r", 1 );
498 APPEND( out, pdprod->pd_value, strlen( pdprod->pd_value ));
499 APPEND( out, "\r", 1 );
501 if ( comcmp( start, stop, comment->c_end, 0 ) == 0 ) {
503 consumetomark( start, stop, in );
508 consumetomark( start, stop, in );
512 static const char *rmjobfailed = "Failed\n";
513 static const char *rmjobok = "Ok\n";
516 struct papfile *in, *out;
518 char *start, *stop, *p;
521 switch ( markline( &start, &stop, in )) {
529 for ( p = start; p < stop; p++ ) {
530 if ( *p == ' ' || *p == '\t' ) {
534 for ( ; p < stop; p++ ) {
535 if ( *p != ' ' && *p != '\t' ) {
541 if ( p < stop && ( job = atoi( p )) > 0 ) {
543 APPEND( out, rmjobok, strlen( rmjobok ));
545 APPEND( out, rmjobfailed, strlen( rmjobfailed ));
549 consumetomark( start, stop, in );
554 struct papfile *in, *out;
558 switch ( markline( &start, &stop, in )) {
566 if ( lp_queue( out )) {
567 syslog( LOG_ERR, "cq_listq: lp_queue failed" );
571 consumetomark( start, stop, in );
576 * All queries start with %%?Begin and end with %%?End. Note that the
577 * "Begin"/"End" general queries have to be last.
579 struct comment queries[] = {
581 { "%%Login: UMICHKerberosIV", 0, cq_k4login, 0 },
582 { "%%?BeginUAMethodsQuery", "%%?EndUAMethodsQuery:", cq_uameth, C_FULL },
584 { "%UMICHListQueue", 0, cq_listq, C_FULL },
585 { "%UMICHDeleteJob", 0, cq_rmjob, 0 },
586 { "%%?BeginQuery", "%%?EndQuery", cq_query, 0 },
587 { "%%?BeginFeatureQuery", "%%?EndFeatureQuery", cq_feature, 0 },
588 { "%%?BeginFontQuery", "%%?EndFontQuery", cq_font, 0 },
589 { "%%?BeginPrinterQuery", "%%?EndPrinterQuery", cq_printer, C_FULL },
590 { "%%?Begin", "%%?End", cq_default, 0 },