]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/main.c
Update NEWS
[netatalk.git] / etc / papd / main.c
index 03d3961c969edd3b09de5c876980c062421862a7..d0c46451b7adf56d88e6269ae6014b0f78c92566 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: main.c,v 1.22 2008-08-07 07:47:44 didg Exp $
+ * $Id: main.c,v 1.31 2009-10-29 13:38:15 didg Exp $
  *
  * Copyright (c) 1990,1995 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
 #include <sys/param.h>
 #include <sys/time.h>
 #include <sys/uio.h>
-#if defined( sun ) && defined( __svr4__ )
-#include </usr/ucbinclude/sys/file.h>
-#else /* sun && __svr4__ */
 #include <sys/file.h>
-#endif /* sun && __svr4__ */
 #include <sys/socket.h>
 #include <atalk/logger.h>
 
@@ -76,7 +72,6 @@ char *strchr (), *strrchr ();
 #include "uam_auth.h"
 #include "print_cups.h"
 
-#define _PATH_PAPDPPDFILE      ".ppd"
 
 #define PIPED_STATUS   "status: print spooler processing job"
 
@@ -109,11 +104,8 @@ static void papd_exit(const int i)
   exit(i);
 }
 
-#if !defined( ibm032 ) && !defined( _IBMR2 )
-    void
-#endif /* ! ibm032 && ! _IBMR2 */
-die( n )
-    int                        n;
+static void
+die(int n)
 {
     struct printer     *pr;
     struct at_addr     addr;
@@ -141,15 +133,13 @@ die( n )
     papd_exit( n );
 }
 
-#if !defined( ibm032 ) && !defined( _IBMR2 )
-    void
-#endif /* ! ibm032 && ! _IBMR2 */
-reap()
+static void
+reap(int sig _U_)
 {
     int                status;
     int                pid;
 
-    while (( pid = wait3( &status, WNOHANG, 0 )) > 0 ) {
+    while (( pid = wait3( &status, WNOHANG, NULL )) > 0 ) {
        if ( WIFEXITED( status )) {
            if ( WEXITSTATUS( status )) {
                LOG(log_error, logtype_papd, "child %d exited with %d", pid,
@@ -169,11 +159,9 @@ reap()
     return;
 }
 
-char           rbuf[ 255 + 1 + 8 ];
+static char rbuf[ 255 + 1 + 8 ];
 
-int main( ac, av )
-    int                ac;
-    char       **av;
+int main(int ac, char **av)
 {
     extern char         *optarg;
 
@@ -193,7 +181,7 @@ int main( ac, av )
        perror( "gethostname" );
        exit( 1 );
     }
-    if (( p = strchr( hostname, '.' )) != 0 ) {
+    if (( p = strchr( hostname, '.' )) != NULL ) {
        *p = '\0';
     }
     if (( defprinter.p_name = (char *)malloc( strlen( hostname ) + 1 ))
@@ -205,7 +193,6 @@ int main( ac, av )
     defprinter.p_type = "LaserWriter";
     defprinter.p_zone = "*";
     memset(&defprinter.p_addr, 0, sizeof(defprinter.p_addr));
-    defprinter.p_ppdfile = _PATH_PAPDPPDFILE;
 #ifdef __svr4__
     defprinter.p_flags = P_PIPED;
     defprinter.p_printer = "/usr/bin/lp -T PS";
@@ -304,14 +291,14 @@ int main( ac, av )
        }
 
        if (!(pr->p_flags & P_CUPS)) {
-               if ((size_t)-1 != convert_string_allocate(CH_UNIX, CH_MAC, pr->p_name, strlen(pr->p_name), &atname)) {
+               if ((size_t)-1 != convert_string_allocate(CH_UNIX, CH_MAC, pr->p_name, -1, &atname)) {
                        pr->p_u_name = pr->p_name;
                        pr->p_name = atname;
                }
        }
                        
        if (( pr->p_atp = atp_open( ATADDR_ANYPORT, &pr->p_addr )) == NULL ) {
-           LOG(log_error, logtype_papd, "atp_open: %m" );
+           LOG(log_error, logtype_papd, "atp_open: %s", strerror(errno) );
            papd_exit( 1 );
        }
        if ( nbp_rgstr( atp_sockaddr( pr->p_atp ), pr->p_name, pr->p_type,
@@ -335,16 +322,16 @@ int main( ac, av )
     sv.sa_handler = die;
     sigemptyset( &sv.sa_mask );
     sv.sa_flags = SA_RESTART;
-    if ( sigaction( SIGTERM, &sv, 0 ) < 0 ) {
-       LOG(log_error, logtype_papd, "sigaction: %m" );
+    if ( sigaction( SIGTERM, &sv, NULL ) < 0 ) {
+       LOG(log_error, logtype_papd, "sigaction: %s", strerror(errno) );
        papd_exit( 1 );
     }
 
     sv.sa_handler = reap;
     sigemptyset( &sv.sa_mask );
     sv.sa_flags = SA_RESTART;
-    if ( sigaction( SIGCHLD, &sv, 0 ) < 0 ) {
-       LOG(log_error, logtype_papd, "sigaction: %m" );
+    if ( sigaction( SIGCHLD, &sv, NULL ) < 0 ) {
+       LOG(log_error, logtype_papd, "sigaction: %s", strerror(errno) );
        papd_exit( 1 );
     }
 
@@ -361,11 +348,11 @@ int main( ac, av )
        for ( pr = printers; pr; pr = pr->p_next ) {
            FD_SET( atp_fileno( pr->p_atp ), &fdset );
        }
-       if (( c = select( FD_SETSIZE, &fdset, 0, 0, 0 )) < 0 ) {
+       if (( c = select( FD_SETSIZE, &fdset, NULL, NULL, NULL )) < 0 ) {
            if ( errno == EINTR ) {
                continue;
            }
-           LOG(log_error, logtype_papd, "select: %m" );
+           LOG(log_error, logtype_papd, "select: %s", strerror(errno) );
            papd_exit( 1 );
        }
 
@@ -389,7 +376,7 @@ int main( ac, av )
                atpb.atp_rreqdata = cbuf;
                atpb.atp_rreqdlen = sizeof( cbuf );
                if ( atp_rreq( pr->p_atp, &atpb ) < 0 ) {
-                   LOG(log_error, logtype_papd, "atp_rreq: %m" );
+                   LOG(log_error, logtype_papd, "atp_rreq: %s", strerror(errno) );
                    continue;
                }
 
@@ -417,7 +404,7 @@ int main( ac, av )
                    * 0xffff to indicate we're busy
                    */
 #ifdef DEBUG
-                    LOG(log_debug, logtype_papd, "CUPS: PAP_OPEN");
+                    LOG(log_debug9, logtype_papd, "CUPS: PAP_OPEN");
 #endif
                    if ( (pr->p_flags & P_SPOOLED) && (cups_get_printer_status ( pr ) == 0)) {
                         LOG(log_error, logtype_papd, "CUPS_PAP_OPEN: %s is not accepting jobs",
@@ -434,7 +421,7 @@ int main( ac, av )
                     */
                    if (( atp = atp_open( ATADDR_ANYPORT, 
                                          &pr->p_addr)) == NULL ) {
-                       LOG(log_error, logtype_papd, "atp_open: %m" );
+                       LOG(log_error, logtype_papd, "atp_open: %s", strerror(errno) );
                        rbuf[ 2 ] = rbuf[ 3 ] = 0xff;  /* printer busy */
                        rbuf[ 4 ] = 0; /* FIXME is it right? */
                        err = 1;
@@ -453,7 +440,7 @@ int main( ac, av )
                     * This may error out if we lose a route, so we won't die().
                     */
                    if ( atp_sresp( pr->p_atp, &atpb ) < 0 ) {
-                       LOG(log_error, logtype_papd, "atp_sresp: %m" );
+                       LOG(log_error, logtype_papd, "atp_sresp: %s", strerror(errno) );
                        err = 1;
                    }
 
@@ -466,7 +453,7 @@ int main( ac, av )
 
                    switch ( c = fork()) {
                    case -1 :
-                       LOG(log_error, logtype_papd, "fork: %m" );
+                       LOG(log_error, logtype_papd, "fork: %s", strerror(errno) );
                         atp_close(atp);
                        continue;
 
@@ -476,13 +463,13 @@ int main( ac, av )
                        #ifndef HAVE_CUPS
                        if (( printer->p_flags & P_SPOOLED ) &&
                                chdir( printer->p_spool ) < 0 ) {
-                           LOG(log_error, logtype_papd, "chdir %s: %m", printer->p_spool );
+                           LOG(log_error, logtype_papd, "chdir %s: %s", printer->p_spool, strerror(errno) );
                            exit( 1 );
                        }
                        #else
                        if (( printer->p_flags & P_SPOOLED ) &&
                                chdir( SPOOLDIR ) < 0 ) {
-                           LOG(log_error, logtype_papd, "chdir %s: %m", SPOOLDIR );
+                           LOG(log_error, logtype_papd, "chdir %s: %s", SPOOLDIR, strerror(errno) );
                            exit( 1 );
                        }
 
@@ -491,10 +478,15 @@ int main( ac, av )
                        sv.sa_handler = SIG_DFL;
                        sigemptyset( &sv.sa_mask );
                        sv.sa_flags = SA_RESTART;
-                       if ( sigaction( SIGTERM, &sv, 0 ) < 0 ) {
-                           LOG(log_error, logtype_papd, "sigaction: %m" );
+                       if ( sigaction( SIGTERM, &sv, NULL ) < 0 ) {
+                           LOG(log_error, logtype_papd, "sigaction: %s", strerror(errno) );
                            exit( 1 );
                        }
+                       
+                       if ( sigaction( SIGCHLD, &sv, NULL ) < 0 ) {
+                           LOG(log_error, logtype_papd, "sigaction: %s", strerror(errno) );
+                           exit( 1 );
+                        }
 
                        for ( pr = printers; pr; pr = pr->p_next ) {
                            atp_close( pr->p_atp );
@@ -530,7 +522,7 @@ int main( ac, av )
                     * This may error out if we lose a route, so we won't die().
                     */
                    if ( atp_sresp( pr->p_atp, &atpb ) < 0 ) {
-                       LOG(log_error, logtype_papd, "atp_sresp: %m" );
+                       LOG(log_error, logtype_papd, "atp_sresp: %s", strerror(errno) );
                    }
                    break;
 
@@ -555,7 +547,7 @@ int main( ac, av )
                 * This may error out if we lose a route, so we won't die().
                 */
                if ( atp_sresp( pr->p_atp, &atpb ) < 0 ) {
-                   LOG(log_error, logtype_papd, "atp_sresp: %m" );
+                   LOG(log_error, logtype_papd, "atp_sresp: %s", strerror(errno) );
                }
 #endif /* notdef */
            }
@@ -568,9 +560,7 @@ int main( ac, av )
  * We assume buf is big enough for 255 bytes of data and a length byte.
  */
 
-int getstatus( pr, buf )
-    struct printer     *pr;
-    char               *buf;
+int getstatus(struct printer *pr, char *buf)
 {
 
 #ifdef HAVE_CUPS
@@ -613,13 +603,12 @@ int getstatus( pr, buf )
 #endif /* HAVE_CUPS */
 }
 
-char   *pgetstr();
+char   *pgetstr(char *id, char **area);
 char   *getpname(char **area, int bufsize);
 
 #define PF_CONFBUFFER  1024
 
-static void getprinters( cf )
-    char       *cf;
+static void getprinters( char *cf)
 {
     char               buf[ PF_CONFBUFFER ], area[ PF_CONFBUFFER ], *a, *p, *name, *type, *zone;
     struct printer     *pr;
@@ -685,9 +674,7 @@ static void getprinters( cf )
        /*
         * Get PPD file.
         */
-       if (( p = pgetstr( "pd", &a )) == NULL ) {
-           pr->p_ppdfile = defprinter.p_ppdfile;
-       } else {
+       if (( p = pgetstr( "pd", &a ) )) {
            if (( pr->p_ppdfile = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
                perror( "malloc" );
                exit( 1 );
@@ -807,8 +794,7 @@ static void getprinters( cf )
     }
 }
 
-int rprintcap( pr )
-    struct printer     *pr;
+int rprintcap( struct printer *pr)
 {
 
 #ifdef HAVE_CUPS
@@ -826,15 +812,15 @@ int rprintcap( pr )
      * Check for ppd file, moved here because of cups_autoadd we cannot check at the usual location
      */
 
-    if ( pr->p_ppdfile == defprinter.p_ppdfile ) {
+    if ( pr->p_ppdfile == NULL ) {
        if ( (p = (char *) cups_get_printer_ppd ( pr->p_printer )) != NULL ) {
            if (( pr->p_ppdfile = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %m" );
+               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
                exit( 1 );
            }
            strcpy( pr->p_ppdfile, p );
            pr->p_flags |= P_CUPS_PPD;
-           /*LOG(log_info, logtype_papd, "PPD File for %s set to %s", pr->p_printer, pr->p_ppdfile );*/
+           LOG(log_info, logtype_papd, "PPD File for %s set to %s", pr->p_printer, pr->p_ppdfile );
        }
     }
 
@@ -864,7 +850,7 @@ int rprintcap( pr )
            pr->p_spool = defprinter.p_spool;
        } else {
            if (( pr->p_spool = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %m" );
+               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
                exit( 1 );
            }
            strcpy( pr->p_spool, p );
@@ -888,7 +874,7 @@ int rprintcap( pr )
            } else {
                if (( pr->p_role =
                        (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-                   LOG(log_error, logtype_papd, "malloc: %m" );
+                   LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
                    exit( 1 );
                }
                strcpy( pr->p_role, p );
@@ -914,7 +900,7 @@ int rprintcap( pr )
        if (( p = pgetstr( "pc", &a )) != NULL ) {
            if (( pr->p_pagecost_msg =
                    (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %m" );
+               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
                exit( 1 );
            }
            strcpy( pr->p_pagecost_msg, p );
@@ -939,7 +925,7 @@ int rprintcap( pr )
            pr->p_lock = defprinter.p_lock;
        } else {
            if (( pr->p_lock = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %m" );
+               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
                exit( 1 );
            }
            strcpy( pr->p_lock, p );