/*
- * $Id: queries.c,v 1.13 2002-02-15 16:15:21 morgana Exp $
+ * $Id: queries.c,v 1.22 2009-10-13 22:55:37 didg Exp $
*
* Copyright (c) 1990,1994 Regents of The University of Michigan.
* All Rights Reserved. See COPYRIGHT.
int cq_feature( struct papfile *, struct papfile * );
int cq_printer( struct papfile *, struct papfile * );
int cq_rmjob( struct papfile *, struct papfile * );
+#ifndef HAVE_CUPS
int cq_listq( struct papfile *, struct papfile * );
int cq_rbilogin( struct papfile *, struct papfile * );
+#endif /* HAVE_CUPS */
-int cq_default( in, out )
- struct papfile *in, *out;
+int cq_default( struct papfile *in, struct papfile *out)
{
char *start, *stop, *p;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
stop = start+linelength;
break;
}
}
- p++;
- while ( *p == ' ' ) {
+ if (p < stop) {
p++;
+ while ( *p == ' ' ) {
+ p++;
+ }
}
append( out, p, stop - p + crlflength );
#define h2b(x) (isdigit((x))?(x)-'0':(isupper((x))?(x)-'A':(x)-'a')+10)
-int cq_k4login( in, out )
- struct papfile *in, *out;
+int cq_k4login( struct papfile *in, struct papfile *out)
{
char *start, *p;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
p = start + strlen( comment->c_begin );
bzero( &tkt, sizeof( tkt ));
stop = start+linelength;
+ /* FIXME */
for ( i = 0, t = tkt.dat; p < stop; p += 2, t++, i++ ) {
*t = ( h2b( (unsigned char)*p ) << 4 ) +
h2b( (unsigned char)*( p + 1 ));
if (( rc = krb_rd_req( &tkt, "LaserWriter", printer->p_name,
0, &ad, "" )) != RD_AP_OK ) {
- LOG(log_error, logtype_default, "cq_k4login: %s", krb_err_txt[ rc ] );
+ LOG(log_error, logtype_papd, "cq_k4login: %s", krb_err_txt[ rc ] );
append( out, LoginFailed, strlen( LoginFailed ));
compop();
CONSUME( in, linelength + crlflength );
return( CH_DONE );
}
- LOG(log_info, logtype_default, "cq_k4login: %s.%s@%s", ad.pname, ad.pinst,
+ LOG(log_info, logtype_papd, "cq_k4login: %s.%s@%s", ad.pname, ad.pinst,
ad.prealm );
lp_person( ad.pname );
lp_host( ad.prealm );
char *uameth = "UMICHKerberosIV\n*\n";
-int cq_uameth( in, out )
- struct papfile *in, *out;
+int cq_uameth( struct papfile *in, struct papfile *out)
{
char *start;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
if ( comgetflags() == 0 ) { /* start */
if (( printer->p_flags & P_KRB ) == 0 ) { /* no kerberos */
if ( comswitch( queries, cq_default ) < 0 ) {
- LOG(log_error, logtype_default, "cq_uameth: can't find default!" );
+ LOG(log_error, logtype_papd, "cq_uameth: can't find default!" );
exit( 1 );
}
return( CH_DONE );
}
#endif /* KRB */
-int gq_true( out )
- struct papfile *out;
+int gq_true( struct papfile *out)
{
if ( printer->p_flags & P_SPOOLED ) {
append( out, "true\n", 5 );
}
}
-int gq_pagecost( out )
- struct papfile *out;
+int gq_pagecost( struct papfile *out)
{
char cost[ 60 ];
}
#ifdef ABS_PRINT
-int gq_balance( out )
- struct papfile *out;
+int gq_balance( struct papfile *out)
{
char balance[ 60 ];
* Handler for RBISpoolerID
*/
-static const char *spoolerid = "(PAPD Spooler) VERSION\n";
+static const char *spoolerid = "(PAPD Spooler) 1.0 (" VERSION ")\n";
-int gq_rbispoolerid( out )
- struct papfile *out;
+int gq_rbispoolerid( struct papfile *out)
{
append( out, spoolerid, strlen( spoolerid ));
return(0);
static const char *nouams = "*\n";
-int gq_rbiuamlist( out )
- struct papfile *out;
+int gq_rbiuamlist( struct papfile *out)
{
char uamnames[128] = "\0";
{ "ADOIsBinaryOK?", gq_true },
{ "UMICHListQueue", gq_true },
{ "UMICHDeleteJob", gq_true },
- { NULL },
+ { NULL, NULL },
};
-int cq_query( in, out )
- struct papfile *in, *out;
+int cq_query( struct papfile *in, struct papfile *out)
{
char *start, *stop, *p, *q;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
stop = start+linelength;
}
}
- for ( p++; p < stop; p++ ) {
+ if (p < stop) for ( p++; p < stop; p++ ) {
if ( *p != ' ' && *p != '\t' ) {
break;
}
}
for ( gq = genqueries; gq->gq_name; gq++ ) {
- if (( strlen( gq->gq_name ) == q - p ) &&
+ if (( strlen( gq->gq_name ) == (size_t)(q - p) ) &&
( strncmp( gq->gq_name, p, q - p ) == 0 )) {
break;
}
if ( gq->gq_name == NULL || gq->gq_handler == NULL ||
(gq->gq_handler)( out ) < 0 ) {
if ( comswitch( queries, cq_default ) < 0 ) {
- LOG(log_error, logtype_default, "cq_feature: can't find default!" );
+ LOG(log_error, logtype_papd, "cq_feature: can't find default!" );
exit( 1 );
}
return( CH_DONE );
}
}
-void cq_font_answer( start, stop, out )
- char *start, *stop;
- struct papfile *out;
+void cq_font_answer( char *start, char *stop, struct papfile *out)
{
char *p, *q, buf[ 256 ];
struct ppd_font *pfo;
p = start;
while ( p < stop ) {
+ unsigned int count = 0;
while (( *p == ' ' || *p == '\t' ) && p < stop ) {
p++;
}
q = buf;
while ( *p != ' ' && *p != '\t' &&
- *p != '\n' && *p != '\r' && p < stop ) {
+ *p != '\n' && *p != '\r' && p < stop && count < sizeof(buf)) {
*q++ = *p++;
+ count++;
}
if ( q != buf ) {
return;
}
-int cq_font( in, out )
- struct papfile *in, *out;
+int cq_font(struct papfile *in, struct papfile *out)
{
char *start, *stop, *p;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
stop = start + linelength;
break;
}
}
- p++;
+ if (p < stop)
+ p++;
cq_font_answer( p, stop, out );
} else {
break;
}
}
- p++;
+ if (p < stop)
+ p++;
cq_font_answer( p, stop, out );
} else {
}
}
-int cq_feature( in, out )
- struct papfile *in, *out;
+int cq_feature( struct papfile *in, struct papfile *out)
{
char *start, *stop, *p;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
stop = start + linelength;
break;
}
}
- p++;
+ if (p < stop)
+ p++;
while ( *p == ' ' ) {
p++;
}
if (( pfe = ppd_feature( p, stop - p )) == NULL ) {
if ( comswitch( queries, cq_default ) < 0 ) {
- LOG(log_error, logtype_default, "cq_feature: can't find default!" );
+ LOG(log_error, logtype_papd, "cq_feature: can't find default!" );
exit( 1 );
}
return( CH_DONE );
static const char *psver = "*PSVersion\n";
static const char *prod = "*Product\n";
-int cq_printer( in, out )
- struct papfile *in, *out;
+int cq_printer(struct papfile *in, struct papfile *out)
{
char *start, *p;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
if ( comgetflags() == 0 ) {
if (( pdpsver = ppd_feature( psver, strlen( psver ))) == NULL ) {
if ( comswitch( queries, cq_default ) < 0 ) {
- LOG(log_error, logtype_default, "cq_printer: can't find default!" );
+ LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
exit( 1 );
}
return( CH_DONE );
}
}
if ( *p == '\0' ) {
- LOG(log_error, logtype_default, "cq_printer: can't parse PSVersion!" );
+ LOG(log_error, logtype_papd, "cq_printer: can't parse PSVersion!" );
if ( comswitch( queries, cq_default ) < 0 ) {
- LOG(log_error, logtype_default, "cq_printer: can't find default!" );
+ LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
exit( 1 );
}
return( CH_DONE );
if (( pdprod = ppd_feature( prod, strlen( prod ))) == NULL ) {
if ( comswitch( queries, cq_default ) < 0 ) {
- LOG(log_error, logtype_default, "cq_printer: can't find default!" );
+ LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
exit( 1 );
}
return( CH_DONE );
}
}
+#ifndef HAVE_CUPS
+
static const char *rmjobfailed = "Failed\n";
static const char *rmjobok = "Ok\n";
-int cq_rmjob( in, out )
- struct papfile *in, *out;
+int cq_rmjob( struct papfile *in, struct papfile *out)
{
char *start, *stop, *p;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
stop = start + linelength;
return( CH_DONE );
}
-int cq_listq( in, out )
- struct papfile *in, *out;
+int cq_listq( struct papfile *in, struct papfile *out)
{
char *start;
int linelength, crlflength;
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
if ( lp_queue( out )) {
- LOG(log_error, logtype_default, "cq_listq: lp_queue failed" );
+ LOG(log_error, logtype_papd, "cq_listq: lp_queue failed" );
}
compop();
CONSUME( in, linelength + crlflength );
return( CH_DONE );
}
+#endif /* HAVE_CUPS */
/*
disabled ]%%\r%%[Flushing: rest of job (to end-of-file) will be \
ignored ]%%\r";
-int cq_rbilogin( in, out )
- struct papfile *in, *out;
+int cq_rbilogin( struct papfile *in, struct papfile *out)
{
char *start, *stop, *p, *begin;
int linelength, crlflength;
- char username[9] = "\0";
+ char username[UAM_USERNAMELEN + 1] = "\0";
struct papd_comment *comment = compeek();
- char uamtype[20] = "\0";
+ char uamtype[20];
for (;;) {
switch ( markline( in, &start, &linelength, &crlflength )) {
case -1 :
return( CH_MORE );
+
+ case -2 :
+ return( CH_ERROR );
}
stop = start + linelength;
begin = start + strlen(comment->c_begin);
p = begin;
- while (*p != ' ') {
+ while (*p != ' ' && p < stop) {
p++;
}
- strncat(uamtype, begin, p - begin);
+ memset(uamtype, 0, sizeof(uamtype));
+ if ((size_t)(p -begin) <= sizeof(uamtype) -1) {
+ strncpy(uamtype, begin, p - begin);
+ }
- if ((papd_uam = auth_uamfind(UAM_SERVER_PRINTAUTH,
+ if ( !*uamtype || (papd_uam = auth_uamfind(UAM_SERVER_PRINTAUTH,
uamtype, strlen(uamtype))) == NULL) {
- LOG(log_info, logtype_default, "Could not find uam: %s", uamtype);
+ LOG(log_info, logtype_papd, "Could not find uam: %s", uamtype);
append(out, rbiloginbad, strlen(rbiloginbad));
append(out, rbiloginerrstr, strlen(rbiloginerrstr));
} else {
if ( (papd_uam->u.uam_printer(p,stop,username,out)) == 0 ) {
lp_person( username );
+ append(out, rbiloginok, strlen( rbiloginok ));
+ LOG(log_info, logtype_papd, "RBILogin: Logged in '%s'", username);
} else {
append(out, rbiloginbad, strlen( rbiloginbad));
append(out, rbiloginerrstr, strlen(rbiloginerrstr));
*/
struct papd_comment queries[] = {
#ifdef KRB
- { "%%Login: UMICHKerberosIV", 0, cq_k4login, 0 },
- { "%%?BeginUAMethodsQuery", "%%?EndUAMethodsQuery:", cq_uameth, C_FULL },
+ { "%%Login: UMICHKerberosIV", NULL, cq_k4login, 0 },
+ { "%%?BeginUAMethodsQuery", "%%?EndUAMethodsQuery:", cq_uameth,C_FULL },
#endif /* KRB */
- { "%UMICHListQueue", 0, cq_listq, C_FULL },
- { "%UMICHDeleteJob", 0, cq_rmjob, 0 },
+#ifndef HAVE_CUPS
+ { "%UMICHListQueue", NULL, cq_listq, C_FULL },
+ { "%UMICHDeleteJob", NULL, cq_rmjob, 0 },
+#endif /* HAVE_CUPS */
{ "%%?BeginQuery: RBILogin ", "%%?EndQuery", cq_rbilogin, 0 },
{ "%%?BeginQuery", "%%?EndQuery", cq_query, 0 },
{ "%%?BeginFeatureQuery", "%%?EndFeatureQuery", cq_feature, 0 },
{ "%%?BeginFontQuery", "%%?EndFontQuery", cq_font, 0 },
- { "%%?BeginPrinterQuery", "%%?EndPrinterQuery", cq_printer, C_FULL },
+ { "%%?BeginPrinterQuery", "%%?EndPrinterQuery", cq_printer,C_FULL },
{ "%%?Begin", "%%?End", cq_default, 0 },
- { 0 },
+ { NULL, NULL, NULL, 0 },
};