aboutsummaryrefslogtreecommitdiff
path: root/libnetfs/file-get-translator.c
diff options
context:
space:
mode:
Diffstat (limited to 'libnetfs/file-get-translator.c')
-rw-r--r--libnetfs/file-get-translator.c50
1 files changed, 28 insertions, 22 deletions
diff --git a/libnetfs/file-get-translator.c b/libnetfs/file-get-translator.c
index ebad95ac..7edc8fd0 100644
--- a/libnetfs/file-get-translator.c
+++ b/libnetfs/file-get-translator.c
@@ -1,5 +1,5 @@
/*
- Copyright (C) 1996 Free Software Foundation, Inc.
+ Copyright (C) 1996, 1999, 2000, 2008 Free Software Foundation, Inc.
Written by Michael I. Bushnell, p/BSG.
This file is part of the GNU Hurd.
@@ -18,10 +18,12 @@
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
+#include <string.h>
+#include <stdio.h>
+#include <hurd/paths.h>
#include "netfs.h"
#include "fs_S.h"
-#include <hurd/paths.h>
-#include <string.h>
+#include <sys/mman.h>
error_t
netfs_S_file_get_translator (struct protid *user,
@@ -36,7 +38,7 @@ netfs_S_file_get_translator (struct protid *user,
np = user->po->np;
mutex_lock (&np->lock);
- err = netfs_validate_stat (np, user->credential);
+ err = netfs_validate_stat (np, user->user);
if (err)
{
@@ -49,10 +51,10 @@ netfs_S_file_get_translator (struct protid *user,
unsigned int len = sizeof _HURD_SYMLINK + np->nn_stat.st_size + 1;
if (len > *translen)
- vm_allocate (mach_task_self (), (vm_address_t *)trans, len, 1);
- bcopy (_HURD_SYMLINK, *trans, sizeof _HURD_SYMLINK);
+ *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+ memcpy (*trans, _HURD_SYMLINK, sizeof _HURD_SYMLINK);
- err = netfs_attempt_readlink (user->credential, np,
+ err = netfs_attempt_readlink (user->user, np,
*trans + sizeof _HURD_SYMLINK);
if (!err)
{
@@ -69,16 +71,21 @@ netfs_S_file_get_translator (struct protid *user,
(S_ISCHR (np->nn_stat.st_mode)
? _HURD_CHRDEV
: _HURD_BLKDEV),
- '\0', (np->nn_stat.st_rdev >> 8) & 0377,
- '\0', (np->nn_stat.st_rdev) & 0377);
- buflen++; /* terminating nul */
-
- if (buflen > *translen)
- vm_allocate (mach_task_self (), (vm_address_t *) trans, buflen, 1);
- bcopy (buf, *trans, buflen);
- free (buf);
- *translen = buflen;
- err = 0;
+ '\0', major (np->nn_stat.st_rdev),
+ '\0', minor (np->nn_stat.st_rdev));
+ if (buflen < 0)
+ err = ENOMEM;
+ else
+ {
+ buflen++; /* terminating nul */
+
+ if (buflen > *translen)
+ *trans = mmap (0, buflen, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+ memcpy (*trans, buf, buflen);
+ free (buf);
+ *translen = buflen;
+ err = 0;
+ }
}
else if (S_ISFIFO (np->nn_stat.st_mode))
{
@@ -86,8 +93,8 @@ netfs_S_file_get_translator (struct protid *user,
len = sizeof _HURD_FIFO;
if (len > *translen)
- vm_allocate (mach_task_self (), (vm_address_t *) trans, len, 1);
- bcopy (_HURD_FIFO, *trans, sizeof _HURD_FIFO);
+ *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+ memcpy (*trans, _HURD_FIFO, sizeof _HURD_FIFO);
*translen = len;
err = 0;
}
@@ -97,8 +104,8 @@ netfs_S_file_get_translator (struct protid *user,
len = sizeof _HURD_IFSOCK;
if (len > *translen)
- vm_allocate (mach_task_self (), (vm_address_t *) trans, len, 1);
- bcopy (_HURD_IFSOCK, *trans, sizeof _HURD_IFSOCK);
+ *trans = mmap (0, len, PROT_READ|PROT_WRITE, MAP_ANON, 0, 0);
+ memcpy (*trans, _HURD_IFSOCK, sizeof _HURD_IFSOCK);
*translen = len;
err = 0;
}
@@ -109,4 +116,3 @@ netfs_S_file_get_translator (struct protid *user,
return err;
}
-