* Removed the O_* modes that we currently don't and probably won't support

(O_MOUNT, O_EXLOCK, and O_SHLOCK). I only left the non-standard O_TEMPORARY
  for the time being (as it shouldn't fool anyone).
* Fixed libutil that already used O_EXLOCK, even though it did not do anything.
* Moved O_NOCACHE, and O_NOFOLLOW to the section with implemented modes.
* Added O_DIRECTORY.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34278 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2009-11-26 14:17:46 +00:00
parent e49733cf63
commit aec945c959
4 changed files with 27 additions and 17 deletions

View File

@ -53,16 +53,14 @@
#define O_SYNC 0x00010000 /* write synchronized I/O file integrity */
#define O_RSYNC 0x00020000 /* read synchronized I/O file integrity */
#define O_DSYNC 0x00040000 /* write synchronized I/O data integrity */
#define O_NOFOLLOW 0x00080000 /* fail on symlinks */
#define O_NOCACHE 0x00100000 /* do not use the file system cache if */
/* possible */
#define O_DIRECT O_NOCACHE
#define O_DIRECTORY 0x00200000 /* fail if not a directory */
/* TODO: currently not implemented additions: */
#define O_NOFOLLOW 0x00080000
/* should we implement this? it's similar to O_NOTRAVERSE but will fail on symlinks */
#define O_NOCACHE 0x00100000 /* doesn't use the file system cache if possible */
#define O_DIRECT O_NOCACHE
#define O_MOUNT 0x00200000 /* for file systems */
#define O_TEMPORARY 0x00400000 /* used to avoid writing temporary files to disk */
#define O_SHLOCK 0x01000000 /* obtain shared lock */
#define O_EXLOCK 0x02000000 /* obtain exclusive lock */
#ifdef B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT
#define AT_FDCWD (-1) /* CWD FD for the *at() functions */

View File

@ -779,10 +779,8 @@
#define O_NOFOLLOW FSSH_O_NOFOLLOW
#define O_NOCACHE FSSH_O_NOCACHE
#define O_DIRECT FSSH_O_DIRECT
#define O_MOUNT FSSH_O_MOUNT
#define O_DIRECTORY FSSH_O_DIRECTORY
#define O_TEMPORARY FSSH_O_TEMPORARY
#define O_SHLOCK FSSH_O_SHLOCK
#define O_EXLOCK FSSH_O_EXLOCK
#define S_IREAD FSSH_S_IREAD
#define S_IWRITE FSSH_S_IWRITE

View File

@ -50,16 +50,15 @@
#define FSSH_O_SYNC 0x00010000 /* write synchronized I/O file integrity */
#define FSSH_O_RSYNC 0x00020000 /* read synchronized I/O file integrity */
#define FSSH_O_DSYNC 0x00040000 /* write synchronized I/O data integrity */
#define FSSH_O_NOFOLLOW 0x00080000 /* fail on symlinks */
#define FSSH_O_NOCACHE 0x00100000 /* do not use the file system cache if */
/* possible */
#define FSSH_O_DIRECT FSSH_O_NOCACHE
#define FSSH_O_DIRECTORY 0x00200000 /* fail if not a directory */
// TODO: currently not implemented additions:
#define FSSH_O_NOFOLLOW 0x00080000
/* should we implement this? it's similar to O_NOTRAVERSE but will fail on symlinks */
#define FSSH_O_NOCACHE 0x00100000 /* doesn't use the file system cache if possible */
#define FSSH_O_DIRECT FSSH_O_NOCACHE
#define FSSH_O_MOUNT 0x00200000 /* for file systems */
#define FSSH_O_TEMPORARY 0x00400000 /* used to avoid writing temporary files to disk */
#define FSSH_O_SHLOCK 0x01000000 /* obtain shared lock */
#define FSSH_O_EXLOCK 0x02000000 /* obtain exclusive lock */
#define FSSH_S_IREAD 0x0100 /* owner may read */
#define FSSH_S_IWRITE 0x0080 /* owner may write */

View File

@ -113,7 +113,21 @@ pidfile_open(const char *path, mode_t mode, pid_t *pidptr)
* pidfile_write() can be called multiple times.
*/
fd = open(pfh->pf_path,
O_WRONLY | O_CREAT | O_EXLOCK | O_TRUNC | O_NONBLOCK, mode);
O_WRONLY | O_CREAT | O_TRUNC | O_NONBLOCK, mode);
if (fd >= 0) {
struct flock lock;
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
if (fcntl(F_SETLK, &lock) == -1) {
close(fd);
fd = -1;
}
}
if (fd == -1) {
if (errno == EWOULDBLOCK && pidptr != NULL) {
errno = pidfile_read(pfh->pf_path, pidptr);
@ -123,6 +137,7 @@ pidfile_open(const char *path, mode_t mode, pid_t *pidptr)
free(pfh);
return (NULL);
}
/*
* Remember file information, so in pidfile_write() we are sure we write
* to the proper descriptor.