ca76526b11
if it exists.
334 lines
8.7 KiB
Plaintext
334 lines
8.7 KiB
Plaintext
--- etc/papd/main.c.orig Wed Jun 24 00:41:53 1998
|
|
+++ etc/papd/main.c Wed Nov 24 12:30:19 1999
|
|
@@ -3,6 +3,7 @@
|
|
* All Rights Reserved. See COPYRIGHT.
|
|
*/
|
|
|
|
+#include <sys/ioctl.h>
|
|
#include <sys/param.h>
|
|
#include <sys/types.h>
|
|
#include <sys/time.h>
|
|
@@ -17,12 +18,14 @@
|
|
#include <sys/wait.h>
|
|
#include <sys/errno.h>
|
|
|
|
-#include <strings.h>
|
|
+#include <curses.h>
|
|
+#include <string.h>
|
|
#include <signal.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <netdb.h>
|
|
#include <fcntl.h>
|
|
+#include <term.h>
|
|
#include <termios.h>
|
|
#include <unistd.h>
|
|
|
|
@@ -37,7 +40,7 @@
|
|
|
|
#define _PATH_PAPDPPDFILE ".ppd"
|
|
|
|
-#define PIPED_STATUS "status: print spooler processing job"
|
|
+#define PIPED_STATUS "status: Netatalk print spooler processing job"
|
|
|
|
struct printer defprinter;
|
|
struct printer *printers = NULL;
|
|
@@ -50,6 +53,13 @@
|
|
struct printer *printer = NULL;
|
|
char *version = VERSION;
|
|
|
|
+int getprinters(), getstatus(), rprintcap();
|
|
+extern int getprent(), nbp_unrgstr(), nbp_rgstr();
|
|
+extern int nbp_name(), session();
|
|
+extern int pgetent(), pgetnum(), pgetflag(), pnchktc();
|
|
+extern void endprent();
|
|
+
|
|
+
|
|
#if !defined( ibm032 ) && !defined( _IBMR2 )
|
|
void
|
|
#endif ibm032 _IBMR2
|
|
@@ -102,6 +112,7 @@
|
|
|
|
char rbuf[ 255 + 1 + 8 ];
|
|
|
|
+int
|
|
main( ac, av )
|
|
int ac;
|
|
char **av;
|
|
@@ -118,30 +129,32 @@
|
|
int c, pidfd;
|
|
extern char *optarg;
|
|
extern int optind, errno;
|
|
+ size_t len;
|
|
|
|
if ( gethostname( hostname, sizeof( hostname )) < 0 ) {
|
|
perror( "gethostname" );
|
|
exit( 1 );
|
|
}
|
|
- if (( p = index( hostname, '.' )) != 0 ) {
|
|
+ if (( p = strchr( hostname, '.' )) != 0 ) {
|
|
*p = '\0';
|
|
}
|
|
- if (( defprinter.p_name = (char *)malloc( strlen( hostname ) + 1 ))
|
|
+ len = (strlen( hostname) + 1);
|
|
+ if (( defprinter.p_name = (char *)malloc( len ))
|
|
== NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( defprinter.p_name, hostname );
|
|
+ (void)strlcpy( defprinter.p_name, hostname, len );
|
|
defprinter.p_type = "LaserWriter";
|
|
defprinter.p_zone = "*";
|
|
defprinter.p_ppdfile = _PATH_PAPDPPDFILE;
|
|
#ifdef __svr4__
|
|
defprinter.p_flags = P_PIPED;
|
|
defprinter.p_printer = "/usr/bin/lp -T PS";
|
|
-#else __svr4__
|
|
+#else
|
|
defprinter.p_flags = P_SPOOLED;
|
|
defprinter.p_printer = "lp";
|
|
-#endif __svr4__
|
|
+#endif
|
|
defprinter.p_operator = "operator";
|
|
defprinter.p_spool = _PATH_PAPDSPOOLDIR;
|
|
#ifdef ABS_PRINT
|
|
@@ -248,7 +261,7 @@
|
|
/*
|
|
* Start logging.
|
|
*/
|
|
- if (( p = rindex( av[ 0 ], '/' )) == NULL ) {
|
|
+ if (( p = strrchr( av[ 0 ], '/' )) == NULL ) {
|
|
p = av[ 0 ];
|
|
} else {
|
|
p++;
|
|
@@ -280,6 +293,7 @@
|
|
pr->p_flags |= P_REGISTERED;
|
|
}
|
|
|
|
+ memset(&sv, 0, sizeof(sv));
|
|
sv.sa_handler = die;
|
|
sigemptyset( &sv.sa_mask );
|
|
sv.sa_flags = SA_RESTART;
|
|
@@ -316,7 +330,7 @@
|
|
if ( FD_ISSET( atp_fileno( pr->p_atp ), &fdset )) {
|
|
int err = 0;
|
|
|
|
- bzero( &sat, sizeof( struct sockaddr_at ));
|
|
+ memset( &sat, 0, sizeof( struct sockaddr_at ));
|
|
#ifdef BSD4_4
|
|
sat.sat_len = sizeof( struct sockaddr_at );
|
|
#endif BSD4_4
|
|
@@ -347,7 +361,7 @@
|
|
rbuf[ 1 ] = PAP_OPENREPLY;
|
|
rbuf[ 2 ] = rbuf[ 3 ] = 0;
|
|
|
|
- if (( pr->p_flags & P_SPOOLED ) && rprintcap( pr ) < 0 ) {
|
|
+ if (( pr->p_flags & P_SPOOLED ) && rprintcap( pr ) != 0 ) {
|
|
syslog( LOG_ERR, "printcap problem: %s",
|
|
pr->p_printer );
|
|
rbuf[ 2 ] = rbuf[ 3 ] = 0xff;
|
|
@@ -484,10 +498,10 @@
|
|
char path[ MAXPATHLEN ];
|
|
int fd = -1, rc;
|
|
|
|
- if (( pr->p_flags & P_SPOOLED ) && ( pr->p_spool != NULL )) {
|
|
- strcpy( path, pr->p_spool );
|
|
- strcat( path, "/status" );
|
|
- fd = open( path, O_RDONLY, 0 );
|
|
+ if ( pr->p_flags & P_SPOOLED && ( pr->p_spool != NULL )) {
|
|
+ (void)strlcpy( path, pr->p_spool, sizeof(path) );
|
|
+ (void)strlcat( path, "/status", sizeof(path) );
|
|
+ fd = open( path, O_RDONLY );
|
|
}
|
|
|
|
if (( pr->p_flags & P_PIPED ) || ( fd < 0 )) {
|
|
@@ -510,12 +524,14 @@
|
|
char *pgetstr();
|
|
char *getpname();
|
|
|
|
+int
|
|
getprinters( cf )
|
|
char *cf;
|
|
{
|
|
char buf[ 1024 ], area[ 1024 ], *a, *p, *name, *type, *zone;
|
|
struct printer *pr;
|
|
int c;
|
|
+ size_t len;
|
|
|
|
while (( c = getprent( cf, buf )) > 0 ) {
|
|
a = area;
|
|
@@ -532,7 +548,7 @@
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- bzero( pr, sizeof( struct printer ));
|
|
+ memset( pr, 0, sizeof( struct printer ));
|
|
|
|
name = defprinter.p_name;
|
|
type = defprinter.p_type;
|
|
@@ -542,29 +558,32 @@
|
|
exit( 1 );
|
|
}
|
|
if ( name != defprinter.p_name ) {
|
|
- if (( pr->p_name = (char *)malloc( strlen( name ) + 1 )) == NULL ) {
|
|
+ len = (strlen( name ) + 1);
|
|
+ if (( pr->p_name = (char *)malloc( len )) == NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_name, name );
|
|
+ (void)strlcpy( pr->p_name, name, len );
|
|
} else {
|
|
pr->p_name = name;
|
|
}
|
|
if ( type != defprinter.p_type ) {
|
|
- if (( pr->p_type = (char *)malloc( strlen( type ) + 1 )) == NULL ) {
|
|
+ len = (strlen( type ) + 1 );
|
|
+ if (( pr->p_type = (char *)malloc( len )) == NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_type, type );
|
|
+ (void)strlcpy( pr->p_type, type, len);
|
|
} else {
|
|
pr->p_type = type;
|
|
}
|
|
if ( zone != defprinter.p_zone ) {
|
|
- if (( pr->p_zone = (char *)malloc( strlen( zone ) + 1 )) == NULL ) {
|
|
+ len = (strlen( zone ) + 1 );
|
|
+ if (( pr->p_zone = (char *)malloc( len )) == NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_zone, zone );
|
|
+ (void)strlcpy( pr->p_zone, zone, len );
|
|
} else {
|
|
pr->p_zone = zone;
|
|
}
|
|
@@ -580,11 +599,12 @@
|
|
if (( p = pgetstr( "pd", &a )) == NULL ) {
|
|
pr->p_ppdfile = defprinter.p_ppdfile;
|
|
} else {
|
|
- if (( pr->p_ppdfile = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
|
|
+ len = (strlen( p ) + 1);
|
|
+ if (( pr->p_ppdfile = (char *)malloc( len )) == NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_ppdfile, p );
|
|
+ (void)strlcpy( pr->p_ppdfile, p, len);
|
|
}
|
|
|
|
/*
|
|
@@ -600,11 +620,12 @@
|
|
} else {
|
|
pr->p_flags = P_SPOOLED;
|
|
}
|
|
- if (( pr->p_printer = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
|
|
+ len = (strlen( p ) + 1);
|
|
+ if (( pr->p_printer = (char *)malloc( len )) == NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_printer, p );
|
|
+ (void)strlcpy( pr->p_printer, p, len );
|
|
}
|
|
|
|
if ( pr->p_flags & P_SPOOLED ) {
|
|
@@ -614,12 +635,13 @@
|
|
if (( p = pgetstr( "op", &a )) == NULL ) {
|
|
pr->p_operator = defprinter.p_operator;
|
|
} else {
|
|
- if (( pr->p_operator = (char *)malloc( strlen( p ) + 1 ))
|
|
+ len = (strlen( p ) + 1);
|
|
+ if (( pr->p_operator = (char *)malloc( len ))
|
|
== NULL ) {
|
|
perror( "malloc" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_operator, p );
|
|
+ (void)strlcpy( pr->p_operator, p, len );
|
|
}
|
|
}
|
|
|
|
@@ -631,13 +653,16 @@
|
|
} else { /* No capability file, do default */
|
|
printers = &defprinter;
|
|
}
|
|
+ return(0);
|
|
}
|
|
|
|
+int
|
|
rprintcap( pr )
|
|
struct printer *pr;
|
|
{
|
|
char buf[ 1024 ], area[ 1024 ], *a, *p;
|
|
int c;
|
|
+ size_t len;
|
|
|
|
/*
|
|
* Spool directory from printcap file.
|
|
@@ -658,11 +683,12 @@
|
|
if (( p = pgetstr( "sd", &a )) == NULL ) {
|
|
pr->p_spool = defprinter.p_spool;
|
|
} else {
|
|
- if (( pr->p_spool = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
|
|
+ len = (strlen( p ) + 1);
|
|
+ if (( pr->p_spool = (char *)malloc( len )) == NULL ) {
|
|
syslog( LOG_ERR, "malloc: %m" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_spool, p );
|
|
+ (void)strlcpy( pr->p_spool, p, len );
|
|
}
|
|
|
|
/*
|
|
@@ -681,12 +707,13 @@
|
|
if (( p = pgetstr( "ro", &a )) == NULL ) {
|
|
pr->p_role = defprinter.p_role;
|
|
} else {
|
|
+ len = (strlen( p ) + 1);
|
|
if (( pr->p_role =
|
|
- (char *)malloc( strlen( p ) + 1 )) == NULL ) {
|
|
+ (char *)malloc( len )) == NULL ) {
|
|
syslog( LOG_ERR, "malloc: %m" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_role, p );
|
|
+ (void)strlcpy( pr->p_role, p, len );
|
|
}
|
|
|
|
if (( c = pgetnum( "si" )) < 0 ) {
|
|
@@ -707,12 +734,13 @@
|
|
}
|
|
a = area;
|
|
if (( p = pgetstr( "pc", &a )) != NULL ) {
|
|
+ len = (strlen( p ) + 1);
|
|
if (( pr->p_pagecost_msg =
|
|
- (char *)malloc( strlen( p ) + 1 )) == NULL ) {
|
|
+ (char *)malloc( len )) == NULL ) {
|
|
syslog( LOG_ERR, "malloc: %m" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_pagecost_msg, p );
|
|
+ (void)strlcpy( pr->p_pagecost_msg, p, len );
|
|
pr->p_pagecost = 0;
|
|
} else if ( pr->p_flags & P_ACCOUNT ) {
|
|
if (( c = pgetnum( "pc" )) < 0 ) {
|
|
@@ -733,11 +761,12 @@
|
|
if (( p = pgetstr( "lo", &a )) == NULL ) {
|
|
pr->p_lock = defprinter.p_lock;
|
|
} else {
|
|
- if (( pr->p_lock = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
|
|
+ len = (strlen( p ) + 1);
|
|
+ if (( pr->p_lock = (char *)malloc( len )) == NULL ) {
|
|
syslog( LOG_ERR, "malloc: %m" );
|
|
exit( 1 );
|
|
}
|
|
- strcpy( pr->p_lock, p );
|
|
+ (void)strlcpy( pr->p_lock, p, len );
|
|
}
|
|
|
|
#ifdef KRB
|