summaryrefslogtreecommitdiff
path: root/gcc/gcov-io.c
diff options
context:
space:
mode:
authornvachhar <nvachhar@138bc75d-0d04-0410-961f-82ee72b054a4>2009-10-02 20:21:43 +0000
committernvachhar <nvachhar@138bc75d-0d04-0410-961f-82ee72b054a4>2009-10-02 20:21:43 +0000
commit35ab2622cf40d5762b0fb450ef0bc2daeaf1a58e (patch)
tree4c3eae413ad3771ef681630614a5c1d96393a415 /gcc/gcov-io.c
parentf613feb7160e43eccf32d70587ec41d56a8f8946 (diff)
downloadgcc-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.c31
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)