diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@redhat.com> | 2007-07-12 18:26:36 +0000 |
commit | 0ecb606cb6cf65de1d9fc8a919bceb4be476c602 (patch) | |
tree | 2ea1f8305970753e4a657acb2ccc15ca3eec8e2c /sysdeps/mach/hurd/xmknod.c | |
parent | 7d58530341304d403a6626d7f7a1913165fe2f32 (diff) | |
download | glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.zip glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.gz glibc-0ecb606cb6cf65de1d9fc8a919bceb4be476c602.tar.bz2 |
2.5-18.1
Diffstat (limited to 'sysdeps/mach/hurd/xmknod.c')
-rw-r--r-- | sysdeps/mach/hurd/xmknod.c | 86 |
1 files changed, 5 insertions, 81 deletions
diff --git a/sysdeps/mach/hurd/xmknod.c b/sysdeps/mach/hurd/xmknod.c index 2989215..5f40188 100644 --- a/sysdeps/mach/hurd/xmknod.c +++ b/sysdeps/mach/hurd/xmknod.c @@ -1,4 +1,5 @@ -/* Copyright (C) 1991,92,93,94,95,96,99,2002 Free Software Foundation, Inc. +/* Copyright (C) 1991,1992,1993,1994,1995,1996,1999,2002,2005,2006 + Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -17,13 +18,10 @@ 02111-1307 USA. */ #include <errno.h> -#include <sys/stat.h> -#include <hurd.h> -#include <hurd/paths.h> #include <fcntl.h> -#include "stdio-common/_itoa.h" -#include <string.h> +#include <stddef.h> #include <sys/types.h> +#include <sys/stat.h> /* Create a device file named FILE_NAME, with permission and special bits MODE @@ -32,80 +30,6 @@ int __xmknod (int vers, const char *file_name, mode_t mode, dev_t *dev) { - error_t err; - file_t dir, node; - char *name; - char buf[100], *bp; - const char *translator; - size_t len; - - if (vers != _MKNOD_VER) - return __hurd_fail (EINVAL); - - if (S_ISCHR (mode)) - { - translator = _HURD_CHRDEV; - len = sizeof (_HURD_CHRDEV); - } - else if (S_ISBLK (mode)) - { - translator = _HURD_BLKDEV; - len = sizeof (_HURD_BLKDEV); - } - else if (S_ISFIFO (mode)) - { - translator = _HURD_FIFO; - len = sizeof (_HURD_FIFO); - } - else - { - errno = EINVAL; - return -1; - } - - if (! S_ISFIFO (mode)) - { - /* We set the translator to "ifmt\0major\0minor\0", where IFMT - depends on the S_IFMT bits of our MODE argument, and MAJOR and - MINOR are ASCII decimal (octal or hex would do as well) - representations of our arguments. Thus the convention is that - CHRDEV and BLKDEV translators are invoked with two non-switch - arguments, giving the major and minor device numbers in %i format. */ - - bp = buf + sizeof (buf); - *--bp = '\0'; - bp = _itoa (minor (*dev), bp, 10, 0); - *--bp = '\0'; - bp = _itoa (major (*dev), bp, 10, 0); - memcpy (bp - len, translator, len); - translator = bp - len; - len = buf + sizeof (buf) - translator; - } - - dir = __file_name_split (file_name, &name); - if (dir == MACH_PORT_NULL) - return -1; - - /* Create a new, unlinked node in the target directory. */ - err = __dir_mkfile (dir, O_WRITE, (mode & ~S_IFMT) & ~_hurd_umask, &node); - - if (! err) - /* Set the node's translator to make it a device. */ - err = __file_set_translator (node, - FS_TRANS_EXCL | FS_TRANS_SET, - FS_TRANS_EXCL | FS_TRANS_SET, 0, - translator, len, - MACH_PORT_NULL, MACH_MSG_TYPE_COPY_SEND); - - if (! err) - /* Link the node, now a valid device, into the target directory. */ - err = __dir_link (dir, node, name, 1); - - __mach_port_deallocate (__mach_task_self (), dir); - __mach_port_deallocate (__mach_task_self (), node); - - if (err) - return __hurd_fail (err); - return 0; + return __xmknodat (vers, AT_FDCWD, file_name, mode, dev); } libc_hidden_def (__xmknod) |