1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20: #define CALL_FUNC(F) \
21: (AT_FUNC_USE_F1_COND \
22: ? AT_FUNC_F1 (F AT_FUNC_POST_FILE_ARGS) \
23: : AT_FUNC_F2 (F AT_FUNC_POST_FILE_ARGS))
24:
25:
26:
27:
28:
29:
30:
31: int
32: AT_FUNC_NAME (int fd, char const *file AT_FUNC_POST_FILE_PARAM_DECLS)
33: {
34: struct saved_cwd saved_cwd;
35: int saved_errno;
36: int err;
37:
38: if (fd == AT_FDCWD || IS_ABSOLUTE_FILE_NAME (file))
39: return CALL_FUNC (file);
40:
41: {
42: char buf[OPENAT_BUFFER_SIZE];
43: char *proc_file = openat_proc_name (buf, fd, file);
44: if (proc_file)
45: {
46: int proc_result = CALL_FUNC (proc_file);
47: int proc_errno = errno;
48: if (proc_file != buf)
49: free (proc_file);
50:
51:
52:
53: if (0 <= proc_result)
54: return proc_result;
55: if (! EXPECTED_ERRNO (proc_errno))
56: {
57: errno = proc_errno;
58: return proc_result;
59: }
60: }
61: }
62:
63: if (save_cwd (&saved_cwd) != 0)
64: openat_save_fail (errno);
65:
66: if (fchdir (fd) != 0)
67: {
68: saved_errno = errno;
69: free_cwd (&saved_cwd);
70: errno = saved_errno;
71: return -1;
72: }
73:
74: err = CALL_FUNC (file);
75: saved_errno = (err < 0 ? errno : 0);
76:
77: if (restore_cwd (&saved_cwd) != 0)
78: openat_restore_fail (errno);
79:
80: free_cwd (&saved_cwd);
81:
82: if (saved_errno)
83: errno = saved_errno;
84: return err;
85: }
86: #undef CALL_FUNC