X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=etc%2Fpapd%2Flp.c;h=fca724e72ca34af5d5d96f965e2af590f8e11582;hb=2b412b8be1f0bb0e84b4201cde39a8b677ddce0c;hp=3de4b4c548df1bd2f88da6d91d7915452d80c54e;hpb=6e6126bcbee01b6eece0429e41180ff6bfe87301;p=netatalk.git diff --git a/etc/papd/lp.c b/etc/papd/lp.c index 3de4b4c5..fca724e7 100644 --- a/etc/papd/lp.c +++ b/etc/papd/lp.c @@ -1,5 +1,5 @@ /* - * $Id: lp.c,v 1.14.8.4.2.1 2008-08-14 20:04:16 didg Exp $ + * $Id: lp.c,v 1.14.8.4.2.5 2009-01-19 02:25:57 didg Exp $ * * Copyright (c) 1990,1994 Regents of The University of Michigan. * All Rights Reserved. See COPYRIGHT. @@ -54,11 +54,7 @@ #include #endif /* HAVE_UNISTD_H */ -#if defined( sun ) && defined( __svr4__ ) -#include -#else /* sun && __svr4__ */ #include -#endif /* sun && __svr4__ */ #include #include #undef s_net @@ -212,10 +208,37 @@ static void lp_setup_comments (charset_t dest) #define is_var(a, b) (strncmp((a), (b), 2) == 0) +static size_t quote(char *dest, char *src, const size_t bsize, size_t len) +{ +size_t used = 0; + + while (len && used < bsize ) { + switch (*src) { + case '$': + case '\\': + case '"': + case '`': + if (used + 2 > bsize ) + return used; + *dest = '\\'; + dest++; + used++; + break; + } + *dest = *src; + src++; + dest++; + len--; + used++; + } + return used; +} + + static char* pipexlate(char *src) { char *p, *q, *dest; - static char destbuf[MAXPATHLEN]; + static char destbuf[MAXPATHLEN +1]; size_t destlen = MAXPATHLEN; int len = 0; @@ -224,13 +247,15 @@ static char* pipexlate(char *src) if (!src) return NULL; - strncpy(dest, src, MAXPATHLEN); - if ((p = strchr(src, '%')) == NULL) /* nothing to do */ + memset(dest, 0, MAXPATHLEN +1); + if ((p = strchr(src, '%')) == NULL) { /* nothing to do */ + strncpy(dest, src, MAXPATHLEN); return destbuf; - - /* first part of the path. just forward to the next variable. */ + } + /* first part of the path. copy and forward to the next variable. */ len = MIN((size_t)(p - src), destlen); if (len > 0) { + strncpy(dest, src, len); destlen -= len; dest += len; } @@ -246,17 +271,20 @@ static char* pipexlate(char *src) q = lp.lp_created_for; } else if (is_var(p, "%%")) { q = "%"; - } else - q = p; + } /* copy the stuff over. if we don't understand something that we * should, just skip it over. */ if (q) { - len = MIN(p == q ? 2 : strlen(q), destlen); + len = MIN(strlen(q), destlen); + len = quote(dest, q, destlen, len); + } + else { + len = MIN(2, destlen); strncpy(dest, q, len); - dest += len; - destlen -= len; } + dest += len; + destlen -= len; /* stuff up to next % */ src = p + 2; @@ -279,7 +307,7 @@ void lp_person( person ) 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 ); @@ -310,7 +338,7 @@ void lp_host( host ) 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 ); @@ -399,10 +427,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)); } } @@ -430,7 +458,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 ); } @@ -448,7 +476,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 ); } @@ -474,7 +502,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 ); } @@ -543,7 +571,7 @@ int lp_open( out, sat ) 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_info, logtype_papd, "setreuid error: %s", strerror(errno)); } } else { LOG(log_info, logtype_papd, "Error getting username (%s)", lp.lp_person); @@ -552,7 +580,7 @@ int lp_open( out, sat ) 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 ); + LOG(log_error, logtype_papd, "lp_open popen %s: %s", printer->p_printer, strerror(errno) ); spoolerror( out, NULL ); return( -1 ); } @@ -561,13 +589,13 @@ int lp_open( out, sat ) 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); @@ -587,13 +615,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 ); } @@ -692,14 +720,14 @@ 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 ); @@ -721,7 +749,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) ); } } @@ -755,11 +783,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? */ @@ -800,32 +828,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 @@ -853,7 +881,7 @@ int lp_print() } #ifndef HAVE_CUPS -int lp_disconn_unix( fd ) +int lp_disconn_unix( int fd ) { return( close( fd )); } @@ -864,7 +892,7 @@ int lp_conn_unix() 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 )); @@ -872,7 +900,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 ); } @@ -898,7 +926,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 ); } @@ -908,7 +936,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 ); } @@ -921,7 +949,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 ); } @@ -936,7 +964,7 @@ int lp_rmjob( job ) 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 ); } @@ -947,7 +975,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 ); } @@ -978,14 +1006,14 @@ int lp_queue( out ) int n, len, s; 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 ); }