/* Create a named pipe (FIFO) named PATH with protections MODE. */ int mkfifo (const char *path, mode_t mode) { dev_t dev = 0; return __xmknod (_MKNOD_VER, path, mode | S_IFIFO, &dev); }
/* Create a device file named PATH relative to FD, with permission and special bits MODE and device number DEV (which can be constructed from major and minor device numbers with the `makedev' macro above). */ int __xmknodat (int vers, int fd, const char *file, mode_t mode, dev_t * dev) { if (vers != _MKNOD_VER) { __set_errno (EINVAL); return -1; } # ifndef __ASSUME_ATFCTS if (__have_atfcts >= 0) # endif { int result; /* The FreeBSD mknod() system call cannot be used to create FIFOs; we must use the mkfifo() system call for this purpose. */ if (S_ISFIFO (mode)) result = INLINE_SYSCALL (mkfifoat, 3, fd, file, mode); else result = INLINE_SYSCALL (mknodat, 4, fd, file, mode, *dev); # ifndef __ASSUME_ATFCTS if (result == -1 && errno == ENOSYS) __have_atfcts = -1; else # endif return result; } #ifndef __ASSUME_ATFCTS if (fd != AT_FDCWD && file[0] != '/') { int mib[4]; size_t kf_len = 0; char *kf_buf, *kf_bufp; size_t filelen; if (fd < 0) { __set_errno (EBADF); return -1; } filelen = strlen (file); if (__builtin_expect (filelen == 0, 0)) { __set_errno (ENOENT); return -1; } mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_FILEDESC; mib[3] = __getpid (); if (__sysctl (mib, 4, NULL, &kf_len, NULL, 0) != 0) { __set_errno (ENOSYS); return -1; } kf_buf = alloca (kf_len + filelen); if (__sysctl (mib, 4, kf_buf, &kf_len, NULL, 0) != 0) { __set_errno (ENOSYS); return -1; } kf_bufp = kf_buf; while (kf_bufp < kf_buf + kf_len) { struct kinfo_file *kf = (struct kinfo_file *) (uintptr_t) kf_bufp; if (kf->kf_fd == fd) { if (kf->kf_type != KF_TYPE_VNODE || kf->kf_vnode_type != KF_VTYPE_VDIR) { __set_errno (ENOTDIR); return -1; } strcat (kf->kf_path, "/"); strcat (kf->kf_path, file); file = kf->kf_path; break; } kf_bufp += kf->kf_structsize; } if (kf_bufp >= kf_buf + kf_len) { __set_errno (EBADF); return -1; } } return __xmknod (vers, file, mode, dev); #endif }
int __mknod (const char *path, mode_t mode, dev_t dev) { return __xmknod (_MKNOD_VER, path, mode, &dev); }
int attribute_hidden __mknod (const char *path, mode_t mode, dev_t dev) { return __xmknod (_MKNOD_VER, path, mode, &dev); }