]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/main.c
Remove all Appletalk stuff
[netatalk.git] / etc / papd / main.c
diff --git a/etc/papd/main.c b/etc/papd/main.c
deleted file mode 100644 (file)
index d0c4645..0000000
+++ /dev/null
@@ -1,950 +0,0 @@
-/*
- * $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.
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif /* HAVE_CONFIG_H */
-
-#include <string.h>
-
-#include <sys/param.h>
-#include <sys/time.h>
-#include <sys/uio.h>
-#include <sys/file.h>
-#include <sys/socket.h>
-#include <atalk/logger.h>
-
-/* POSIX.1 sys/wait.h check */
-#include <sys/types.h>
-#ifdef HAVE_SYS_WAIT_H
-#include <sys/wait.h>
-#endif /* HAVE_SYS_WAIT_H */
-#ifndef WEXITSTATUS
-#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
-#endif /* ! WEXITSTATUS */
-#ifndef WIFEXITED
-#define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
-#endif /* ! WIFEXITED */
-
-#include <errno.h>
-
-/* STDC check */
-#if STDC_HEADERS
-#include <string.h>
-#else /* STDC_HEADERS */
-#ifndef HAVE_STRCHR
-#define strchr index
-#define strrchr index
-#endif /* HAVE_STRCHR */
-char *strchr (), *strrchr ();
-#ifndef HAVE_MEMCPY
-#define memcpy(d,s,n) bcopy ((s), (d), (n))
-#define memmove(d,s,n) bcopy ((s), (d), (n))
-#endif /* ! HAVE_MEMCPY */
-#endif /* STDC_HEADERS */
-
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netdb.h>
-#include <fcntl.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif /* HAVE_UNISTD_H */
-
-#include <netatalk/endian.h>
-#include <netatalk/at.h>
-#include <atalk/compat.h>
-#include <atalk/atp.h>
-#include <atalk/pap.h>
-#include <atalk/paths.h>
-#include <atalk/util.h>
-#include <atalk/nbp.h>
-#include <atalk/unicode.h>
-
-#include "printer.h"
-#include "printcap.h"
-#include "session.h"
-#include "uam_auth.h"
-#include "print_cups.h"
-
-
-#define PIPED_STATUS   "status: print spooler processing job"
-
-struct printer defprinter;
-struct printer *printers = NULL;
-
-int            debug = 0;
-static char    *conffile = _PATH_PAPDCONF;
-char           *printcap = _PATH_PAPDPRINTCAP;
-unsigned char  connid, quantum, sock, oquantum = PAP_MAXQUANTUM;
-char           *cannedstatus = PIPED_STATUS;
-struct printer *printer = NULL;
-char           *version = VERSION;
-static char    *pidfile = _PATH_PAPDLOCK;
-
-char           *uamlist;
-char           *uampath = _PATH_PAPDUAMPATH;
-
-/* Prototypes for locally used functions */
-int getstatus( struct printer *pr, char *buf );
-int rprintcap( struct printer *pr );
-static void getprinters( char *cf );
-
-
-/* this only needs to be used by the server process */
-static void papd_exit(const int i)
-{
-  server_unlock(pidfile);
-  auth_unload();
-  exit(i);
-}
-
-static void
-die(int n)
-{
-    struct printer     *pr;
-    struct at_addr     addr;
-
-    memset(&addr, 0, sizeof(addr));
-
-    for ( pr = printers; pr; pr = pr->p_next ) {
-       if ( pr->p_flags & P_REGISTERED ) {
-           if ( nbp_unrgstr( pr->p_name, pr->p_type, pr->p_zone, &addr ) < 0 ) {
-               LOG(log_error, logtype_papd, "can't unregister %s:%s@%s", pr->p_name,
-                       pr->p_type, pr->p_zone );
-               papd_exit( n + 1 );
-           }
-           LOG(log_info, logtype_papd, "unregister %s:%s@%s", pr->p_name, pr->p_type,
-                   pr->p_zone );
-       }
-#ifdef HAVE_CUPS
-       if ( pr->p_flags & P_SPOOLED && pr->p_flags & P_CUPS_PPD ) {
-               LOG(log_info, logtype_papd, "Deleting CUPS temp PPD file for %s (%s)", pr->p_name, pr->p_ppdfile);
-               unlink (pr->p_ppdfile);
-       }
-#endif /* HAVE_CUPS */
-
-    }
-    papd_exit( n );
-}
-
-static void
-reap(int sig _U_)
-{
-    int                status;
-    int                pid;
-
-    while (( pid = wait3( &status, WNOHANG, NULL )) > 0 ) {
-       if ( WIFEXITED( status )) {
-           if ( WEXITSTATUS( status )) {
-               LOG(log_error, logtype_papd, "child %d exited with %d", pid,
-                       WEXITSTATUS( status ));
-           } else {
-               LOG(log_info, logtype_papd, "child %d done", pid );
-           }
-       } else {
-           if ( WIFSIGNALED( status )) {
-               LOG(log_error, logtype_papd, "child %d killed with %d", pid,
-                       WTERMSIG( status ));
-           } else {
-               LOG(log_error, logtype_papd, "child %d died", pid );
-           }
-       }
-    }
-    return;
-}
-
-static char rbuf[ 255 + 1 + 8 ];
-
-int main(int ac, char **av)
-{
-    extern char         *optarg;
-
-    ATP                        atp;
-    struct atp_block   atpb;
-    struct sockaddr_at sat;
-    struct sigaction   sv;
-    struct iovec       iov;
-    fd_set             fdset;
-    struct printer     *pr;
-    char               *p, hostname[ MAXHOSTNAMELEN ];
-    char               cbuf[ 8 ];
-    int                        c;
-    char               *atname;
-
-    if ( gethostname( hostname, sizeof( hostname )) < 0 ) {
-       perror( "gethostname" );
-       exit( 1 );
-    }
-    if (( p = strchr( hostname, '.' )) != NULL ) {
-       *p = '\0';
-    }
-    if (( defprinter.p_name = (char *)malloc( strlen( hostname ) + 1 ))
-           == NULL ) {
-       perror( "malloc" );
-       exit( 1 );
-    }
-    strcpy( defprinter.p_name, hostname );
-    defprinter.p_type = "LaserWriter";
-    defprinter.p_zone = "*";
-    memset(&defprinter.p_addr, 0, sizeof(defprinter.p_addr));
-#ifdef __svr4__
-    defprinter.p_flags = P_PIPED;
-    defprinter.p_printer = "/usr/bin/lp -T PS";
-#else /* __svr4__ */
-    defprinter.p_flags = P_SPOOLED;
-    defprinter.p_printer = "lp";
-#endif /* __svr4__ */
-    defprinter.p_operator = "operator";
-    defprinter.p_spool = _PATH_PAPDSPOOLDIR;
-#ifdef ABS_PRINT
-    defprinter.p_role = NULL;
-    defprinter.p_srvid = 0;
-#endif /* ABS_PRINT */
-    defprinter.p_pagecost = 200;               /* default cost */
-    defprinter.p_pagecost_msg = NULL;
-    defprinter.p_lock = "lock";
-
-    while (( c = getopt( ac, av, "adf:p:P:v" )) != EOF ) {
-       switch ( c ) {
-       case 'a' :              /* for compatibility with old papd */
-           break;
-
-       case 'd' :              /* debug */
-           debug++;
-           break;
-
-       case 'f' :              /* conffile */
-           conffile = optarg;
-           break;
-
-       case 'p' :              /* printcap */
-           printcap = optarg;
-           break;
-
-       case 'P' :
-           pidfile = optarg;
-           break;
-
-       case 'v' :              /* version */
-           printf( "papd (version %s)\n", VERSION );
-           exit ( 1 );
-           break;
-
-       default :
-           fprintf( stderr,
-                   "Usage:\t%s [ -d ] [ -f conffile ] [ -p printcap ]\n",
-                   *av );
-           exit( 1 );
-       }
-    }
-
-
-    switch (server_lock("papd", pidfile, debug)) {
-    case 0: /* open a couple things again in the child */
-      if (!debug && (c = open("/", O_RDONLY)) >= 0) {
-       dup2(c, 1);
-       dup2(c, 2);
-      }
-      break;
-    case -1:
-      exit(1);
-    default:
-      exit(0);
-    }      
-
-#ifdef DEBUG1
-    fault_setup(NULL);
-#endif
-
-    /*
-     * Start logging.
-     */
-    if (( p = strrchr( av[ 0 ], '/' )) == NULL ) {
-       p = av[ 0 ];
-    } else {
-       p++;
-    }
-#ifdef ultrix
-    openlog( p, LOG_PID );
-#else /* ultrix */
-    set_processname(p);
-    syslog_setup(log_debug, logtype_default, logoption_ndelay | logoption_pid |
-               debug ? logoption_perror : 0, logfacility_lpr );
-#endif /* ultrix */
-
-    LOG(log_info, logtype_papd, "restart (%s)", version );
-#ifdef HAVE_CUPS
-    LOG(log_info, logtype_papd, "CUPS support enabled (%s)", CUPS_API_VERSION );
-#endif
-
-    getprinters( conffile );
-
-    for ( pr = printers; pr; pr = pr->p_next ) {
-       if (( pr->p_flags & P_SPOOLED ) && rprintcap( pr ) < 0 ) {
-           LOG(log_error, logtype_papd, "printcap problem: %s", pr->p_printer );
-       }
-
-       if (!(pr->p_flags & P_CUPS)) {
-               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: %s", strerror(errno) );
-           papd_exit( 1 );
-       }
-       if ( nbp_rgstr( atp_sockaddr( pr->p_atp ), pr->p_name, pr->p_type,
-               pr->p_zone ) < 0 ) {
-           LOG(log_error, logtype_papd, "can't register %s:%s@%s", pr->p_u_name, pr->p_type,
-                   pr->p_zone );
-           die( 1 );
-       }
-       if ( pr->p_flags & P_AUTH ) {
-               LOG(log_info, logtype_papd, "Authentication enabled: %s", pr->p_u_name );
-       }
-       else {
-               LOG(log_info, logtype_papd, "Authentication disabled: %s", pr->p_u_name );
-       }
-       LOG(log_info, logtype_papd, "register %s:%s@%s", pr->p_u_name, pr->p_type,
-               pr->p_zone );
-       pr->p_flags |= P_REGISTERED;
-    }
-
-    memset(&sv, 0, sizeof(sv));
-    sv.sa_handler = die;
-    sigemptyset( &sv.sa_mask );
-    sv.sa_flags = SA_RESTART;
-    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, NULL ) < 0 ) {
-       LOG(log_error, logtype_papd, "sigaction: %s", strerror(errno) );
-       papd_exit( 1 );
-    }
-
-    /*
-     * Load UAMS
-     */
-    auth_load(uampath, uamlist);
-
-    /*
-     * Begin accepting connections.
-     */
-    FD_ZERO( &fdset );
-    for (;;) {
-       for ( pr = printers; pr; pr = pr->p_next ) {
-           FD_SET( atp_fileno( pr->p_atp ), &fdset );
-       }
-       if (( c = select( FD_SETSIZE, &fdset, NULL, NULL, NULL )) < 0 ) {
-           if ( errno == EINTR ) {
-               continue;
-           }
-           LOG(log_error, logtype_papd, "select: %s", strerror(errno) );
-           papd_exit( 1 );
-       }
-
-       for ( pr = printers; pr; pr = pr->p_next ) {
-           if ( FD_ISSET( atp_fileno( pr->p_atp ), &fdset )) {
-               int             err = 0;
-
-               memset( &sat, 0, sizeof( struct sockaddr_at ));
-#ifdef BSD4_4
-               sat.sat_len = sizeof( struct sockaddr_at );
-#endif /* BSD4_4 */
-               sat.sat_family = AF_APPLETALK;
-               sat.sat_addr.s_net = ATADDR_ANYNET;
-               sat.sat_addr.s_node = ATADDR_ANYNODE;
-               sat.sat_port = ATADDR_ANYPORT;
-               /* do an atp_rsel(), to prevent hangs */
-               if (( c = atp_rsel( pr->p_atp, &sat, ATP_TREQ )) != ATP_TREQ ) {
-                   continue;
-               }
-               atpb.atp_saddr = &sat;
-               atpb.atp_rreqdata = cbuf;
-               atpb.atp_rreqdlen = sizeof( cbuf );
-               if ( atp_rreq( pr->p_atp, &atpb ) < 0 ) {
-                   LOG(log_error, logtype_papd, "atp_rreq: %s", strerror(errno) );
-                   continue;
-               }
-
-               /* should check length of req buf */
-
-               switch( cbuf[ 1 ] ) {
-               case PAP_OPEN :
-                   connid = (unsigned char)cbuf[ 0 ];
-                   sock = (unsigned char)cbuf[ 4 ];
-                   quantum = (unsigned char)cbuf[ 5 ];
-                   rbuf[ 0 ] = cbuf[ 0 ];
-                   rbuf[ 1 ] = PAP_OPENREPLY;
-                   rbuf[ 2 ] = rbuf[ 3 ] = 0;
-
-                   if (( pr->p_flags & P_SPOOLED ) && rprintcap( pr ) != 0 ) {
-                       LOG(log_error, logtype_papd, "printcap problem: %s",
-                               pr->p_printer );
-                       rbuf[ 2 ] = rbuf[ 3 ] = 0xff;
-                       err = 1;
-                   }
-
-#ifdef HAVE_CUPS
-                  /*
-                   * If cups is not accepting jobs, we return
-                   * 0xffff to indicate we're busy
-                   */
-#ifdef DEBUG
-                    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",
-                                pr->p_printer );
-                        rbuf[ 2 ] = rbuf[ 3 ] = 0xff;
-                        err = 1;
-                    }
-#endif /* HAVE_CUPS */
-
-                   /*
-                    * If this fails, we've run out of sockets. Rather than
-                    * just die(), let's try to continue. Maybe some sockets
-                    * will close, and we can continue;
-                    */
-                   if (( atp = atp_open( ATADDR_ANYPORT, 
-                                         &pr->p_addr)) == NULL ) {
-                       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;
-                   }
-                   else {
-                      rbuf[ 4 ] = atp_sockaddr( atp )->sat_port;
-                    }
-                   rbuf[ 5 ] = oquantum;
-                   rbuf[ 6 ] = rbuf[ 7 ] = 0;
-
-                   iov.iov_base = rbuf;
-                   iov.iov_len = 8 + getstatus( pr, &rbuf[ 8 ] );
-                   atpb.atp_sresiov = &iov;
-                   atpb.atp_sresiovcnt = 1;
-                   /*
-                    * 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: %s", strerror(errno) );
-                       err = 1;
-                   }
-
-                   if ( err ) {
-                       if (atp) {
-                          atp_close(atp);
-                        }
-                       continue;
-                   }
-
-                   switch ( c = fork()) {
-                   case -1 :
-                       LOG(log_error, logtype_papd, "fork: %s", strerror(errno) );
-                        atp_close(atp);
-                       continue;
-
-                   case 0 : /* child */
-                       printer = pr;
-
-                       #ifndef HAVE_CUPS
-                       if (( printer->p_flags & P_SPOOLED ) &&
-                               chdir( printer->p_spool ) < 0 ) {
-                           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: %s", SPOOLDIR, strerror(errno) );
-                           exit( 1 );
-                       }
-
-                       #endif
-
-                       sv.sa_handler = SIG_DFL;
-                       sigemptyset( &sv.sa_mask );
-                       sv.sa_flags = SA_RESTART;
-                       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 );
-                       }
-                       sat.sat_port = sock;
-                       if ( session( atp, &sat ) < 0 ) {
-                           LOG(log_error, logtype_papd, "bad session" );
-                           exit( 1 );
-                       }
-                       exit( 0 );
-                       break;
-
-                   default : /* parent */
-                       LOG(log_info, logtype_papd, "child %d for \"%s\" from %u.%u",
-                               c, pr->p_name, ntohs( sat.sat_addr.s_net ),
-                               sat.sat_addr.s_node);
-                       atp_close( atp );
-                   }
-                   break;
-
-               case PAP_SENDSTATUS :
-                   rbuf[ 0 ] = 0;
-                   rbuf[ 1 ] = PAP_STATUS;
-                   rbuf[ 2 ] = rbuf[ 3 ] = 0;
-                   rbuf[ 4 ] = rbuf[ 5 ] = 0;
-                   rbuf[ 6 ] = rbuf[ 7 ] = 0;
-
-                   iov.iov_base = rbuf;
-                   iov.iov_len = 8 + getstatus( pr, &rbuf[ 8 ] );
-                   atpb.atp_sresiov = &iov;
-                   atpb.atp_sresiovcnt = 1;
-                   /*
-                    * 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: %s", strerror(errno) );
-                   }
-                   break;
-
-               default :
-                   LOG(log_error, logtype_papd, "Bad request from %u.%u!",
-                           ntohs( sat.sat_addr.s_net ), sat.sat_addr.s_node );
-                   continue;
-                   break;
-               }
-
-#ifdef notdef
-               /*
-                * Sometimes the child process will send its first READ
-                * before the parent has sent the OPEN REPLY.  Moving this
-                * code into the OPEN/STATUS switch fixes this problem.
-                */
-               iov.iov_base = rbuf;
-               iov.iov_len = 8 + getstatus( pr, &rbuf[ 8 ] );
-               atpb.atp_sresiov = &iov;
-               atpb.atp_sresiovcnt = 1;
-               /*
-                * 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: %s", strerror(errno) );
-               }
-#endif /* notdef */
-           }
-       }
-    }
-    return 0;
-}
-
-/*
- * We assume buf is big enough for 255 bytes of data and a length byte.
- */
-
-int getstatus(struct printer *pr, char *buf)
-{
-
-#ifdef HAVE_CUPS
-    if ( pr->p_flags & P_PIPED ) {
-       *buf = strlen( cannedstatus );
-       strncpy( &buf[ 1 ], cannedstatus, *buf );
-       return( *buf + 1 );
-    } else {
-       cups_get_printer_status( pr );
-       *buf = strlen ( pr->p_status );
-       strncpy ( &buf[1], pr->p_status, *buf);
-       return ( *buf + 1);
-    }
-#else
-
-    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);
-    }
-
-    if (( pr->p_flags & P_PIPED ) || ( fd < 0 )) {
-       *buf = strlen( cannedstatus );
-       strncpy( &buf[ 1 ], cannedstatus, *buf );
-       return( *buf + 1 );
-    } else {
-       if (( rc = read( fd, &buf[ 1 ], 255 )) < 0 ) {
-           rc = 0;
-       }
-       close( fd );
-       if ( rc && buf[ rc ] == '\n' ) {        /* remove trailing newline */
-           rc--;
-       }
-       *buf = rc;
-       return( rc + 1 );
-    }
-#endif /* HAVE_CUPS */
-}
-
-char   *pgetstr(char *id, char **area);
-char   *getpname(char **area, int bufsize);
-
-#define PF_CONFBUFFER  1024
-
-static void getprinters( char *cf)
-{
-    char               buf[ PF_CONFBUFFER ], area[ PF_CONFBUFFER ], *a, *p, *name, *type, *zone;
-    struct printer     *pr;
-    int                        c;
-
-    while (( c = getprent( cf, buf, PF_CONFBUFFER )) > 0 ) {
-       a = area;
-       /*
-        * Get the printer's nbp name.
-        */
-       if (( p = getpname( &a, PF_CONFBUFFER )) == NULL ) {
-           fprintf( stderr, "No printer name\n" );
-           exit( 1 );
-       }
-
-       if (( pr = (struct printer *)malloc( sizeof( struct printer )))
-               == NULL ) {
-           perror( "malloc" );
-           exit( 1 );
-       }
-       memset( pr, 0, sizeof( struct printer ));
-
-       name = defprinter.p_name;
-       type = defprinter.p_type;
-       zone = defprinter.p_zone;
-       if ( nbp_name( p, &name, &type, &zone )) {
-           fprintf( stderr, "Can't parse \"%s\"\n", name );
-           exit( 1 );
-       }
-       if ( name != defprinter.p_name ) {
-           if (( pr->p_name = (char *)malloc( strlen( name ) + 1 )) == NULL ) {
-               perror( "malloc" );
-               exit( 1 );
-           }
-           strcpy( pr->p_name, name );
-       } else {
-           pr->p_name = name;
-       }
-       if ( type != defprinter.p_type ) {
-           if (( pr->p_type = (char *)malloc( strlen( type ) + 1 )) == NULL ) {
-               perror( "malloc" );
-               exit( 1 );
-           }
-           strcpy( pr->p_type, type );
-       } else {
-           pr->p_type = type;
-       }
-       if ( zone != defprinter.p_zone ) {
-           if (( pr->p_zone = (char *)malloc( strlen( zone ) + 1 )) == NULL ) {
-               perror( "malloc" );
-               exit( 1 );
-           }
-           strcpy( pr->p_zone, zone );
-       } else {
-           pr->p_zone = zone;
-       }
-
-       if ( pnchktc( cf ) != 1 ) {
-           fprintf( stderr, "Bad papcap entry\n" );
-           exit( 1 );
-       }
-
-       /*
-        * Get PPD file.
-        */
-       if (( p = pgetstr( "pd", &a ) )) {
-           if (( pr->p_ppdfile = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               perror( "malloc" );
-               exit( 1 );
-           }
-           strcpy( pr->p_ppdfile, p );
-       }
-
-       /*
-        * Get lpd printer name.
-        */
-       if (( p = pgetstr( "pr", &a )) == NULL ) {
-           pr->p_printer = defprinter.p_printer;
-           pr->p_flags = defprinter.p_flags;
-       } else {
-           if ( *p == '|' ) {
-               p++;
-               pr->p_flags = P_PIPED;
-           } else {
-               pr->p_flags = P_SPOOLED;
-           }
-           if (( pr->p_printer = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               perror( "malloc" );
-               exit( 1 );
-           }
-           strcpy( pr->p_printer, p );
-       }
-
-       /*
-        * Do we want authenticated printing?
-        */
-       if ((p = pgetstr( "ca", &a )) != NULL ) {
-           if ((pr->p_authprintdir = (char *)malloc(strlen(p)+1)) == NULL) {
-               perror( "malloc" );
-               exit(1);
-           }
-           strcpy( pr->p_authprintdir, p );
-           pr->p_flags |= P_AUTH;
-           pr->p_flags |= P_AUTH_CAP;
-       } else { pr->p_authprintdir = NULL; }
-
-       if ( pgetflag( "sp" ) == 1 ) {
-           pr->p_flags |= P_AUTH;
-           pr->p_flags |= P_AUTH_PSSP;
-       }
-
-       if ((p = pgetstr("am", &a)) != NULL ) {
-               if ((uamlist = (char *)malloc(strlen(p)+1)) == NULL ) {
-                       perror("malloc");
-                       exit(1);
-               }
-               strcpy(uamlist, p);
-       }
-
-       if ( pr->p_flags & P_SPOOLED ) {
-           /*
-            * Get operator name.
-            */
-           if (( p = pgetstr( "op", &a )) == NULL ) {
-               pr->p_operator = defprinter.p_operator;
-           } else {
-               if (( pr->p_operator = (char *)malloc( strlen( p ) + 1 ))
-                       == NULL ) {
-                   perror( "malloc" );
-                   exit( 1 );
-               }
-               strcpy( pr->p_operator, p );
-           }
-       }
-
-       /* get printer's appletalk address. */
-       if (( p = pgetstr( "pa", &a )) == NULL ) 
-           memcpy(&pr->p_addr, &defprinter.p_addr, sizeof(pr->p_addr));
-       else 
-           atalk_aton(p, &pr->p_addr);
-
-#ifdef HAVE_CUPS
-       if ((p = pgetstr("co", &a)) != NULL ) {
-            pr->p_cupsoptions = strdup(p);
-            LOG (log_error, logtype_papd, "enabling cups-options for %s: %s", pr->p_name, pr->p_cupsoptions);
-       }
-#endif
-
-       /* convert line endings for setup sections.
-           real ugly work around for foomatic deficiencies,
-          need to get rid of this */
-       if ( pgetflag("fo") == 1 ) {
-            pr->p_flags |= P_FOOMATIC_HACK;
-            LOG (log_error, logtype_papd, "enabling foomatic hack for %s", pr->p_name);
-       }
-
-       if (strncasecmp (pr->p_name, "cupsautoadd", 11) == 0)
-       {
-#ifdef HAVE_CUPS
-               pr = cups_autoadd_printers (pr, printers);
-               printers = pr;
-#else
-               LOG (log_error, logtype_papd, "cupsautoadd: Cups support not compiled in");
-#endif /* HAVE_CUPS */
-       }
-       else {
-#ifdef HAVE_CUPS
-               if ( cups_check_printer ( pr, printers, 1) == 0)
-               {
-                       pr->p_next = printers;
-                       printers = pr;
-               }
-#else
-               pr->p_next = printers;
-               printers = pr;
-#endif /* HAVE_CUPS */
-       }
-    }
-    if ( c == 0 ) {
-       endprent();
-    } else {                   /* No capability file, do default */
-       printers = &defprinter;
-    }
-}
-
-int rprintcap( struct printer *pr)
-{
-
-#ifdef HAVE_CUPS
-
-    char               *p;
-
-    if ( pr->p_flags & P_SPOOLED && !(pr->p_flags & P_CUPS_AUTOADDED) ) { /* Skip check if autoadded */
-       if ( cups_printername_ok ( pr->p_printer ) != 1) {
-           LOG(log_error, logtype_papd, "No such CUPS printer: '%s'", pr->p_printer );
-           return( -1 );
-       }
-    }
-
-    /*
-     * Check for ppd file, moved here because of cups_autoadd we cannot check at the usual location
-     */
-
-    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: %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 );
-       }
-    }
-
-
-#else
-
-    char               buf[ 1024 ], area[ 1024 ], *a, *p;
-    int                        c;
-
-    /*
-     * Spool directory from printcap file.
-     */
-    if ( pr->p_flags & P_SPOOLED ) {
-       if ( pgetent( printcap, buf, pr->p_printer ) != 1 ) {
-           LOG(log_error, logtype_papd, "No such printer: %s", pr->p_printer );
-           return( -1 );
-       }
-
-       /*
-        * Spool directory.
-        */
-       if ( pr->p_spool != NULL && pr->p_spool != defprinter.p_spool ) {
-           free( pr->p_spool );
-       }
-       a = area;
-       if (( p = pgetstr( "sd", &a )) == NULL ) {
-           pr->p_spool = defprinter.p_spool;
-       } else {
-           if (( pr->p_spool = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
-               exit( 1 );
-           }
-           strcpy( pr->p_spool, p );
-       }
-
-       /*
-        * Is accounting on?
-        */
-       a = area;
-       if ( pgetstr( "af", &a ) == NULL ) {
-           pr->p_flags &= ~P_ACCOUNT;
-       } else {
-           pr->p_flags |= P_ACCOUNT;
-#ifdef ABS_PRINT
-           if ( pr->p_role != NULL && pr->p_role != defprinter.p_role ) {
-               free( pr->p_role );
-           }
-           a = area;
-           if (( p = pgetstr( "ro", &a )) == NULL ) {
-               pr->p_role = defprinter.p_role;
-           } else {
-               if (( pr->p_role =
-                       (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-                   LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
-                   exit( 1 );
-               }
-               strcpy( pr->p_role, p );
-           }
-
-           if (( c = pgetnum( "si" )) < 0 ) {
-               pr->p_srvid = defprinter.p_srvid;
-           } else {
-               pr->p_srvid = c;
-           }
-#endif /* ABS_PRINT */
-       }
-
-
-       /*
-        * Cost of printer.
-        */
-       if ( pr->p_pagecost_msg != NULL &&
-               pr->p_pagecost_msg != defprinter.p_pagecost_msg ) {
-           free( pr->p_pagecost_msg );
-       }
-       a = area;
-       if (( p = pgetstr( "pc", &a )) != NULL ) {
-           if (( pr->p_pagecost_msg =
-                   (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
-               exit( 1 );
-           }
-           strcpy( pr->p_pagecost_msg, p );
-           pr->p_pagecost = 0;
-       } else if ( pr->p_flags & P_ACCOUNT ) {
-           if (( c = pgetnum( "pc" )) < 0 ) {
-               pr->p_pagecost = defprinter.p_pagecost;
-           } else {
-               pr->p_pagecost = c;
-           }
-           pr->p_pagecost_msg = NULL;
-       }
-
-       /*
-        * Get lpd lock file.
-        */
-       if ( pr->p_lock != NULL && pr->p_lock != defprinter.p_lock ) {
-           free( pr->p_lock );
-       }
-       a = area;
-       if (( p = pgetstr( "lo", &a )) == NULL ) {
-           pr->p_lock = defprinter.p_lock;
-       } else {
-           if (( pr->p_lock = (char *)malloc( strlen( p ) + 1 )) == NULL ) {
-               LOG(log_error, logtype_papd, "malloc: %s", strerror(errno) );
-               exit( 1 );
-           }
-           strcpy( pr->p_lock, p );
-       }
-
-#ifdef KRB
-       /*
-        * Must Kerberos authenticate?
-        */
-       if ( pgetflag( "ka" ) == 1 ) {
-           pr->p_flags |= P_KRB;
-       } else {
-           pr->p_flags &= ~P_KRB;
-       }
-#endif /* KRB */
-
-       endprent();
-    }
-#endif /* HAVE_CUPS */
-
-    return( 0 );
-}