diff options
author | nvachhar <nvachhar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-02 20:21:43 +0000 |
---|---|---|
committer | nvachhar <nvachhar@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-10-02 20:21:43 +0000 |
commit | 35ab2622cf40d5762b0fb450ef0bc2daeaf1a58e (patch) | |
tree | 4c3eae413ad3771ef681630614a5c1d96393a415 /gcc/gcov-io.c | |
parent | f613feb7160e43eccf32d70587ec41d56a8f8946 (diff) | |
download | gcc-35ab2622cf40d5762b0fb450ef0bc2daeaf1a58e.tar.gz |
2009-10-02 Neil Vachharajani <nvachhar@google.com>
* gcov-io.c (gcov_open): Open files read-only when MODE < 0
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@152419 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gcov-io.c')
-rw-r--r-- | gcc/gcov-io.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/gcc/gcov-io.c b/gcc/gcov-io.c index 98a9287debd..d736cf853d4 100644 --- a/gcc/gcov-io.c +++ b/gcc/gcov-io.c @@ -46,11 +46,13 @@ static inline gcov_unsigned_t from_file (gcov_unsigned_t value) /* Open a gcov file. NAME is the name of the file to open and MODE indicates whether a new file should be created, or an existing file - opened for modification. If MODE is >= 0 an existing file will be - opened, if possible, and if MODE is <= 0, a new file will be - created. Use MODE=0 to attempt to reopen an existing file and then - fall back on creating a new one. Return zero on failure, >0 on - opening an existing file and <0 on creating a new one. */ + opened. If MODE is >= 0 an existing file will be opened, if + possible, and if MODE is <= 0, a new file will be created. Use + MODE=0 to attempt to reopen an existing file and then fall back on + creating a new one. If MODE < 0, the file will be opened in + read-only mode. Otherwise it will be opened for modification. + Return zero on failure, >0 on opening an existing file and <0 on + creating a new one. */ GCOV_LINKAGE int #if IN_LIBGCOV @@ -66,7 +68,6 @@ gcov_open (const char *name, int mode) struct flock s_flock; int fd; - s_flock.l_type = F_WRLCK; s_flock.l_whence = SEEK_SET; s_flock.l_start = 0; s_flock.l_len = 0; /* Until EOF. */ @@ -83,16 +84,25 @@ gcov_open (const char *name, int mode) #endif #if GCOV_LOCKED if (mode > 0) - fd = open (name, O_RDWR); + { + /* Read-only mode - acquire a read-lock. */ + s_flock.l_type = F_RDLCK; + fd = open (name, O_RDONLY); + } else - fd = open (name, O_RDWR | O_CREAT, 0666); + { + /* Write mode - acquire a write-lock. */ + s_flock.l_type = F_WRLCK; + fd = open (name, O_RDWR | O_CREAT, 0666); + } if (fd < 0) return 0; while (fcntl (fd, F_SETLKW, &s_flock) && errno == EINTR) continue; - gcov_var.file = fdopen (fd, "r+b"); + gcov_var.file = fdopen (fd, (mode > 0) ? "rb" : "r+b"); + if (!gcov_var.file) { close (fd); @@ -120,7 +130,8 @@ gcov_open (const char *name, int mode) gcov_var.mode = mode * 2 + 1; #else if (mode >= 0) - gcov_var.file = fopen (name, "r+b"); + gcov_var.file = fopen (name, (mode > 0) ? "rb" : "r+b"); + if (gcov_var.file) gcov_var.mode = 1; else if (mode <= 0) |