]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/lp.c
Fix all remaining warnings from gcc -Wall that can be fixed
[netatalk.git] / etc / papd / lp.c
index ba3cc0e2f292a950533f0a1d7be5ef923dab601f..3b817b9f4d3c7d1cdca4d496ad517b9dafcdf377 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: lp.c,v 1.17 2008-08-14 20:18:50 didg Exp $
+ * $Id: lp.c,v 1.31 2009-10-22 13:40:11 franklahm Exp $
  *
  * Copyright (c) 1990,1994 Regents of The University of Michigan.
  * All Rights Reserved.  See COPYRIGHT.
 #include <unistd.h>
 #endif /* HAVE_UNISTD_H */
 
-#if defined( sun ) && defined( __svr4__ )
-#include </usr/ucbinclude/sys/file.h>
-#else /* sun && __svr4__ */
 #include <sys/file.h>
-#endif /* sun && __svr4__ */
 #include <sys/un.h>
 #include <netinet/in.h>
 #undef s_net
@@ -96,11 +92,11 @@ int lp_disconn_inet( int );
 int lp_conn_unix();
 int lp_disconn_unix( int );
 
-char   hostname[ MAXHOSTNAMELEN ];
+static char hostname[ MAXHOSTNAMELEN ];
 
 extern struct sockaddr_at *sat;
 
-struct lp {
+static struct lp {
     int                        lp_flags;
     FILE               *lp_stream;
     int                        lp_seq;
@@ -131,7 +127,7 @@ static void convert_octal (char *string, charset_t dest)
     char temp[4];
     long int ch;
 
-    q=p=string;
+    q=p=(unsigned char *)string;
     while ( *p != '\0' ) {
         ch = 0;
         if ( *p == '\\' ) {
@@ -212,6 +208,8 @@ static void lp_setup_comments (charset_t dest)
 
 #define is_var(a, b) (strncmp((a), (b), 2) == 0)
 
+#if 0
+/* removed, it's not used and a pain to get it right from a security POV */
 static size_t quote(char *dest, char *src, const size_t bsize, size_t len)
 {
 size_t used = 0;
@@ -238,7 +236,6 @@ size_t used = 0;
     return used;
 }
 
-
 static char* pipexlate(char *src)
 {
     char *p, *q, *dest; 
@@ -300,25 +297,28 @@ static char* pipexlate(char *src)
             destlen -= len;
         }
     }
+    if (!destlen) {
+        /* reach end of buffer, maybe prematurely, give up */
+        return NULL;
+    }
     return destbuf;
 }
+#endif
 
-
-void lp_person( person )
-    char       *person;
+void lp_person(char *person)
 {
     if ( lp.lp_person != NULL ) {
        free( lp.lp_person );
     }
     if (( lp.lp_person = (char *)malloc( strlen( person ) + 1 )) == NULL ) {
-       LOG(log_error, logtype_papd, "malloc: %m" );
+       LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
        exit( 1 );
     }
     strcpy( lp.lp_person, person );
 }
 
 #ifdef ABS_PRINT
-int lp_pagecost()
+int lp_pagecost(void)
 {
     char       cost[ 22 ];
     char       balance[ 22 ];
@@ -335,14 +335,13 @@ int lp_pagecost()
 }
 #endif /* ABS_PRINT */
 
-void lp_host( host )
-    char       *host;
+void lp_host( char *host)
 {
     if ( lp.lp_host != NULL ) {
        free( lp.lp_host );
     }
     if (( lp.lp_host = (char *)malloc( strlen( host ) + 1 )) == NULL ) {
-       LOG(log_error, logtype_papd, "malloc: %m" );
+       LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
        exit( 1 );
     }
     strcpy( lp.lp_host, host );
@@ -354,8 +353,7 @@ void lp_host( host )
  * This should be added.
  */
 
-void lp_job( job )
-    char       *job;
+void lp_job(char *job)
 {
     if ( lp.lp_job != NULL ) {
        free( lp.lp_job );
@@ -368,8 +366,7 @@ void lp_job( job )
     
 }
 
-void lp_for ( lpfor )
-       char    *lpfor;
+void lp_for (char *lpfor)
 {
     if ( lp.lp_created_for != NULL ) {
        free( lp.lp_created_for );
@@ -379,9 +376,7 @@ void lp_for ( lpfor )
 }
 
 
-int lp_init( out, sat )
-    struct papfile     *out;
-    struct sockaddr_at *sat;
+static int lp_init(struct papfile *out, struct sockaddr_at *sat)
 {
     int                authenticated = 0;
 #ifndef HAVE_CUPS
@@ -431,10 +426,10 @@ int lp_init( out, sat )
                        LOG(log_info, logtype_papd, "CAP error: could not read username");
                    }
                } else {
-                   LOG(log_info, logtype_papd, "CAP error: %m");
+                   LOG(log_info, logtype_papd, "CAP error: %s", strerror(errno));
                }
            } else {
-               LOG(log_info, logtype_papd, "CAP error: %m");
+               LOG(log_info, logtype_papd, "CAP error: %s", strerror(errno));
            }
        }
 
@@ -462,7 +457,7 @@ int lp_init( out, sat )
     }
 
     if ( gethostname( hostname, sizeof( hostname )) < 0 ) {
-       LOG(log_error, logtype_papd, "gethostname: %m" );
+       LOG(log_error, logtype_papd, "gethostname: %s", strerror(errno) );
        exit( 1 );
     }
 
@@ -480,7 +475,7 @@ int lp_init( out, sat )
 #ifndef HAVE_CUPS
        /* check if queuing is enabled: mode & 010 on lock file */
        if ( stat( printer->p_lock, &st ) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_init: %s: %m", printer->p_lock );
+           LOG(log_error, logtype_papd, "lp_init: %s: %s", printer->p_lock, strerror(errno) );
            spoolerror( out, NULL );
            return( -1 );
        }
@@ -506,7 +501,7 @@ int lp_init( out, sat )
 
        n = 0;
        if (( len = read( fd, buf, sizeof( buf ))) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_init read: %m" );
+           LOG(log_error, logtype_papd, "lp_init read: %s", strerror(errno) );
            spoolerror( out, NULL );
            return( -1 );
        }
@@ -544,9 +539,7 @@ int lp_init( out, sat )
     return( 0 );
 }
 
-int lp_open( out, sat )
-    struct papfile     *out;
-    struct sockaddr_at *sat;
+int lp_open(struct papfile *out, struct sockaddr_at *sat)
 {
     char       name[ MAXPATHLEN ];
     int                fd;
@@ -570,36 +563,45 @@ int lp_open( out, sat )
     }
 
     if ( lp.lp_flags & LP_PIPE ) {
+        char *pipe_cmd;
 
        /* go right to program */
        if (lp.lp_person != NULL) {
            if((pwent = getpwnam(lp.lp_person)) != NULL) {
                if(setreuid(pwent->pw_uid, pwent->pw_uid) != 0) {
-                   LOG(log_info, logtype_papd, "setreuid error: %m");
+                   LOG(log_error, logtype_papd, "setreuid error: %s", strerror(errno));
+                   exit(1);
                }
            } else {
-               LOG(log_info, logtype_papd, "Error getting username (%s)", lp.lp_person);
+               LOG(log_error, logtype_papd, "Error getting username (%s)", lp.lp_person);
+                exit(1);
            }
        }
 
        lp_setup_comments(CH_UNIX);
-       if (( lp.lp_stream = popen( pipexlate(printer->p_printer), "w" )) == NULL ) {
-           LOG(log_error, logtype_papd, "lp_open popen %s: %m", printer->p_printer );
+       pipe_cmd = printer->p_printer;
+       if (!pipe_cmd) {
+           LOG(log_error, logtype_papd, "lp_open: no pipe cmd" );
+           spoolerror( out, NULL );
+           return( -1 );
+       }
+       if (( lp.lp_stream = popen(pipe_cmd, "w" )) == NULL ) {
+           LOG(log_error, logtype_papd, "lp_open popen %s: %s", printer->p_printer, strerror(errno) );
            spoolerror( out, NULL );
            return( -1 );
        }
-        LOG(log_debug, logtype_papd, "lp_open: opened %s",  pipexlate(printer->p_printer) );
+        LOG(log_debug, logtype_papd, "lp_open: opened %s",  pipe_cmd );
     } else {
        sprintf( name, "df%c%03d%s", lp.lp_letter++, lp.lp_seq, hostname );
 
        if (( fd = open( name, O_WRONLY|O_CREAT|O_EXCL, 0660 )) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_open %s: %m", name );
+           LOG(log_error, logtype_papd, "lp_open %s: %s", name, strerror(errno) );
            spoolerror( out, NULL );
            return( -1 );
        }
 
        if ( NULL == (lp.lp_spoolfile = (char *) malloc (strlen (name) +1)) ) {
-           LOG(log_error, logtype_papd, "malloc: %m");
+           LOG(log_error, logtype_papd, "malloc: %s", strerror(errno));
            exit(1);
        }
        strcpy ( lp.lp_spoolfile, name);        
@@ -619,13 +621,13 @@ int lp_open( out, sat )
        }
 
        if (fchown(fd, pwent->pw_uid, -1) < 0) {
-           LOG(log_error, logtype_papd, "chown %s %s: %m", pwent->pw_name, name);
+           LOG(log_error, logtype_papd, "chown %s %s: %s", pwent->pw_name, name, strerror(errno));
            spoolerror( out, NULL );
            return( -1 );
        }
 
        if (( lp.lp_stream = fdopen( fd, "w" )) == NULL ) {
-           LOG(log_error, logtype_papd, "lp_open fdopen: %m" );
+           LOG(log_error, logtype_papd, "lp_open fdopen: %s", strerror(errno) );
            spoolerror( out, NULL );
            return( -1 );
        }
@@ -637,7 +639,7 @@ int lp_open( out, sat )
     return( 0 );
 }
 
-int lp_close()
+int lp_close(void)
 {
     if (( lp.lp_flags & LP_INIT ) == 0 || ( lp.lp_flags & LP_OPEN ) == 0 ) {
        return 0;
@@ -651,10 +653,7 @@ int lp_close()
 
 
 
-int lp_write(in, buf, len )
-    struct papfile *in;
-    char       *buf;
-    size_t     len;
+int lp_write(struct papfile *in, char *buf, size_t len)
 {
 #define BUFSIZE 32768
     static char tempbuf[BUFSIZE];
@@ -724,20 +723,20 @@ int lp_write(in, buf, len )
     }
     else if ( bufpos) {
         if ( fwrite( tempbuf, 1, bufpos, lp.lp_stream ) != bufpos ) {
-            LOG(log_error, logtype_papd, "lp_write: %m" );
+            LOG(log_error, logtype_papd, "lp_write: %s", strerror(errno) );
             abort();
         }
         bufpos=0;
     }
 
     if ( fwrite( tbuf, 1, len, lp.lp_stream ) != len ) {
-       LOG(log_error, logtype_papd, "lp_write: %m" );
+       LOG(log_error, logtype_papd, "lp_write: %s", strerror(errno) );
        abort();
     }
     return( 0 );
 }
 
-int lp_cancel()
+int lp_cancel(void)
 {
     char       name[ MAXPATHLEN ];
     char       letter;
@@ -753,7 +752,7 @@ int lp_cancel()
     for ( letter = 'A'; letter < lp.lp_letter; letter++ ) {
        sprintf( name, "df%c%03d%s", letter, lp.lp_seq, hostname );
        if ( unlink( name ) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_cancel unlink %s: %m", name );
+           LOG(log_error, logtype_papd, "lp_cancel unlink %s: %s", name, strerror(errno) );
        }
     }
 
@@ -766,7 +765,7 @@ int lp_cancel()
  *
  * XXX piped?
  */
-int lp_print()
+int lp_print(void)
 {
 #ifndef HAVE_CUPS
     char               buf[ MAXPATHLEN ];
@@ -787,11 +786,11 @@ int lp_print()
 #ifndef HAVE_CUPS
        sprintf( tfname, "tfA%03d%s", lp.lp_seq, hostname );
        if (( fd = open( tfname, O_WRONLY|O_EXCL|O_CREAT, 0660 )) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_print %s: %m", tfname );
+           LOG(log_error, logtype_papd, "lp_print %s: %s", tfname, strerror(errno) );
            return 0;
        }
        if (( cfile = fdopen( fd, "w" )) == NULL ) {
-           LOG(log_error, logtype_papd, "lp_print %s: %m", tfname );
+           LOG(log_error, logtype_papd, "lp_print %s: %s", tfname, strerror(errno) );
            return 0;
        }
        fprintf( cfile, "H%s\n", hostname );    /* XXX lp_host? */
@@ -832,32 +831,32 @@ int lp_print()
 
        sprintf( cfname, "cfA%03d%s", lp.lp_seq, hostname );
        if ( link( tfname, cfname ) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_print can't link %s to %s: %m", cfname,
-                   tfname );
+           LOG(log_error, logtype_papd, "lp_print can't link %s to %s: %s", cfname,
+                   tfname, strerror(errno) );
            return 0;
        }
        unlink( tfname );
 
        if (( s = lp_conn_unix()) < 0 ) {
-           LOG(log_error, logtype_papd, "lp_print: lp_conn_unix: %m" );
+           LOG(log_error, logtype_papd, "lp_print: lp_conn_unix: %s", strerror(errno) );
            return 0;
        }
 
        sprintf( buf, "\1%s\n", printer->p_printer );
        n = strlen( buf );
        if ( write( s, buf, n ) != n ) {
-           LOG(log_error, logtype_papd, "lp_print write: %m" );
+           LOG(log_error, logtype_papd, "lp_print write: %s" , strerror(errno));
            return 0;
        }
        if ( read( s, buf, 1 ) != 1 ) {
-           LOG(log_error, logtype_papd, "lp_print read: %m" );
+           LOG(log_error, logtype_papd, "lp_print read: %s" , strerror(errno));
            return 0;
        }
 
        lp_disconn_unix( s );
 
        if ( buf[ 0 ] != '\0' ) {
-           LOG(log_error, logtype_papd, "lp_print lpd said %c: %m", buf[ 0 ] );
+           LOG(log_error, logtype_papd, "lp_print lpd said %c: %s", buf[ 0 ], strerror(errno) );
            return 0;
        }
 #else
@@ -885,18 +884,18 @@ int lp_print()
 }
 
 #ifndef HAVE_CUPS
-int lp_disconn_unix( fd )
+int lp_disconn_unix( int fd )
 {
     return( close( fd ));
 }
 
-int lp_conn_unix()
+int lp_conn_unix(void)
 {
     int                        s;
     struct sockaddr_un saun;
 
     if (( s = socket( AF_UNIX, SOCK_STREAM, 0 )) < 0 ) {
-       LOG(log_error, logtype_papd, "lp_conn_unix socket: %m" );
+       LOG(log_error, logtype_papd, "lp_conn_unix socket: %s", strerror(errno) );
        return( -1 );
     }
     memset( &saun, 0, sizeof( struct sockaddr_un ));
@@ -904,7 +903,7 @@ int lp_conn_unix()
     strcpy( saun.sun_path, _PATH_DEVPRINTER );
     if ( connect( s, (struct sockaddr *)&saun,
            strlen( saun.sun_path ) + 2 ) < 0 ) {
-       LOG(log_error, logtype_papd, "lp_conn_unix connect %s: %m", saun.sun_path );
+       LOG(log_error, logtype_papd, "lp_conn_unix connect %s: %s", saun.sun_path, strerror(errno) );
        close( s );
        return( -1 );
     }
@@ -917,7 +916,7 @@ int lp_disconn_inet( int fd )
     return( close( fd ));
 }
 
-int lp_conn_inet()
+int lp_conn_inet(void)
 {
     int                        privfd, port = IPPORT_RESERVED - 1;
     struct sockaddr_in sin;
@@ -930,7 +929,7 @@ int lp_conn_inet()
     }
 
     if ( gethostname( hostname, sizeof( hostname )) < 0 ) {
-       LOG(log_error, logtype_papd, "gethostname: %m" );
+       LOG(log_error, logtype_papd, "gethostname: %s", strerror(errno) );
        exit( 1 );
     }
 
@@ -940,7 +939,7 @@ int lp_conn_inet()
     }
 
     if (( privfd = rresvport( &port )) < 0 ) {
-       LOG(log_error, logtype_papd, "lp_connect: socket: %m" );
+       LOG(log_error, logtype_papd, "lp_connect: socket: %s", strerror(errno) );
        close( privfd );
        return( -1 );
     }
@@ -953,7 +952,7 @@ int lp_conn_inet()
 
     if ( connect( privfd, (struct sockaddr *)&sin,
            sizeof( struct sockaddr_in )) < 0 ) {
-       LOG(log_error, logtype_papd, "lp_connect: %m" );
+       LOG(log_error, logtype_papd, "lp_connect: %s", strerror(errno) );
        close( privfd );
        return( -1 );
     }
@@ -961,14 +960,13 @@ int lp_conn_inet()
     return( privfd );
 }
 
-int lp_rmjob( job )
-    int                job;
+int lp_rmjob( int job)
 {
     char       buf[ 1024 ];
     int                n, s;
 
     if (( s = lp_conn_inet()) < 0 ) {
-       LOG(log_error, logtype_papd, "lp_rmjob: %m" );
+       LOG(log_error, logtype_papd, "lp_rmjob: %s", strerror(errno) );
        return( -1 );
     }
 
@@ -979,7 +977,7 @@ int lp_rmjob( job )
     sprintf( buf, "\5%s %s %d\n", printer->p_printer, lp.lp_person, job );
     n = strlen( buf );
     if ( write( s, buf, n ) != n ) {
-       LOG(log_error, logtype_papd, "lp_rmjob write: %m" );
+       LOG(log_error, logtype_papd, "lp_rmjob write: %s", strerror(errno) );
        lp_disconn_inet( s );
        return( -1 );
     }
@@ -1001,23 +999,24 @@ char     *tag_files = "files: ";
 char   *tag_size = "size: ";
 char   *tag_status = "status: ";
 
-int lp_queue( out )
-    struct papfile     *out;
+int lp_queue( struct papfile *out)
 {
     char                       buf[ 1024 ], *start, *stop, *p, *q;
     int                                linelength, crlflength;
     static struct papfile      pf;
-    int                                n, len, s;
+    int                                s;
+    size_t                     len;
+    ssize_t                    n;
        
     if (( s = lp_conn_unix()) < 0 ) {
-       LOG(log_error, logtype_papd, "lp_queue: %m" );
+       LOG(log_error, logtype_papd, "lp_queue: %s", strerror(errno) );
        return( -1 );
     }
 
     sprintf( buf, "\3%s\n", printer->p_printer );
     n = strlen( buf );
     if ( write( s, buf, n ) != n ) {
-       LOG(log_error, logtype_papd, "lp_queue write: %m" );
+       LOG(log_error, logtype_papd, "lp_queue write: %s", strerror(errno) );
        lp_disconn_unix( s );
        return( -1 );
     }