Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Jun 1999 15:34:57 -0400 (EDT)
From:      Spike <spork@narcissus.net>
To:        freebsd-current@freebsd.org
Subject:   Patches to LPD
Message-ID:  <Pine.BSF.4.05.9906201534260.4198-300000@nyc-ny63-18.ix.netcom.com1011>

index | next in thread | raw e-mail

[-- Attachment #1 --]

	Included for review are two patches against -current's lpd. The
first adds a new flag to lpd ("-s") which will cause lpd not to bind to
the TCP printer port. The second patch updates the man page to reflect the
changes. These are the first patches I've submitted, so if I've messed
them up please tell me how to fix them. Thanks. 
	


	--Spike Gronim
	  sporkl@ix.netcom.com
		

[-- Attachment #2 --]
*** ./lpd.c	Sun Jun 20 15:14:43 1999
--- ./lpd-new.c	Sun Jun 20 15:16:12 1999
***************
*** 104,109 ****
--- 104,110 ----
  #include "extern.h"
  
  int	lflag;				/* log requests flag */
+ int     sflag;                          /* do not bind to tcp flag. */
  int	from_remote;			/* from remote socket */
  
  int		  main __P((int, char **));
***************
*** 144,150 ****
  		errx(EX_NOPERM,"must run as root");
  
  	errs = 0;
! 	while ((i = getopt(argc, argv, "dl")) != -1)
  		switch (i) {
  		case 'd':
  			options |= SO_DEBUG;
--- 145,151 ----
  		errx(EX_NOPERM,"must run as root");
  
  	errs = 0;
! 	while ((i = getopt(argc, argv, "dls")) != -1)
  		switch (i) {
  		case 'd':
  			options |= SO_DEBUG;
***************
*** 152,157 ****
--- 153,161 ----
  		case 'l':
  			lflag++;
  			break;
+ 		case 's':
+ 		        sflag++;
+ 			break;
  		default:
  			errs++;
  		}
***************
*** 277,299 ****
  	sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
  	FD_ZERO(&defreadfds);
  	FD_SET(funix, &defreadfds);
! 	listen(funix, 5);
! 	finet = socket(AF_INET, SOCK_STREAM, 0);
! 	if (finet >= 0) {
! 		if (options & SO_DEBUG)
! 			if (setsockopt(finet, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) {
! 				syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m");
! 				mcleanup(0);
! 			}
! 		memset(&sin, 0, sizeof(sin));
! 		sin.sin_family = AF_INET;
! 		sin.sin_port = sp->s_port;
! 		if (bind(finet, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
! 			syslog(LOG_ERR, "bind: %m");
! 			mcleanup(0);
! 		}
! 		FD_SET(finet, &defreadfds);
! 		listen(finet, 5);
  	}
  	/*
  	 * Main loop: accept, do a request, continue.
--- 281,305 ----
  	sigprocmask(SIG_SETMASK, &omask, (sigset_t *)0);
  	FD_ZERO(&defreadfds);
  	FD_SET(funix, &defreadfds);
! 	listen(funix, 5);	
! 	if (sflag == 0) {
! 	    finet = socket(AF_INET, SOCK_STREAM, 0);
! 	    if (finet >= 0) {
! 	       	    if (options & SO_DEBUG)
! 		            if (setsockopt(finet, SOL_SOCKET, SO_DEBUG, 0, 0) < 0) {
! 			            syslog(LOG_ERR, "setsockopt (SO_DEBUG): %m");
! 				    mcleanup(0);
! 			    }
! 		    memset(&sin, 0, sizeof(sin));
! 		    sin.sin_family = AF_INET;
! 		    sin.sin_port = sp->s_port;
! 		    if (bind(finet, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
! 		            syslog(LOG_ERR, "bind: %m");
! 		            mcleanup(0);
! 		    }
! 		    FD_SET(finet, &defreadfds);
! 		    listen(finet, 5);
! 	    }
  	}
  	/*
  	 * Main loop: accept, do a request, continue.
***************
*** 318,324 ****
  			domain = AF_UNIX, fromlen = sizeof(fromunix);
  			s = accept(funix,
  			    (struct sockaddr *)&fromunix, &fromlen);
! 		} else /* if (FD_ISSET(finet, &readfds)) */  {
  			domain = AF_INET, fromlen = sizeof(frominet);
  			s = accept(finet,
  			    (struct sockaddr *)&frominet, &fromlen);
--- 324,330 ----
  			domain = AF_UNIX, fromlen = sizeof(fromunix);
  			s = accept(funix,
  			    (struct sockaddr *)&fromunix, &fromlen);
! 		} else if (sflag == 0) {
  			domain = AF_INET, fromlen = sizeof(frominet);
  			s = accept(finet,
  			    (struct sockaddr *)&frominet, &fromlen);
***************
*** 333,345 ****
  			continue;
  		}
  		if (fork() == 0) {
! 			signal(SIGCHLD, SIG_IGN);
  			signal(SIGHUP, SIG_IGN);
  			signal(SIGINT, SIG_IGN);
  			signal(SIGQUIT, SIG_IGN);
  			signal(SIGTERM, SIG_IGN);
  			(void) close(funix);
! 			(void) close(finet);
  			dup2(s, 1);
  			(void) close(s);
  			if (domain == AF_INET) {
--- 339,352 ----
  			continue;
  		}
  		if (fork() == 0) {
! 		       	signal(SIGCHLD, SIG_IGN);
  			signal(SIGHUP, SIG_IGN);
  			signal(SIGINT, SIG_IGN);
  			signal(SIGQUIT, SIG_IGN);
  			signal(SIGTERM, SIG_IGN);
  			(void) close(funix);
! 			if (sflag == 0)
! 			        (void) close(finet);
  			dup2(s, 1);
  			(void) close(s);
  			if (domain == AF_INET) {
***************
*** 629,634 ****
  static void
  usage()
  {
! 	fprintf(stderr, "usage: lpd [-dl] [port#]\n");
  	exit(EX_USAGE);
  }
--- 636,641 ----
  static void
  usage()
  {
! 	fprintf(stderr, "usage: lpd [-dls] [port#]\n");
  	exit(EX_USAGE);
  }

[-- Attachment #3 --]
*** ./lpd.8.orig	Sun Jun 20 11:00:40 1999
--- ./lpd.8	Sun Jun 20 10:59:34 1999
***************
*** 39,45 ****
  .Nd line printer spooler daemon
  .Sh SYNOPSIS
  .Nm lpd
! .Op Fl dl
  .Op Ar port#
  .Sh DESCRIPTION
  .Nm Lpd
--- 39,45 ----
  .Nd line printer spooler daemon
  .Sh SYNOPSIS
  .Nm lpd
! .Op Fl dls
  .Op Ar port#
  .Sh DESCRIPTION
  .Nm Lpd
***************
*** 72,77 ****
--- 72,83 ----
  .Nm
  to log valid requests received from the network. This can be useful
  for debugging purposes.
+ .It Fl s
+ The
+ .Fl s
+ flag causes
+ .Nm
+ not to bind to a TCP socket. This is similar to the "-s" flag to syslogd.
  .It Ar "port#"
  The Internet port number used to rendezvous
  with other processes is normally obtained with
help

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.05.9906201534260.4198-300000>