]> Pileus Git - ~andy/fetchmail/commitdiff
Initial revision
authorEric S. Raymond <esr@thyrsus.com>
Tue, 25 Jun 1996 14:32:01 +0000 (14:32 -0000)
committerEric S. Raymond <esr@thyrsus.com>
Tue, 25 Jun 1996 14:32:01 +0000 (14:32 -0000)
svn path=/trunk/; revision=6

Makefile.in [new file with mode: 0644]
daemon.c [new file with mode: 0644]

diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..7f06180
--- /dev/null
@@ -0,0 +1,241 @@
+#
+#      Makefile for popclient
+#      Carl Harris, ceharris@mal.com
+#
+#      $Log: Makefile.in,v $
+#      Revision 1.1  1996/06/25 14:29:44  esr
+#      Initial revision
+#
+#      Revision 1.5  1995/08/10 00:32:19  ceharris
+#      Preparation for 3.0b3 beta release:
+#      -       added code for --kill/--keep, --limit, --protocol, --flush
+#              options; --pop2 and --pop3 options now obsoleted by --protocol.
+#      -       added support for APOP authentication, including --with-APOP
+#              argument for configure.
+#      -       provisional and broken support for RPOP
+#      -       added buffering to SockGets and SockRead functions.
+#      -       fixed problem of command-line options not being correctly
+#              carried into the merged options record.
+#
+#      Revision 1.4  1995/08/09 01:32:41  ceharris
+#      Version 3.0 beta 2 release.
+#      Added
+#      -       .poprc functionality
+#      -       GNU long options
+#      -       multiple servers on the command line.
+#      Fixed
+#      -       Passwords showing up in ps output.
+#
+#      Revision 1.3  1995/08/08 01:01:11  ceharris
+#      Added GNU-style long options processing.
+#      Fixed password in 'ps' output problem.
+#      Fixed various RCS tag blunders.
+#      Integrated .poprc parser, lexer, etc into Makefile processing.
+#
+#
+
+# Ultrix 2.2 make doesn't expand the value of VPATH.
+srcdir = @srcdir@
+VPATH = @srcdir@
+
+CC = @CC@
+
+CFLAGS = @CFLAGS@
+LDFLAGS = @LDFLAGS@
+LEX = @LEX@
+LEXFLAGS=
+YACC = @YACC@
+YACCFLAGS=-d
+
+# How to invoke ranlib.  This is only used by the `glob' subdirectory.
+RANLIB = @RANLIB@
+
+# NeXT 1.0a uses an old version of GCC, which required -D__inline=inline.
+# See also `config.h'.
+defines = @DEFS@
+
+# If your system needs extra libraries loaded in, define them here.
+LOADLIBES = @LIBS@ @LEXLIB@
+
+# Any extra object files your system needs.
+extras = @LIBOBJS@
+
+# Extra sources/objects for library functions not provided on the host system.
+EXTRASRC = @EXTRASRC@
+EXTRAOBJ = @EXTRAOBJ@
+
+# Common prefix for machine-independent installed files.
+prefix = /usr/local
+# Common prefix for machine-dependent installed files.
+exec_prefix = $(prefix)
+
+# Name under which to install popclient
+instname = popclient
+# Directory in which to install.
+bindir = $(exec_prefix)/bin
+# Directory to install the Info files in.
+infodir = $(prefix)/info
+# Directory to install the man page in.
+mandir = $(prefix)/man/man$(manext)
+# Number to put on the man page filename.
+manext = 1
+
+# Program to install `make'.
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+# Program to install the man page.
+INSTALL_DATA = @INSTALL_DATA@
+# Generic install program.
+INSTALL = @INSTALL@
+
+# Program to format Texinfo source into Info files.
+MAKEINFO = makeinfo
+# Program to format Texinfo source into DVI files.
+TEXI2DVI = texi2dvi
+
+# Programs to make tags files.
+ETAGS = etags -tw
+CTAGS = ctags -tw
+
+objs = socket.o getpass.o pop2.o pop3.o popclient.o options.o          \
+       poprc_l.o poprc_y.o poprc.o xmalloc.o                           \
+       $(EXTRAOBJ) $(extras)
+
+srcs = $(srcdir)/socket.c $(srcdir)/getpass.c $(srcdir)/pop2.c                 \
+       $(srcdir)/pop3.c $(srcdir)/popclient.c $(srcdir)/options.c      \
+       $(srcdir)/poprc_l.c $(srcdir)/poprc_y.c $(srcdir)/poprc.c       \
+       $(srcdir)/xmalloc.c                                             \
+       $(EXTRASRC)
+
+
+.SUFFIXES:
+.SUFFIXES: .o .c .h .y .l .ps .dvi .info .texi
+
+all: popclient
+check: # No tests.
+depend:
+       test -f config.h || touch config.h
+       test -f poprc_y.h || touch poprc_y.h
+       makedepend -fMakefile.in *.c
+
+info: popclient.info
+dvi: popclient.dvi
+# Some makes apparently use .PHONY as the default goal is it is before `all'.
+.PHONY: all check info dvi
+
+popclient.info: popclient.texi
+       $(MAKEINFO) -I$(srcdir) $(srcdir)/popclient.texi -o popclient.info
+
+popclient.dvi: popclient.texi
+       $(TEXI2DVI) $(srcdir)/popclient.texi
+
+popclient.ps: popclient.dvi
+       dvi2ps popclient.dvi > popclient.ps
+
+popclient: $(srcdir)/poprc_l.c $(srcdir)/poprc_y.c $(objs)
+       $(CC) $(LDFLAGS) $(objs) $(LOADLIBES) -o popclient
+
+
+# -I. is needed to find config.h in the build directory.
+.c.o:
+       $(CC) $(defines) -c -I. -I$(srcdir) $(CFLAGS) $< $(OUTPUT_OPTION)
+
+# lex rule
+.l.o:
+
+.l.c:
+       $(LEX) $(LEXFLAGS) $<
+       mv lex.yy.c $@
+
+# yacc rule
+.y.o:
+
+.y.c:
+       $(YACC) $(YACCFLAGS) $<
+       mv y.tab.c $@
+       mv -f y.tab.h $*.h
+
+# For some losing Unix makes.
+SHELL = /bin/sh
+MAKE = make
+
+FORCE:
+
+tagsrcs = $(srcs)
+TAGS: $(tagsrcs)
+       $(ETAGS) $(tagsrcs)
+tags: $(tagsrcs)
+       $(CTAGS) $(tagsrcs)
+
+.PHONY: install installdirs
+install: installdirs \
+        $(bindir)/$(instname) $(infodir)/popclient.info \
+        $(mandir)/$(instname).$(manext)
+
+installdirs:
+       $(SHELL) ${srcdir}/mkinstalldirs $(bindir) $(infodir) $(mandir)
+
+$(bindir)/$(instname): popclient
+       $(INSTALL_PROGRAM) popclient $@
+
+$(infodir)/popclient.info: popclient.info
+       if [ -r ./popclient.info ]; then dir=.; else dir=$(srcdir); fi; \
+       for file in $${dir}/popclient.info*; do \
+         name="`basename $$file`"; \
+         $(INSTALL_DATA) $$file \
+           `echo $@ | sed "s,popclient.info\$$,$$name,"`; \
+       done
+# Run install-info only if it exists.
+# Use `if' instead of just prepending `-' to the
+# line so we notice real errors from install-info.
+# We use `$(SHELL) -c' because some shells do not
+# fail gracefully when there is an unknown command.
+       if $(SHELL) -c 'install-info --version' >/dev/null 2>&1; then \
+         install-info --infodir=$(infodir) $$dir/popclient.info; \
+       else true; fi
+
+$(mandir)/$(instname).$(manext): popclient.man
+       $(INSTALL_DATA) $(srcdir)/popclient.man $@
+
+
+.PHONY: clean realclean distclean mostlyclean
+clean: 
+       -rm -f popclient *.o core popclient.dvi \
+              poprc_l.c poprc_y.h poprc_y.c
+
+distclean: clean 
+       -rm -f Makefile config.h
+       -rm -f config.cache config.status config.log stamp-config
+       -rm -f TAGS tags
+       -rm -f popclient.log popclient.toc popclient.*aux
+
+realclean: popclient.info* distclean
+
+mostlyclean: clean
+
+Makefile: config.status $(srcdir)/Makefile.in
+       $(SHELL) config.status
+
+config.h: stamp-config 
+
+stamp-config: config.status $(srcdir)/config.h.in
+       $(SHELL) config.status
+       touch stamp-config
+
+configure: configure.in
+       autoconf $(ACFLAGS)
+
+# This tells versions [3.59,3.63) of GNU make not to export all variables.
+.NOEXPORT:
+
+
+# Special dependencies, not easily handled without explicit rules
+$(srcdir)/poprc_l.c: $(srcdir)/poprc_l.l
+$(srcdir)/poprc_y.c: $(srcdir)/poprc_y.y
+
+
+# The automatically generated dependencies below may omit config.h
+# because it is included with ``#include <config.h>'' rather than
+# ``#include "config.h"''.  So we add the explicit dependency to make sure.
+$(objs): config.h
+
+# Automatically generated dependencies will be put at the end of the file.
diff --git a/daemon.c b/daemon.c
new file mode 100644 (file)
index 0000000..56aab4e
--- /dev/null
+++ b/daemon.c
@@ -0,0 +1,221 @@
+/* Copyright 1993-95 by Carl Harris, Jr.
+ * All rights reserved
+ *
+ * Distribute freely, except: don't remove my name from the source or
+ * documentation (don't take credit for my work), mark your changes (don't
+ * get me blamed for your possible bugs), don't alter or remove this
+ * notice.  May be sold if buildable source is provided to buyer.  No
+ * warrantee of any kind, express or implied, is included with this
+ * software; use at your own risk, responsibility for damages (if any) to
+ * anyone resulting from the use of this software rests entirely with the
+ * user.
+ *
+ * Send bug reports, bug fixes, enhancements, requests, flames, etc., and
+ * I'll try to keep a version up to date.  I can be reached as follows:
+ * Carl Harris <ceharris@mal.com>
+ */
+
+
+/***********************************************************************
+  module:       daemon
+  project:      popclient
+  programmer:   Carl Harris, ceharris@mal.com
+  description:  This module contains all of the code needed to 
+               turn a process into a daemon for POSIX, SysV, and
+               BSD systems.
+
+  $Log: daemon.c,v $
+  Revision 1.1  1996/06/25 14:32:01  esr
+  Initial revision
+
+  Revision 1.1  1995/08/14 18:36:38  ceharris
+  Patches to support POP3's LAST command.
+  Final revisions for beta3 release.
+
+ ***********************************************************************/
+
+
+#include <config.h>
+
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#include <signal.h>
+#include <fcntl.h>
+
+#if defined(HAVE_SYS_WAIT_H)
+#  include <sys/wait.h>
+#endif
+
+#if defined(HAVE_UNISTD_H)
+#  include <unistd.h>
+#endif
+
+
+#include "popclient.h"
+
+
+/******************************************************************
+  function:    sigchld_handler
+  description: Process the SIGCHLD (a.k.a SIGCLD) signal by calling
+               a wait() variant to obtain the exit code of the 
+               terminating process.
+  arguments:   none.
+  ret. value:  none (or undefined if REGSIGTYPE is int).
+  globals:     none.
+  calls:       none.
+ *****************************************************************/
+
+RETSIGTYPE
+sigchld_handler ()
+{
+  pid_t pid;
+
+#if defined(HAVE_UNION_WAIT)
+  union wait status;
+#else
+  int status;
+#endif
+
+#if    defined(HAVE_WAIT3)
+  while ((pid = wait3(&status, WNOHANG, (struct rusage *) 0)) > 0)
+    ; /* swallow 'em up. */
+#elif  defined(HAVE_WAITPID)
+  while ((pid = waitpid(-1, &status, WNOHANG)) > 0)
+    ; /* swallow 'em up. */
+#else  /* Zooks! Nothing to do but wait(), and hope we don't block... */
+  wait(&status);
+#endif
+
+}
+
+
+
+/******************************************************************
+  function:    daemonize
+  description: become a daemon process; i.e. detach from the 
+               control terminal, don't reacquire a control terminal,
+                become process group leader of our own process group,
+                and set up to catch child process termination signals.
+  arguments:
+    options    command-line options.
+
+  ret. value:  none.
+  globals:     refers to the address of sigchld_handler().
+  calls:       none.
+ *****************************************************************/
+
+int
+daemonize (options)
+struct optrec *options;
+{
+  int fd;
+  pid_t childpid;
+  RETSIGTYPE sigchild_handler();
+
+  /* if we are started by init (process 1) via /etc/inittab we needn't 
+     bother to detach from our process group context */
+
+  if (getppid() == 1) 
+    goto nottyDetach;
+
+  /* Ignore BSD terminal stop signals */
+#ifdef         SIGTTOU
+  signal(SIGTTOU, SIG_IGN);
+#endif
+#ifdef SIGTTIN
+  signal(SIGTTIN, SIG_IGN);
+#endif
+#ifdef SIGTSTP
+  signal(SIGTSTP, SIG_IGN);
+#endif
+
+  /* In case we were not started in the background, fork and let
+     the parent exit.  Guarantees that the child is not a process
+     group leader */
+
+  if ((childpid = fork()) < 0) {
+    perror("fork");
+    return(PS_IOERR);
+  }
+  else if (childpid > 0) 
+    exit(0);  /* parent */
+
+  
+  /* Make ourselves the leader of a new process group with no
+     controlling terminal */
+
+#if    defined(HAVE_SETSID)            /* POSIX */
+  /* POSIX makes this soooo easy to do */
+  if (setsid() < 0) {
+    perror("setsid");
+    return(PS_IOERR);
+  }
+#elif  defined(SIGTSTP)                /* BSD */
+  /* change process group */
+  setpgrp(0, getpid());
+
+  /* lose controlling tty */
+  if ((fd = open("/dev/tty", O_RDWR)) >= 0) {
+    ioctl(fd, TIOCNOTTY, (char *) 0);
+    close(fd);
+  }
+#else                                  /* SVR3 and older */
+  /* change process group */
+  setpgrp();
+  
+  /* lose controlling tty */
+  signal(SIGHUP, SIG_IGN);
+  if ((childpid = fork) < 0) {
+    perror("fork");
+    return(PS_IOERR);
+  }
+  else if (childpid > 0) {
+    exit(0);   /* parent */
+  }
+#endif
+
+nottyDetach:
+
+  /* Close any/all open file descriptors */
+#if    defined(HAVE_GETDTABLESIZE)
+  for (fd = getdtablesize()-1;  fd >= 0;  fd--)
+#elif  defined(NOFILE)
+  for (fd = NOFILE-1;  fd >= 0;  fd--)
+#else          /* make an educated guess */
+  for (fd = 19;  fd >= 0;  fd--)
+#endif
+  {
+    close(fd);
+  }
+
+  /* Reopen stdin descriptor on /dev/null */
+  if ((fd = open("/dev/null", O_RDWR)) < 0) {   /* stdin */
+    perror("open: /dev/null");
+    return(PS_IOERR);
+  }
+
+
+  if (dup(fd) < 0) {                           /* stdout */
+    log_perror("dup");
+    return(PS_IOERR);
+  }
+  if (dup(fd) < 0) {                           /* stderr */
+    log_perror("dup");
+    return(PS_IOERR);
+  }
+
+  /* move to root directory, so we don't prevent filesystem unmounts */
+  chdir("/");
+
+  /* set our umask to something reasonable (we hope) */
+#if defined(DEF_UMASK)
+  umask(DEF_UMASK);
+#else
+  umask(022);
+#endif
+
+  /* set up to catch child process termination signals */ 
+  signal(SIGCLD, sigchild_handler); 
+
+}