aboutsummaryrefslogtreecommitdiff
path: root/unix/boot/bootlib/oschdir.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /unix/boot/bootlib/oschdir.c
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
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);
+}