aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/bootlib/oschdir.c
diff options
context:
space:
mode:
Diffstat (limited to 'unix/boot/bootlib/oschdir.c')
-rw-r--r--unix/boot/bootlib/oschdir.c43
1 files changed, 43 insertions, 0 deletions
diff --git a/unix/boot/bootlib/oschdir.c b/unix/boot/bootlib/oschdir.c
new file mode 100644
index 00000000..497f1576
--- /dev/null
+++ b/unix/boot/bootlib/oschdir.c
@@ -0,0 +1,43 @@
+/* Copyright(c) 1986 Association of Universities for Research in Astronomy Inc.
+ */
+
+#include "bootlib.h"
+
+
+extern int os_fpathname (char *vfn, char *osfn, int maxch);
+
+
+
+/* OS_CHDIR -- Change the current default directory. Note that the kernel
+ * procedure ZFCHDR should only be called with the full pathname of a
+ * directory.
+ */
+int
+os_chdir (char *dir)
+{
+ XCHAR dpath[SZ_PATHNAME+1];
+ XCHAR osdir[SZ_PATHNAME+1];
+ XINT sz_dpath, sz_osdir, status, x_maxch=SZ_PATHNAME;
+
+ extern int ZFXDIR(), ZFGCWD(), ZFSUBD(), ZFCHDR();
+
+
+ sz_dpath = os_fpathname (dir, (char *)dpath, SZ_PATHNAME);
+ os_strupk ((char *)dpath, osdir, SZ_PATHNAME);
+ ZFXDIR (osdir, osdir, &x_maxch, &sz_osdir);
+
+ if (sz_osdir <= 0) {
+ /* Dir is a subdirectory, not a full pathname. Note that this
+ * only works for an immediate subdirectory, and does not work
+ * for paths relative to the cwd.
+ */
+ ZFGCWD (osdir, &x_maxch, &sz_osdir);
+ os_strupk ((char *)osdir, osdir, SZ_PATHNAME);
+ os_strupk (dir, dpath, SZ_PATHNAME);
+ ZFSUBD (osdir, &x_maxch, dpath, &sz_osdir);
+ os_strpak (osdir, (char *)dpath, SZ_PATHNAME);
+ }
+
+ ZFCHDR (dpath, &status);
+ return (status);
+}