1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * fd.h |
4 | * Virtual file descriptor definitions. |
5 | * |
6 | * |
7 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
8 | * Portions Copyright (c) 1994, Regents of the University of California |
9 | * |
10 | * src/include/storage/fd.h |
11 | * |
12 | *------------------------------------------------------------------------- |
13 | */ |
14 | |
15 | /* |
16 | * calls: |
17 | * |
18 | * File {Close, Read, Write, Size, Sync} |
19 | * {Path Name Open, Allocate, Free} File |
20 | * |
21 | * These are NOT JUST RENAMINGS OF THE UNIX ROUTINES. |
22 | * Use them for all file activity... |
23 | * |
24 | * File fd; |
25 | * fd = PathNameOpenFile("foo", O_RDONLY); |
26 | * |
27 | * AllocateFile(); |
28 | * FreeFile(); |
29 | * |
30 | * Use AllocateFile, not fopen, if you need a stdio file (FILE*); then |
31 | * use FreeFile, not fclose, to close it. AVOID using stdio for files |
32 | * that you intend to hold open for any length of time, since there is |
33 | * no way for them to share kernel file descriptors with other files. |
34 | * |
35 | * Likewise, use AllocateDir/FreeDir, not opendir/closedir, to allocate |
36 | * open directories (DIR*), and OpenTransientFile/CloseTransientFile for an |
37 | * unbuffered file descriptor. |
38 | */ |
39 | #ifndef FD_H |
40 | #define FD_H |
41 | |
42 | #include <dirent.h> |
43 | |
44 | |
45 | typedef int File; |
46 | |
47 | |
48 | /* GUC parameter */ |
49 | extern PGDLLIMPORT int max_files_per_process; |
50 | extern PGDLLIMPORT bool data_sync_retry; |
51 | |
52 | /* |
53 | * This is private to fd.c, but exported for save/restore_backend_variables() |
54 | */ |
55 | extern int max_safe_fds; |
56 | |
57 | /* |
58 | * On Windows, we have to interpret EACCES as possibly meaning the same as |
59 | * ENOENT, because if a file is unlinked-but-not-yet-gone on that platform, |
60 | * that's what you get. Ugh. This code is designed so that we don't |
61 | * actually believe these cases are okay without further evidence (namely, |
62 | * a pending fsync request getting canceled ... see ProcessSyncRequests). |
63 | */ |
64 | #ifndef WIN32 |
65 | #define FILE_POSSIBLY_DELETED(err) ((err) == ENOENT) |
66 | #else |
67 | #define FILE_POSSIBLY_DELETED(err) ((err) == ENOENT || (err) == EACCES) |
68 | #endif |
69 | |
70 | /* |
71 | * prototypes for functions in fd.c |
72 | */ |
73 | |
74 | /* Operations on virtual Files --- equivalent to Unix kernel file ops */ |
75 | extern File PathNameOpenFile(const char *fileName, int fileFlags); |
76 | extern File PathNameOpenFilePerm(const char *fileName, int fileFlags, mode_t fileMode); |
77 | extern File OpenTemporaryFile(bool interXact); |
78 | extern void FileClose(File file); |
79 | extern int FilePrefetch(File file, off_t offset, int amount, uint32 wait_event_info); |
80 | extern int FileRead(File file, char *buffer, int amount, off_t offset, uint32 wait_event_info); |
81 | extern int FileWrite(File file, char *buffer, int amount, off_t offset, uint32 wait_event_info); |
82 | extern int FileSync(File file, uint32 wait_event_info); |
83 | extern off_t FileSize(File file); |
84 | extern int FileTruncate(File file, off_t offset, uint32 wait_event_info); |
85 | extern void FileWriteback(File file, off_t offset, off_t nbytes, uint32 wait_event_info); |
86 | extern char *FilePathName(File file); |
87 | extern int FileGetRawDesc(File file); |
88 | extern int FileGetRawFlags(File file); |
89 | extern mode_t FileGetRawMode(File file); |
90 | |
91 | /* Operations used for sharing named temporary files */ |
92 | extern File PathNameCreateTemporaryFile(const char *name, bool error_on_failure); |
93 | extern File PathNameOpenTemporaryFile(const char *name); |
94 | extern bool PathNameDeleteTemporaryFile(const char *name, bool error_on_failure); |
95 | extern void PathNameCreateTemporaryDir(const char *base, const char *name); |
96 | extern void PathNameDeleteTemporaryDir(const char *name); |
97 | extern void TempTablespacePath(char *path, Oid tablespace); |
98 | |
99 | /* Operations that allow use of regular stdio --- USE WITH CAUTION */ |
100 | extern FILE *AllocateFile(const char *name, const char *mode); |
101 | extern int FreeFile(FILE *file); |
102 | |
103 | /* Operations that allow use of pipe streams (popen/pclose) */ |
104 | extern FILE *OpenPipeStream(const char *command, const char *mode); |
105 | extern int ClosePipeStream(FILE *file); |
106 | |
107 | /* Operations to allow use of the <dirent.h> library routines */ |
108 | extern DIR *AllocateDir(const char *dirname); |
109 | extern struct dirent *ReadDir(DIR *dir, const char *dirname); |
110 | extern struct dirent *ReadDirExtended(DIR *dir, const char *dirname, |
111 | int elevel); |
112 | extern int FreeDir(DIR *dir); |
113 | |
114 | /* Operations to allow use of a plain kernel FD, with automatic cleanup */ |
115 | extern int OpenTransientFile(const char *fileName, int fileFlags); |
116 | extern int OpenTransientFilePerm(const char *fileName, int fileFlags, mode_t fileMode); |
117 | extern int CloseTransientFile(int fd); |
118 | |
119 | /* If you've really really gotta have a plain kernel FD, use this */ |
120 | extern int BasicOpenFile(const char *fileName, int fileFlags); |
121 | extern int BasicOpenFilePerm(const char *fileName, int fileFlags, mode_t fileMode); |
122 | |
123 | /* Make a directory with default permissions */ |
124 | extern int MakePGDirectory(const char *directoryName); |
125 | |
126 | /* Miscellaneous support routines */ |
127 | extern void InitFileAccess(void); |
128 | extern void set_max_safe_fds(void); |
129 | extern void closeAllVfds(void); |
130 | extern void SetTempTablespaces(Oid *tableSpaces, int numSpaces); |
131 | extern bool TempTablespacesAreSet(void); |
132 | extern int GetTempTablespaces(Oid *tableSpaces, int numSpaces); |
133 | extern Oid GetNextTempTableSpace(void); |
134 | extern void AtEOXact_Files(bool isCommit); |
135 | extern void AtEOSubXact_Files(bool isCommit, SubTransactionId mySubid, |
136 | SubTransactionId parentSubid); |
137 | extern void RemovePgTempFiles(void); |
138 | extern bool looks_like_temp_rel_name(const char *name); |
139 | |
140 | extern int pg_fsync(int fd); |
141 | extern int pg_fsync_no_writethrough(int fd); |
142 | extern int pg_fsync_writethrough(int fd); |
143 | extern int pg_fdatasync(int fd); |
144 | extern void pg_flush_data(int fd, off_t offset, off_t amount); |
145 | extern void fsync_fname(const char *fname, bool isdir); |
146 | extern int durable_rename(const char *oldfile, const char *newfile, int loglevel); |
147 | extern int durable_unlink(const char *fname, int loglevel); |
148 | extern int durable_link_or_rename(const char *oldfile, const char *newfile, int loglevel); |
149 | extern void SyncDataDirectory(void); |
150 | extern int data_sync_elevel(int elevel); |
151 | |
152 | /* Filename components */ |
153 | #define PG_TEMP_FILES_DIR "pgsql_tmp" |
154 | #define PG_TEMP_FILE_PREFIX "pgsql_tmp" |
155 | |
156 | #endif /* FD_H */ |
157 | |