summaryrefslogtreecommitdiffstats
path: root/rtemsbsd/rtems/rtems-bsd-syscall-api.c
diff options
context:
space:
mode:
Diffstat (limited to 'rtemsbsd/rtems/rtems-bsd-syscall-api.c')
-rw-r--r--rtemsbsd/rtems/rtems-bsd-syscall-api.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/rtemsbsd/rtems/rtems-bsd-syscall-api.c b/rtemsbsd/rtems/rtems-bsd-syscall-api.c
index 76fc8ad7..142e4faf 100644
--- a/rtemsbsd/rtems/rtems-bsd-syscall-api.c
+++ b/rtemsbsd/rtems/rtems-bsd-syscall-api.c
@@ -931,9 +931,18 @@ rtems_bsd_sysgen_open_node(
} else {
rtems_filesystem_location_info_t *rootloc =
&iop->pathinfo.mt_entry->mt_fs_root->location;
+ /*
+ * We need the parent directory so open can find the
+ * entry. If we are creating the file the pathinfo
+ * vnode entry is the directory open uses to create
+ * the file in.
+ */
cdir = rtems_bsd_libio_loc_to_vnode_dir(&iop->pathinfo);
+ if (cdir == NULL || creat) {
+ cdir = rtems_bsd_libio_loc_to_vnode(&iop->pathinfo);
+ }
if (fdp->fd_cdir == NULL) {
- cdir = rtems_bsd_libio_loc_to_vnode(rootloc);
+ cdir = rtems_bsd_libio_loc_to_vnode_dir(rootloc);
} else if (rtems_bsd_libio_loc_to_vnode(&iop->pathinfo) ==
rtems_bsd_libio_loc_to_vnode(rootloc)) {
/*
@@ -958,11 +967,14 @@ rtems_bsd_sysgen_open_node(
FILEDESC_XUNLOCK(fdp);
if (RTEMS_BSD_SYSCALL_TRACE) {
- printf("bsd: sys: open: path=%s opath=%s vn=%p cwd=%p"
- " flags=%08x mode=%08x isdir=%s\n",
- path, opath,
- creat ? NULL : rtems_bsd_libio_loc_to_vnode(&iop->pathinfo),
- fdp->fd_cdir, oflag, mode, isdir ? "yes" : "no");
+ struct vnode* _vn = rtems_bsd_libio_loc_to_vnode(&iop->pathinfo);
+ struct vnode* _dvn = rtems_bsd_libio_loc_to_vnode_dir(&iop->pathinfo);
+ printf("bsd: sys: open: path=%s opath=%s vn=%p (%c) dvn=%p (%c) cwd=%p"
+ " flags=%08x mode=%o isdir=%s\n",
+ path, opath,
+ _vn, creat ? 'c' : _vn ? (_vn->v_type == VDIR ? 'd' : 'r') : 'n',
+ _dvn, _dvn ? (_dvn->v_type == VDIR ? 'd' : 'r') : 'n',
+ fdp->fd_cdir, oflag, mode, isdir ? "yes" : "no");
}
VREF(fdp->fd_cdir);