]> arthur.barton.de Git - netatalk.git/blobdiff - etc/papd/lp.c
implemented config.h
[netatalk.git] / etc / papd / lp.c
index fca5ca2088ce7f1cac1f094586ac96537538076b..fbfc2be916fa2756c7921e0746f45dfb6d77a7d4 100644 (file)
  * Interface to lpr system.
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <sys/param.h>
 #include <sys/syslog.h>
 #include <sys/time.h>
@@ -65,6 +69,7 @@
 #include <string.h>
 #include <netdb.h>
 #include <fcntl.h>
+#include <pwd.h>
 
 #include "printer.h"
 #include "file.h"
@@ -180,7 +185,7 @@ lp_init( out, sat )
     char       cost[ 22 ];
     char       balance[ 22 ];
 #endif ABS_PRINT
-#ifdef CAPDIR
+#if defined( CAPDIR ) || defined( USE_CAP )
     char       username[32];
     int                addr_net, addr_node;
     FILE       *cap_file;
@@ -315,6 +320,7 @@ lp_open( out, sat )
 {
     char       name[ MAXPATHLEN ];
     int                fd;
+    struct passwd      *pwent;
 
     if (( lp.lp_flags & LP_INIT ) == 0 && lp_init( out, sat ) != 0 ) {
        return( -1 );
@@ -326,6 +332,15 @@ lp_open( out, sat )
 
     if ( lp.lp_flags & LP_PIPE ) {
        /* 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) {
+                   syslog(LOG_INFO, "setreuid error: %m");
+               }
+           } else {
+               syslog(LOG_INFO, "Error getting username (%s)", lp.lp_person);
+           }
+       }
        if (( lp.lp_stream = popen( printer->p_printer, "w" )) == NULL ) {
            syslog( LOG_ERR, "lp_open popen %s: %m", printer->p_printer );
            spoolerror( out, NULL );