diff options
Diffstat (limited to 'libnetfs/file-get-translator.c')
-rw-r--r-- | libnetfs/file-get-translator.c | 50 |
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; } - |