1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21: #include <string.h>
22: #include <hurd.h>
23: #include <hurd/lookup.h>
24:
25:
26:
27:
28:
29:
30:
31:
32: error_t
33: file_name_path_scan (const char *file_name, const char *path,
34: error_t (*fun)(const char *name),
35: char **prefixed_name)
36: {
37: if (path == NULL || index (file_name, '/'))
38: {
39: if (prefixed_name)
40: *prefixed_name = 0;
41: return (*fun)(file_name);
42: }
43: else
44: {
45: error_t real_err = 0;
46: size_t file_name_len = strlen (file_name);
47:
48: for (;;)
49: {
50: error_t err;
51: const char *next = index (path, ':') ?: path + strlen (path);
52: size_t pfx_len = next - path;
53: char pfxed_name[pfx_len + 2 + file_name_len + 1];
54:
55: if (pfx_len == 0)
56: pfxed_name[pfx_len++] = '.';
57: else
58: memcpy (pfxed_name, path, pfx_len);
59: if (pfxed_name[pfx_len - 1] != '/')
60: pfxed_name[pfx_len++] = '/';
61: memcpy (pfxed_name + pfx_len, file_name, file_name_len + 1);
62:
63: err = (*fun)(pfxed_name);
64: if (err == 0)
65: {
66: if (prefixed_name)
67: *prefixed_name = strdup (pfxed_name);
68: return 0;
69: }
70: if (!real_err && err != ENOENT)
71: real_err = err;
72:
73: if (*next == '\0')
74: return real_err ?: ENOENT;
75: else
76: path = next + 1;
77: }
78: }
79: }
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90: error_t
91: hurd_file_name_path_lookup (error_t (*use_init_port)
92: (int which, error_t (*operate) (mach_port_t)),
93: file_t (*get_dtable_port) (int fd),
94: error_t (*lookup)
95: (file_t dir, char *name, int flags, mode_t mode,
96: retry_type *do_retry, string_t retry_name,
97: mach_port_t *result),
98: const char *file_name, const char *path,
99: int flags, mode_t mode,
100: file_t *result, char **prefixed_name)
101: {
102: error_t scan_lookup (const char *name)
103: {
104: return
105: __hurd_file_name_lookup (use_init_port, get_dtable_port, lookup,
106: name, flags, mode, result);
107: }
108: return file_name_path_scan (file_name, path, scan_lookup, prefixed_name);
109: }
110:
111: file_t
112: file_name_path_lookup (const char *file_name, const char *path,
113: int flags, mode_t mode, char **prefixed_name)
114: {
115: error_t err;
116: file_t result;
117:
118: err = hurd_file_name_path_lookup (&_hurd_ports_use, &__getdport, 0,
119: file_name, path, flags, mode,
120: &result, prefixed_name);
121:
122: return err ? (__hurd_fail (err), MACH_PORT_NULL) : result;
123: }