summaryrefslogtreecommitdiff
path: root/gnu/libexec/uucp/libunix/xqtfil.c
diff options
context:
space:
mode:
authorTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
committerTheo de Raadt <deraadt@cvs.openbsd.org>1995-10-18 08:53:40 +0000
commitd6583bb2a13f329cf0332ef2570eb8bb8fc0e39c (patch)
treeece253b876159b39c620e62b6c9b1174642e070e /gnu/libexec/uucp/libunix/xqtfil.c
initial import of NetBSD tree
Diffstat (limited to 'gnu/libexec/uucp/libunix/xqtfil.c')
-rw-r--r--gnu/libexec/uucp/libunix/xqtfil.c298
1 files changed, 298 insertions, 0 deletions
diff --git a/gnu/libexec/uucp/libunix/xqtfil.c b/gnu/libexec/uucp/libunix/xqtfil.c
new file mode 100644
index 00000000000..42e498e031f
--- /dev/null
+++ b/gnu/libexec/uucp/libunix/xqtfil.c
@@ -0,0 +1,298 @@
+/* xqtfil.c
+ Routines to read execute files.
+
+ Copyright (C) 1991, 1992, 1993, 1995 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+ The author of the program may be contacted at ian@airs.com or
+ c/o Cygnus Support, 48 Grove Street, Somerville, MA 02144.
+ */
+
+#include "uucp.h"
+
+#if USE_RCS_ID
+const char xqtfil_rcsid[] = "$Id: xqtfil.c,v 1.1 1995/10/18 08:38:32 deraadt Exp $";
+#endif
+
+#include "uudefs.h"
+#include "sysdep.h"
+#include "system.h"
+
+#include <errno.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 */
+
+/* Under the V2 or BSD42 spool directory scheme, all execute files are
+ in the main spool directory. Under the BSD43 scheme, they are all
+ in the directory X.. Under the HDB or SVR4 scheme, they are in
+ directories named after systems. Under the ULTRIX scheme, they are
+ in X. subdirectories of subdirectories of sys. Under the TAYLOR
+ scheme, they are all in the subdirectory X. of a directory named
+ after the system.
+
+ This means that for HDB, ULTRIX, SVR4 or TAYLOR, we have to search
+ directories of directories. */
+
+#if SPOOLDIR_V2 || SPOOLDIR_BSD42
+#define ZDIR "."
+#define SUBDIRS 0
+#endif
+#if SPOOLDIR_HDB || SPOOLDIR_SVR4 || SPOOLDIR_TAYLOR
+#define ZDIR "."
+#define SUBDIRS 1
+#endif
+#if SPOOLDIR_ULTRIX
+#define ZDIR "sys"
+#define SUBDIRS 1
+#endif
+#if SPOOLDIR_BSD43
+#define ZDIR "X."
+#define SUBDIRS 0
+#endif
+
+/* Static variables for the execute file scan. */
+
+static DIR *qSxqt_topdir;
+#if ! SUBDIRS
+static const char *zSdir;
+#else /* SUBDIRS */
+static boolean fSone_dir;
+static char *zSdir;
+static DIR *qSxqt_dir;
+static char *zSsystem;
+#endif /* SUBDIRS */
+
+/* Initialize the scan for execute files. The function
+ usysdep_get_xqt_free will clear the data out when we are done with
+ the system. This returns FALSE on error. */
+
+/*ARGSUSED*/
+boolean
+fsysdep_get_xqt_init (zsystem)
+ const char *zsystem;
+{
+ usysdep_get_xqt_free ((const char *) NULL);
+
+#if SUBDIRS
+ if (zsystem != NULL)
+ {
+#if SPOOLDIR_HDB || SPOOLDIR_SVR4
+ zSdir = zbufcpy (zsystem);
+#endif
+#if SPOOLDIR_ULTRIX
+ zSdir = zsappend3 ("sys", zsystem, "X.");
+#endif
+#if SPOOLDIR_TAYLOR
+ zSdir = zsysdep_in_dir (zsystem, "X.");
+#endif
+
+ qSxqt_dir = opendir ((char *) zSdir);
+ if (qSxqt_dir != NULL)
+ {
+ qSxqt_topdir = qSxqt_dir;
+ fSone_dir = TRUE;
+ zSsystem = zbufcpy (zsystem);
+ return TRUE;
+ }
+ }
+
+ fSone_dir = FALSE;
+#endif
+
+ qSxqt_topdir = opendir ((char *) ZDIR);
+ if (qSxqt_topdir == NULL)
+ {
+ if (errno == ENOENT)
+ return TRUE;
+ ulog (LOG_ERROR, "opendir (%s): %s", ZDIR, strerror (errno));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/* Return the name of the next execute file to read and process. If
+ this returns NULL, *pferr must be checked. If will be TRUE on
+ error, FALSE if there are no more files. On a successful return
+ *pzsystem will be set to the system for which the execute file was
+ created. */
+
+/*ARGSUSED*/
+char *
+zsysdep_get_xqt (zsystem, pzsystem, pferr)
+ const char *zsystem;
+ char **pzsystem;
+ boolean *pferr;
+{
+ *pferr = FALSE;
+
+ if (qSxqt_topdir == NULL)
+ return NULL;
+
+ /* This loop continues until we find a file. */
+ while (TRUE)
+ {
+ DIR *qdir;
+ struct dirent *q;
+
+#if ! SUBDIRS
+ zSdir = ZDIR;
+ qdir = qSxqt_topdir;
+#else /* SUBDIRS */
+ /* This loop continues until we find a subdirectory to read. */
+ while (qSxqt_dir == NULL)
+ {
+ struct dirent *qtop;
+
+ qtop = readdir (qSxqt_topdir);
+ if (qtop == NULL)
+ {
+ (void) closedir (qSxqt_topdir);
+ qSxqt_topdir = NULL;
+ return NULL;
+ }
+
+ /* No system name may start with a dot This allows us to
+ quickly skip impossible directories. */
+ if (qtop->d_name[0] == '.')
+ continue;
+
+ DEBUG_MESSAGE1 (DEBUG_SPOOLDIR,
+ "zsysdep_get_xqt: Found %s in top directory",
+ qtop->d_name);
+
+ ubuffree (zSdir);
+
+#if SPOOLDIR_HDB || SPOOLDIR_SVR4
+ zSdir = zbufcpy (qtop->d_name);
+#endif
+#if SPOOLDIR_ULTRIX
+ zSdir = zsappend3 ("sys", qtop->d_name, "X.");
+#endif
+#if SPOOLDIR_TAYLOR
+ zSdir = zsysdep_in_dir (qtop->d_name, "X.");
+#endif
+
+ ubuffree (zSsystem);
+ zSsystem = zbufcpy (qtop->d_name);
+
+ qSxqt_dir = opendir (zSdir);
+
+ if (qSxqt_dir == NULL
+ && errno != ENOTDIR
+ && errno != ENOENT)
+ ulog (LOG_ERROR, "opendir (%s): %s", zSdir, strerror (errno));
+ }
+
+ qdir = qSxqt_dir;
+#endif /* SUBDIRS */
+
+ q = readdir (qdir);
+
+#if DEBUG > 1
+ if (q != NULL)
+ DEBUG_MESSAGE2 (DEBUG_SPOOLDIR,
+ "zsysdep_get_xqt: Found %s in subdirectory %s",
+ q->d_name, zSdir);
+#endif
+
+ /* If we've found an execute file, return it. We have to get
+ the system name, which is easy for HDB or TAYLOR. For other
+ spool directory schemes, we have to pull it out of the X.
+ file name; this would be insecure, except that zsfind_file
+ clobbers the file name to include the real system name. */
+ if (q != NULL
+ && q->d_name[0] == 'X'
+ && q->d_name[1] == '.')
+ {
+ char *zret;
+
+#if SPOOLDIR_HDB || SPOOLDIR_SVR4 || SPOOLDIR_TAYLOR
+ *pzsystem = zbufcpy (zSsystem);
+#else
+ {
+ size_t clen;
+
+ clen = strlen (q->d_name) - 7;
+ *pzsystem = zbufalc (clen + 1);
+ memcpy (*pzsystem, q->d_name + 2, clen);
+ (*pzsystem)[clen] = '\0';
+ }
+#endif
+
+ zret = zsysdep_in_dir (zSdir, q->d_name);
+#if DEBUG > 1
+ DEBUG_MESSAGE2 (DEBUG_SPOOLDIR,
+ "zsysdep_get_xqt: Returning %s (system %s)",
+ zret, *pzsystem);
+#endif
+ return zret;
+ }
+
+ /* If we've reached the end of the directory, then if we are
+ using subdirectories loop around to read the next one,
+ otherwise we are finished. */
+ if (q == NULL)
+ {
+ (void) closedir (qdir);
+
+#if SUBDIRS
+ qSxqt_dir = NULL;
+ if (! fSone_dir)
+ continue;
+#endif
+
+ qSxqt_topdir = NULL;
+ return NULL;
+ }
+ }
+}
+
+/* Free up the results of an execute file scan, when we're done with
+ this system. */
+
+/*ARGSUSED*/
+void
+usysdep_get_xqt_free (zsystem)
+ const char *zsystem;
+{
+ if (qSxqt_topdir != NULL)
+ {
+ (void) closedir (qSxqt_topdir);
+ qSxqt_topdir = NULL;
+ }
+#if SUBDIRS
+ if (qSxqt_dir != NULL)
+ {
+ (void) closedir (qSxqt_dir);
+ qSxqt_dir = NULL;
+ }
+ ubuffree (zSdir);
+ zSdir = NULL;
+ ubuffree (zSsystem);
+ zSsystem = NULL;
+ fSone_dir = FALSE;
+#endif
+}