]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/queries.c
remove pre ansi declarations
[netatalk.git] / etc / papd / queries.c
index 44e8019d77a5bd0148cc580c4da7529ff955ae1f..ef1c5a6e8991c0e074408dbac5fd3563397ae101 100644 (file)
@@ -1,14 +1,18 @@
 /*
+ * $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.
  */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
+#endif /* HAVE_CONFIG_H */
 
 #include <string.h>
-#include <sys/syslog.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <atalk/logger.h>
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/types.h>
 #ifdef KRB
 #ifdef SOLARIS
 #include <kerberos/krb.h>
-#else
+#else /* SOLARIS */
 #include <krb.h>
-#endif
-#endif KRB
+#endif /* SOLARIS */
+#endif /* KRB */
 
 #include "file.h"
 #include "comment.h"
 #include "printer.h"
 #include "ppd.h"
+#include "lp.h"
 #include "uam_auth.h"
 
-cq_default( in, out )
-    struct papfile     *in, *out;
+int cq_default( struct papfile *, struct papfile * );
+int cq_k4login( struct papfile *, struct papfile * );
+int cq_uameth( struct papfile *, struct papfile * );
+
+int gq_balance( struct papfile * );
+int gq_pagecost( struct papfile * );
+int gq_true( struct papfile * );
+int gq_rbispoolerid( struct papfile * );
+int gq_rbiuamlist( struct papfile * );
+
+int cq_query( struct papfile *, struct papfile * );
+void cq_font_answer( char *, char *, struct papfile * );
+int cq_font( struct papfile *, struct papfile * );
+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( struct papfile *in, struct papfile *out)
 {
     char               *start, *stop, *p;
     int                        linelength, crlflength;
@@ -43,6 +70,9 @@ cq_default( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start+linelength;
@@ -63,9 +93,11 @@ cq_default( in, out )
                        break;
                    }
                }
-               p++;
-               while ( *p == ' ' ) {
+               if (p < stop) {
                    p++;
+                   while ( *p == ' ' ) {
+                       p++;
+                    }
                }
 
                append( out, p, stop - p + crlflength );
@@ -85,8 +117,7 @@ char *LoginFailed = "LoginFailed\n";
 
 #define h2b(x) (isdigit((x))?(x)-'0':(isupper((x))?(x)-'A':(x)-'a')+10)
 
-cq_k4login( in, out )
-    struct papfile     *in, *out;
+int cq_k4login( struct papfile *in, struct papfile *out)
 {
     char               *start, *p;
     int                        linelength, crlflength;
@@ -102,6 +133,9 @@ cq_k4login( in, out )
 
     case -1 :
        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
     p = start + strlen( comment->c_begin );
@@ -111,6 +145,7 @@ cq_k4login( in, out )
 
     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 ));
@@ -119,13 +154,13 @@ cq_k4login( in, out )
 
     if (( rc = krb_rd_req( &tkt, "LaserWriter", printer->p_name,
            0, &ad, "" )) != RD_AP_OK ) {
-       syslog( LOG_ERR, "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 );
     }
-    syslog( LOG_INFO, "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 );
@@ -138,8 +173,7 @@ cq_k4login( in, out )
 
 char   *uameth = "UMICHKerberosIV\n*\n";
 
-cq_uameth( in, out )
-    struct papfile     *in, *out;
+int cq_uameth( struct papfile *in, struct papfile *out)
 {
     char               *start;
     int                        linelength, crlflength;
@@ -152,12 +186,15 @@ cq_uameth( in, out )
 
        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 ) {
-                   syslog( LOG_ERR, "cq_uameth: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_uameth: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -174,10 +211,9 @@ cq_uameth( in, out )
        CONSUME( in, linelength + crlflength );
     }
 }
-#endif KRB
+#endif /* KRB */
 
-gq_true( out )
-    struct papfile     *out;
+int gq_true( struct papfile *out)
 {
     if ( printer->p_flags & P_SPOOLED ) {
        append( out, "true\n", 5 );
@@ -187,8 +223,7 @@ gq_true( out )
     }
 }
 
-gq_pagecost( out )
-    struct papfile     *out;
+int gq_pagecost( struct papfile *out)
 {
     char               cost[ 60 ];
 
@@ -199,7 +234,7 @@ gq_pagecost( out )
     } else if ( printer->p_flags & P_ACCOUNT ) {
 #ifdef ABS_PRINT
        lp_pagecost();
-#endif ABS_PRINT
+#endif /* ABS_PRINT */
        sprintf( cost, "%d", printer->p_pagecost );
        append( out, cost, strlen( cost ));
     } else {
@@ -210,8 +245,7 @@ gq_pagecost( out )
 }
 
 #ifdef ABS_PRINT
-gq_balance( out )
-    struct papfile     *out;
+int gq_balance( struct papfile *out)
 {
     char               balance[ 60 ];
 
@@ -222,17 +256,16 @@ gq_balance( out )
     append( out, balance, strlen( balance ));
     return( 0 );
 }
-#endif ABS_PRINT
+#endif /* ABS_PRINT */
 
 
 /*
  * Handler for RBISpoolerID
  */
 
-static const char *spoolerid = "(PAPD Spooler) 2.1 (2.1.4 pre-release)\n";
+static const char *spoolerid = "(PAPD Spooler) 1.0 (" VERSION ")\n";
 
-gq_rbispoolerid( out )
-    struct papfile     *out;
+int gq_rbispoolerid( struct papfile *out)
 {
     append( out, spoolerid, strlen( spoolerid ));
     return(0);
@@ -246,8 +279,7 @@ gq_rbispoolerid( out )
 
 static const char *nouams = "*\n";
 
-gq_rbiuamlist( out )
-    struct papfile      *out;
+int gq_rbiuamlist( struct papfile *out)
 {
     char uamnames[128] = "\0";
 
@@ -273,16 +305,16 @@ struct genquery {
     { "UMICHCostPerPage", gq_pagecost },
 #ifdef notdef
     { "UMICHUserBalance", gq_balance },
-#endif 
+#endif /* notdef */
     { "RBISpoolerID",  gq_rbispoolerid },
     { "RBIUAMListQuery", gq_rbiuamlist },
+    { "ADOIsBinaryOK?", gq_true },
     { "UMICHListQueue", gq_true },
     { "UMICHDeleteJob", gq_true },
-    { NULL },
+    { NULL, NULL },
 };
 
-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;
@@ -297,6 +329,9 @@ cq_query( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start+linelength;
@@ -310,7 +345,7 @@ cq_query( in, out )
                }
            }
 
-           for ( p++; p < stop; p++ ) {
+           if (p < stop) for ( p++; p < stop; p++ ) {
                if ( *p != ' ' && *p != '\t' ) {
                    break;
                }
@@ -323,7 +358,7 @@ cq_query( in, out )
            }
 
            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;
                }
@@ -331,7 +366,7 @@ cq_query( in, out )
            if ( gq->gq_name == NULL || gq->gq_handler == NULL ||
                    (gq->gq_handler)( out ) < 0 ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   syslog( LOG_ERR, "cq_feature: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_feature: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -348,23 +383,23 @@ cq_query( in, out )
     }
 }
 
-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 ) {
@@ -385,8 +420,7 @@ cq_font_answer( start, stop, out )
     return;
 }
 
-cq_font( in, out )
-    struct papfile     *in, *out;
+int cq_font(struct papfile *in, struct papfile *out)
 {
     char               *start, *stop, *p;
     int                        linelength, crlflength;
@@ -399,6 +433,9 @@ cq_font( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start + linelength;
@@ -411,7 +448,8 @@ cq_font( in, out )
                    break;
                }
            }
-           p++;
+           if (p < stop)
+               p++;
 
            cq_font_answer( p, stop, out );
        } else {
@@ -424,7 +462,8 @@ cq_font( in, out )
                        break;
                    }
                }
-               p++;
+               if (p < stop)
+                   p++;
 
                cq_font_answer( p, stop, out );
            } else {
@@ -442,8 +481,7 @@ cq_font( in, out )
     }
 }
 
-cq_feature( in, out )
-    struct papfile     *in, *out;
+int cq_feature( struct papfile *in, struct papfile *out)
 {
     char               *start, *stop, *p;
     int                        linelength, crlflength;
@@ -457,6 +495,9 @@ cq_feature( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        stop = start + linelength;
@@ -470,14 +511,15 @@ cq_feature( in, out )
                    break;
                }
            }
-           p++;
+           if (p < stop)
+               p++;
            while ( *p == ' ' ) {
                p++;
            }
 
            if (( pfe = ppd_feature( p, stop - p )) == NULL ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   syslog( LOG_ERR, "cq_feature: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_feature: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -500,8 +542,7 @@ cq_feature( in, out )
 static const char      *psver = "*PSVersion\n";
 static const char      *prod = "*Product\n";
 
-cq_printer( in, out )
-    struct papfile     *in, *out;
+int cq_printer(struct papfile *in, struct papfile *out)
 {
     char               *start, *p;
     int                        linelength, crlflength;
@@ -515,6 +556,9 @@ cq_printer( in, out )
 
        case -1 :
            return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
        }
 
        if ( comgetflags() == 0 ) {
@@ -522,7 +566,7 @@ cq_printer( in, out )
 
            if (( pdpsver = ppd_feature( psver, strlen( psver ))) == NULL ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   syslog( LOG_ERR, "cq_printer: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -534,9 +578,9 @@ cq_printer( in, out )
                }
            }
            if ( *p == '\0' ) {
-               syslog( LOG_ERR, "cq_printer: can't parse PSVersion!" );
+               LOG(log_error, logtype_papd, "cq_printer: can't parse PSVersion!" );
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   syslog( LOG_ERR, "cq_printer: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -544,7 +588,7 @@ cq_printer( in, out )
 
            if (( pdprod = ppd_feature( prod, strlen( prod ))) == NULL ) {
                if ( comswitch( queries, cq_default ) < 0 ) {
-                   syslog( LOG_ERR, "cq_printer: can't find default!" );
+                   LOG(log_error, logtype_papd, "cq_printer: can't find default!" );
                    exit( 1 );
                }
                return( CH_DONE );
@@ -573,11 +617,12 @@ cq_printer( in, out )
     }
 }
 
+#ifndef HAVE_CUPS
+
 static const char      *rmjobfailed = "Failed\n";
 static const char      *rmjobok = "Ok\n";
 
-cq_rmjob( in, out )
-    struct papfile     *in, *out;
+int cq_rmjob( struct papfile *in, struct papfile *out)
 {
     char               *start, *stop, *p;
     int                        linelength, crlflength;
@@ -589,6 +634,9 @@ cq_rmjob( in, out )
 
     case -1 :
        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
     stop = start + linelength;
@@ -617,8 +665,7 @@ cq_rmjob( in, out )
     return( CH_DONE );
 }
 
-cq_listq( in, out )
-    struct papfile     *in, *out;
+int cq_listq( struct papfile *in, struct papfile *out)
 {
     char               *start;
     int                        linelength, crlflength;
@@ -629,16 +676,20 @@ cq_listq( in, out )
 
     case -1 :
        return( CH_MORE );
+
+    case -2 :
+        return( CH_ERROR );
     }
 
     if ( lp_queue( out )) {
-       syslog( LOG_ERR, "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 */
 
 
 /*
@@ -650,17 +701,16 @@ static const char *rbiloginok = "0\r";
 static const char *rbiloginbad = "-1\r";
 static const char *rbiloginerrstr = "%%[Error: SecurityError; \
 SecurityViolation: Unknown user, incorrect password or log on is \
-disabled ]%%\r%%Flushing: rest of job (to end-of-file) will be \
+disabled ]%%\r%%[Flushing: rest of job (to end-of-file) will be \
 ignored ]%%\r";
 
-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 )) {
@@ -669,6 +719,9 @@ cq_rbilogin( in, out )
 
         case -1 :
             return( CH_MORE );
+
+        case -2 :
+            return( CH_ERROR );
         }
 
        stop = start + linelength;
@@ -677,20 +730,25 @@ cq_rbilogin( in, out )
            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) {
-               syslog(LOG_INFO, "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));
@@ -715,16 +773,18 @@ cq_rbilogin( in, out )
  */
 struct papd_comment    queries[] = {
 #ifdef KRB
-    { "%%Login: UMICHKerberosIV", 0,                   cq_k4login,     0 },
-    { "%%?BeginUAMethodsQuery",        "%%?EndUAMethodsQuery:", cq_uameth, C_FULL },
-#endif KRB
-    { "%UMICHListQueue", 0,                            cq_listq, C_FULL },
-    { "%UMICHDeleteJob", 0,                            cq_rmjob,       0 },
+    { "%%Login: UMICHKerberosIV", NULL,                        cq_k4login,     0 },
+    { "%%?BeginUAMethodsQuery",        "%%?EndUAMethodsQuery:", cq_uameth,C_FULL },
+#endif /* KRB */
+#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 },
 };