annotate lib/mknod.c @ 17476:6057744acd2c default tip master

autoupdate
author Karl Berry <karl@freefriends.org>
date Fri, 16 Aug 2013 06:32:22 -0700 (2013-08-16)
parents e542fd46ad6f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12267
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
1 /* Create a device inode.
17249
e542fd46ad6f maint: update all copyright year number ranges
Eric Blake <eblake@redhat.com>
parents: 16201
diff changeset
2 Copyright (C) 2009-2013 Free Software Foundation, Inc.
12267
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
3
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
4 This program is free software: you can redistribute it and/or modify
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
5 it under the terms of the GNU General Public License as published by
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
6 the Free Software Foundation; either version 3 of the License, or
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
7 (at your option) any later version.
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
8
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
12 GNU General Public License for more details.
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
13
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
14 You should have received a copy of the GNU General Public License
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
15 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
16
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
17 /* written by Eric Blake */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
18
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
19 #include <config.h>
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
20
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
21 #include <sys/stat.h>
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
22
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
23 #include <errno.h>
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
24 #include <string.h>
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
25
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
26 #if !HAVE_MKNOD
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
27 /* Mingw lacks mknod; always fail with ENOSYS. */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
28
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
29 int
12482
11bc92a9e2bc gnulib-common: prefer _GL_UNUSED over _UNUSED_PARAMETER_
Eric Blake <ebb9@byu.net>
parents: 12267
diff changeset
30 mknod (char const *name _GL_UNUSED, mode_t mode _GL_UNUSED,
11bc92a9e2bc gnulib-common: prefer _GL_UNUSED over _UNUSED_PARAMETER_
Eric Blake <ebb9@byu.net>
parents: 12267
diff changeset
31 dev_t dev _GL_UNUSED)
12267
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
32 {
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
33 errno = ENOSYS;
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
34 return -1;
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
35 }
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
36
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
37 #else /* HAVE_MKNOD */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
38
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
39 # undef mknod
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
40
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
41 /* Create a file system node FILE, with access permissions and file
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
42 type in MODE, and device type in DEV. Usually, non-root
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
43 applications can only create named fifos (mode includes S_IFIFO),
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
44 with DEV set to 0. Also work around trailing slash bugs. */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
45
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
46 int
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
47 rpl_mknod (char const *name, mode_t mode, dev_t dev)
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
48 {
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
49 # if MKFIFO_TRAILING_SLASH_BUG
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
50 /* Trailing slash only makes sense for directories. Of course,
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
51 using mknod to create a directory is not very portable, so it may
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
52 still fail later on. */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
53 if (!S_ISDIR (mode))
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
54 {
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
55 size_t len = strlen (name);
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
56 if (len && name[len - 1] == '/')
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
57 {
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
58 struct stat st;
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
59 if (stat (name, &st) == 0)
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
60 errno = EEXIST;
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
61 return -1;
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
62 }
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
63 }
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
64 # endif
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
65 # if MKNOD_FIFO_BUG
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
66 /* POSIX requires mknod to create fifos for non-privileged
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
67 processes, but BSD implementations fail with EPERM. */
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
68 if (S_ISFIFO (mode) && dev == 0)
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
69 return mkfifo (name, mode & ~S_IFIFO);
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
70 # endif
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
71 return mknod (name, mode, dev);
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
72 }
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
73
c400da5f66bb mknod: new module
Eric Blake <ebb9@byu.net>
parents:
diff changeset
74 #endif /* HAVE_MKNOD */