From 44d3c175e50aebb9803474432193d6794052d77d Mon Sep 17 00:00:00 2001
From: "Michael I. Bushnell" <mib@gnu.org>
Date: Fri, 4 Feb 1994 19:49:36 +0000
Subject: Initial revision

---
 libdiskfs/dir-mkfile.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 62 insertions(+)
 create mode 100644 libdiskfs/dir-mkfile.c

(limited to 'libdiskfs/dir-mkfile.c')

diff --git a/libdiskfs/dir-mkfile.c b/libdiskfs/dir-mkfile.c
new file mode 100644
index 00000000..d9dbc694
--- /dev/null
+++ b/libdiskfs/dir-mkfile.c
@@ -0,0 +1,62 @@
+/*
+   Copyright (C) 1993, 1994 Free Software Foundation
+
+This file is part of the GNU Hurd.
+
+The GNU Hurd 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, or (at your option)
+any later version.
+
+The GNU Hurd 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 the GNU Hurd; see the file COPYING.  If not, write to
+the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
+
+/* Written by Michael I. Bushnell.  */
+
+#include "priv.h"
+
+/* Implement dir_mkfile as described in <hurd/fs.defs>. */
+error_t
+diskfs_S_dir_mkfile (struct protid *cred,
+		     int flags,
+		     mode_t mode,
+		     mach_port_t *newnode,
+		     mach_msg_type_name_t *newnodetype)
+{
+  struct node *np;
+  error_t err;
+
+  if (!cred)
+    return EOPNOTSUPP;
+  np = cred->po->np;
+  mutex_lock (&np->lock);
+  if (!S_ISDIR (np->dn_stat.st_mode))
+    {
+      mutex_unlock (&np->lock);
+      return ENOTDIR;
+    }
+  err = diskfs_access (np, S_IWRITE, cred);
+  mutex_unlock (&np->lock);
+  if (err)
+    return err;
+  
+  mode &= ~(S_IFMT | S_ISPARE | S_ISVTX);
+  mode |= S_IFREG;
+  err = diskfs_create_node (0, 0, mode, &np, cred, 0);
+  if (err)
+    return err;
+  
+  *returned_port = (diskfs_make_protid (diskfs_make_peropen (np, flags),
+					cred->uids, cred->nuids, 
+					cred->gids, cred->ngids))->pi.port;
+  *newnodetype = MACH_MSG_TYPE_MAKE_SEND;
+  return 0;
+}
+
+  
-- 
cgit v1.2.3