diff options
author | Eric Blake <ebb9@byu.net> | 2009-09-07 05:38:18 -0600 |
---|---|---|
committer | Eric Blake <ebb9@byu.net> | 2009-09-08 06:24:44 -0600 |
commit | f4aa44fff84819c50f1761342017c36605a8fe99 (patch) | |
tree | dbfc6b6d39695ffbce88a635295908efbd7f22b0 /lib/mkfifoat.c | |
parent | 909779fb1d18b409eae92eb09c2dcc563ce50181 (diff) | |
download | gnulib-f4aa44fff84819c50f1761342017c36605a8fe99.tar.gz |
mkfifoat: new module
* modules/mkfifoat: New file.
* lib/mkfifoat.c: Likewise.
* m4/mkfifoat.m4 (gl_FUNC_MKFIFOAT): Likewise.
* m4/sys_stat_h.m4 (gl_SYS_STAT_H_DEFAULTS): Add witnesses.
* modules/sys_stat (Makefile.am): Use them.
* lib/sys_stat.in.h (mkfifoat, mknodat): Declare them.
* MODULES.html.sh (File system functions): Mention module.
* doc/posix-functions/mkfifoat.texi (mkfifoat): Likewise.
* doc/posix-functions/mknodat.texi (mknodat): Likewise.
* modules/mkfifoat-tests: New test.
* tests/test-mkfifoat.c: Likewise.
Signed-off-by: Eric Blake <ebb9@byu.net>
Diffstat (limited to 'lib/mkfifoat.c')
-rw-r--r-- | lib/mkfifoat.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/mkfifoat.c b/lib/mkfifoat.c new file mode 100644 index 0000000000..a230b0048a --- /dev/null +++ b/lib/mkfifoat.c @@ -0,0 +1,101 @@ +/* Create a named fifo relative to an open directory. + Copyright (C) 2009 Free Software Foundation, Inc. + + This program 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 3 of the License, or + (at your option) any later version. + + This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ + +/* written by Eric Blake */ + +#include <config.h> + +#include <sys/stat.h> + +#include "dirname.h" /* solely for definition of IS_ABSOLUTE_FILE_NAME */ +#include "openat.h" +#include "openat-priv.h" +#include "save-cwd.h" + +#ifndef HAVE_MKFIFO +# define HAVE_MKFIFO 0 +#endif +#ifndef HAVE_MKNOD +# define HAVE_MKNOD 0 +#endif + +/* For now, all known systems either have both mkfifo and mknod, or + neither. If this is not true, we can implement the portable + aspects of one using the other (POSIX only requires mknod to create + fifos; all other uses of mknod are for root users and outside the + realm of POSIX). */ +#if HAVE_MKNOD != HAVE_MKFIFO +# error Please report this message and your system to bug-gnulib@gnu.org. +#endif + +#if !HAVE_MKFIFO +/* Mingw lacks mkfifo and mknod, so this wrapper is trivial. */ + +# include <errno.h> + +int +mkfifoat (int fd _UNUSED_PARAMETER_, char const *path _UNUSED_PARAMETER_, + mode_t mode _UNUSED_PARAMETER_) +{ + errno = ENOSYS; + return -1; +} + +int +mknodat (int fd _UNUSED_PARAMETER_, char const *path _UNUSED_PARAMETER_, + mode_t mode _UNUSED_PARAMETER_, dev_t dev _UNUSED_PARAMETER_) +{ + errno = ENOSYS; + return -1; +} + +#else /* HAVE_MKFIFO */ + +/* Create a named fifo FILE relative to directory FD, with access + permissions in MODE. If possible, do it without changing the + working directory. Otherwise, resort to using save_cwd/fchdir, + then mkfifo/restore_cwd. If either the save_cwd or the restore_cwd + fails, then give a diagnostic and exit nonzero. */ + +# define AT_FUNC_NAME mkfifoat +# define AT_FUNC_F1 mkfifo +# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode +# define AT_FUNC_POST_FILE_ARGS , mode +# include "at-func.c" +# undef AT_FUNC_NAME +# undef AT_FUNC_F1 +# undef AT_FUNC_POST_FILE_PARAM_DECLS +# undef AT_FUNC_POST_FILE_ARGS + +/* Create a file system node FILE relative to directory FD, with + access permissions and file type in MODE, and device type in DEV. + Usually, non-root applications can only create named fifos, with + DEV set to 0. If possible, create the node without changing the + working directory. Otherwise, resort to using save_cwd/fchdir, + then mknod/restore_cwd. If either the save_cwd or the restore_cwd + fails, then give a diagnostic and exit nonzero. */ + +# define AT_FUNC_NAME mknodat +# define AT_FUNC_F1 mknod +# define AT_FUNC_POST_FILE_PARAM_DECLS , mode_t mode, dev_t dev +# define AT_FUNC_POST_FILE_ARGS , mode, dev +# include "at-func.c" +# undef AT_FUNC_NAME +# undef AT_FUNC_F1 +# undef AT_FUNC_POST_FILE_PARAM_DECLS +# undef AT_FUNC_POST_FILE_ARGS + +#endif /* HAVE_MKFIFO */ |