1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #include <hurd.h>
21: #include <hurd/lookup.h>
22: #include <hurd/fd.h>
23: #include <string.h>
24: #include <fcntl.h>
25:
26: file_t
27: __file_name_lookup_at (int fd, int at_flags,
28: const char *file_name, int flags, mode_t mode)
29: {
30: error_t err;
31: file_t result;
32:
33: flags |= (at_flags & AT_SYMLINK_NOFOLLOW) ? O_NOLINK : 0;
34: at_flags &= ~AT_SYMLINK_NOFOLLOW;
35: if (at_flags != 0)
36: return __hurd_fail (EINVAL);
37:
38: if (fd == AT_FDCWD || file_name[0] == '/')
39: return __file_name_lookup (file_name, flags, mode);
40:
41: file_t startdir;
42: error_t use_init_port (int which, error_t (*operate) (mach_port_t))
43: {
44: return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
45: _hurd_ports_use (which, operate));
46: }
47:
48: err = HURD_DPORT_USE (fd, (startdir = port,
49: __hurd_file_name_lookup (&use_init_port,
50: &__getdport, NULL,
51: file_name,
52: flags,
53: mode & ~_hurd_umask,
54: &result)));
55:
56: return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
57: }
58:
59: file_t
60: __file_name_split_at (int fd, const char *file_name, char **name)
61: {
62: error_t err;
63: file_t result;
64:
65: if (fd == AT_FDCWD || file_name[0] == '/')
66: return __file_name_split (file_name, name);
67:
68: err = __hurd_file_name_split (&_hurd_ports_use, &__getdport, 0,
69: file_name, &result, name);
70:
71: file_t startdir;
72: error_t use_init_port (int which, error_t (*operate) (mach_port_t))
73: {
74: return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
75: _hurd_ports_use (which, operate));
76: }
77:
78: err = HURD_DPORT_USE (fd, (startdir = port,
79: __hurd_file_name_split (&use_init_port,
80: &__getdport, 0,
81: file_name,
82: &result, name)));
83:
84: return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
85: }
86:
87: file_t
88: __directory_name_split_at (int fd, const char *directory_name, char **name)
89: {
90: error_t err;
91: file_t result;
92:
93: if (fd == AT_FDCWD || directory_name[0] == '/')
94: return __directory_name_split (directory_name, name);
95:
96: file_t startdir;
97: error_t use_init_port (int which, error_t (*operate) (mach_port_t))
98: {
99: return (which == INIT_PORT_CWDIR ? (*operate) (startdir) :
100: _hurd_ports_use (which, operate));
101: }
102:
103: err = HURD_DPORT_USE (fd, (startdir = port,
104: __hurd_directory_name_split (&use_init_port,
105: &__getdport, 0,
106: directory_name,
107: &result, name)));
108:
109: return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
110: }