diff options
Diffstat (limited to 'gnu/libexec/uucp/libunix/picksb.c')
| -rw-r--r-- | gnu/libexec/uucp/libunix/picksb.c | 230 | 
1 files changed, 230 insertions, 0 deletions
| diff --git a/gnu/libexec/uucp/libunix/picksb.c b/gnu/libexec/uucp/libunix/picksb.c new file mode 100644 index 000000000000..4d8cc4b2f3b6 --- /dev/null +++ b/gnu/libexec/uucp/libunix/picksb.c @@ -0,0 +1,230 @@ +/* picksb.c +   System dependent routines for uupick. + +   Copyright (C) 1992 Ian Lance Taylor + +   This file is part of the Taylor UUCP package. + +   This program is free software; you can redistribute it and/or +   modify it under the terms of the GNU General Public License as +   published by the Free Software Foundation; either version 2 of the +   License, or (at your option) any later version. + +   This program is distributed in the hope that it will be useful, but +   WITHOUT ANY WARRANTY; without even the implied warranty of +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU +   General Public License for more details. + +   You should have received a copy of the GNU General Public License +   along with this program; if not, write to the Free Software +   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +   The author of the program may be contacted at ian@airs.com or +   c/o Infinity Development Systems, P.O. Box 520, Waltham, MA 02254. +   */ + +#include "uucp.h" + +#if USE_RCS_ID +const char picksb_rcsid[] = "$Id: picksb.c,v 1.1 1993/08/05 18:24:15 conklin Exp $"; +#endif + +#include "uudefs.h" +#include "system.h" +#include "sysdep.h" + +#include <errno.h> +#include <pwd.h> + +#if HAVE_OPENDIR +#if HAVE_DIRENT_H +#include <dirent.h> +#else /* ! HAVE_DIRENT_H */ +#include <sys/dir.h> +#define dirent direct +#endif /* ! HAVE_DIRENT_H */ +#endif /* HAVE_OPENDIR */ + +#if GETPWUID_DECLARATION_OK +#ifndef getpwuid +extern struct passwd *getpwuid (); +#endif +#endif + +/* Local variables.  */ + +/* Directory of ~/receive/USER.  */ +static DIR *qStopdir; + +/* Name of ~/receive/USER.  */ +static char *zStopdir; + +/* Directory of ~/receive/USER/SYSTEM.  */ +static DIR *qSsysdir; + +/* Name of system.  */ +static char *zSsysdir; + +/* Prepare to get a list of all the file to uupick for this user.  */ + +/*ARGSUSED*/ +boolean +fsysdep_uupick_init (zsystem, zpubdir) +     const char *zsystem; +     const char *zpubdir; +{ +  const char *zuser; + +  zuser = zsysdep_login_name (); + +  zStopdir = (char *) xmalloc (strlen (zpubdir) +			       + sizeof "/receive/" +			       + strlen (zuser)); +  sprintf (zStopdir, "%s/receive/%s", zpubdir, zuser); + +  qStopdir = opendir (zStopdir); +  if (qStopdir == NULL && errno != ENOENT) +    { +      ulog (LOG_ERROR, "opendir (%s): %s", zStopdir, +	    strerror (errno)); +      return FALSE; +    } + +  qSsysdir = NULL; + +  return TRUE; +} + +/* Return the next file from the uupick directories.  */ + +/*ARGSUSED*/ +char * +zsysdep_uupick (zsysarg, zpubdir, pzfrom, pzfull) +     const char *zsysarg; +     const char *zpubdir; +     char **pzfrom; +     char **pzfull; +{ +  struct dirent *qentry; + +  while (TRUE) +    { +      while (qSsysdir == NULL) +	{ +	  const char *zsystem; +	  char *zdir; + +	  if (qStopdir == NULL) +	    return NULL; + +	  if (zsysarg != NULL) +	    { +	      closedir (qStopdir); +	      qStopdir = NULL; +	      zsystem = zsysarg; +	    } +	  else +	    { +	      do +		{ +		  qentry = readdir (qStopdir); +		  if (qentry == NULL) +		    { +		      closedir (qStopdir); +		      qStopdir = NULL; +		      return NULL; +		    } +		} +	      while (strcmp (qentry->d_name, ".") == 0 +		     || strcmp (qentry->d_name, "..") == 0); + +	      zsystem = qentry->d_name; +	    } + +	  zdir = zbufalc (strlen (zStopdir) + strlen (zsystem) + sizeof "/"); +	  sprintf (zdir, "%s/%s", zStopdir, zsystem); + +	  qSsysdir = opendir (zdir); +	  if (qSsysdir == NULL) +	    { +	      if (errno != ENOENT && errno != ENOTDIR) +		ulog (LOG_ERROR, "opendir (%s): %s", zdir, strerror (errno)); +	    } +	  else +	    { +	      ubuffree (zSsysdir); +	      zSsysdir = zbufcpy (zsystem); +	    } + +	  ubuffree (zdir); +	} + +      qentry = readdir (qSsysdir); +      if (qentry == NULL) +	{ +	  closedir (qSsysdir); +	  qSsysdir = NULL; +	  continue; +	} + +      if (strcmp (qentry->d_name, ".") == 0 +	  || strcmp (qentry->d_name, "..") == 0) +	continue; + +      *pzfrom = zbufcpy (zSsysdir); +      *pzfull = zsappend3 (zStopdir, zSsysdir, qentry->d_name); +      return zbufcpy (qentry->d_name); +    } +} + +/*ARGSUSED*/ +boolean +fsysdep_uupick_free (zsystem, zpubdir) +     const char *zsystem; +     const char *zpubdir; +{ +  xfree ((pointer) zStopdir); +  if (qStopdir != NULL) +    { +      closedir (qStopdir); +      qStopdir = NULL; +    } +  ubuffree (zSsysdir); +  zSsysdir = NULL; +  if (qSsysdir != NULL) +    { +      closedir (qSsysdir); +      qSsysdir = NULL; +    } + +  return TRUE; +} + +/* Expand a local file name for uupick.  */ + +char * +zsysdep_uupick_local_file (zfile) +     const char *zfile; +{ +  struct passwd *q; + +  /* If this does not start with a simple ~, pass it to +     zsysdep_local_file_cwd; as it happens, zsysdep_local_file_cwd +     only uses the zpubdir argument if the file starts with a simple +     ~, so it doesn't really matter what we pass for zpubdir.  */ +  if (zfile[0] != '~' +      || (zfile[1] != '/' && zfile[1] != '\0')) +    return zsysdep_local_file_cwd (zfile, (const char *) NULL); +   +  q = getpwuid (getuid ()); +  if (q == NULL) +    { +      ulog (LOG_ERROR, "Can't get home directory"); +      return NULL; +    } + +  if (zfile[1] == '\0') +    return zbufcpy (q->pw_dir); + +  return zsysdep_in_dir (q->pw_dir, zfile + 2); +} | 
