aboutsummaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/libunix/picksb.c
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/libexec/uucp/libunix/picksb.c')
-rw-r--r--gnu/libexec/uucp/libunix/picksb.c230
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);
+}