Commit ad467730 by Neil Vachharajani Committed by Neil Vachharajani

gcov-io.c (gcov_open): Open files read-only when MODE < 0

2009-10-02  Neil Vachharajani  <nvachhar@google.com>

       * gcov-io.c (gcov_open): Open files read-only when MODE < 0

From-SVN: r152419
parent 5004b234
2009-10-02 Neil Vachharajani <nvachhar@google.com>
* gcov-io.c (gcov_open): Open files read-only when MODE < 0
2009-10-02 Uros Bizjak <ubizjak@gmail.com> 2009-10-02 Uros Bizjak <ubizjak@gmail.com>
* config/i386/i386.md (divmod<mode>4) Macroize expander from * config/i386/i386.md (divmod<mode>4) Macroize expander from
...@@ -46,11 +46,13 @@ static inline gcov_unsigned_t from_file (gcov_unsigned_t value) ...@@ -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 /* 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 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 MODE is >= 0 an existing file will be opened, if
opened, if possible, and if MODE is <= 0, a new file will be possible, and if MODE is <= 0, a new file will be created. Use
created. Use MODE=0 to attempt to reopen an existing file and then MODE=0 to attempt to reopen an existing file and then fall back on
fall back on creating a new one. Return zero on failure, >0 on creating a new one. If MODE < 0, the file will be opened in
opening an existing file and <0 on creating a new one. */ 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 GCOV_LINKAGE int
#if IN_LIBGCOV #if IN_LIBGCOV
...@@ -66,7 +68,6 @@ gcov_open (const char *name, int mode) ...@@ -66,7 +68,6 @@ gcov_open (const char *name, int mode)
struct flock s_flock; struct flock s_flock;
int fd; int fd;
s_flock.l_type = F_WRLCK;
s_flock.l_whence = SEEK_SET; s_flock.l_whence = SEEK_SET;
s_flock.l_start = 0; s_flock.l_start = 0;
s_flock.l_len = 0; /* Until EOF. */ s_flock.l_len = 0; /* Until EOF. */
...@@ -83,16 +84,25 @@ gcov_open (const char *name, int mode) ...@@ -83,16 +84,25 @@ gcov_open (const char *name, int mode)
#endif #endif
#if GCOV_LOCKED #if GCOV_LOCKED
if (mode > 0) 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 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) if (fd < 0)
return 0; return 0;
while (fcntl (fd, F_SETLKW, &s_flock) && errno == EINTR) while (fcntl (fd, F_SETLKW, &s_flock) && errno == EINTR)
continue; continue;
gcov_var.file = fdopen (fd, "r+b"); gcov_var.file = fdopen (fd, (mode > 0) ? "rb" : "r+b");
if (!gcov_var.file) if (!gcov_var.file)
{ {
close (fd); close (fd);
...@@ -120,7 +130,8 @@ gcov_open (const char *name, int mode) ...@@ -120,7 +130,8 @@ gcov_open (const char *name, int mode)
gcov_var.mode = mode * 2 + 1; gcov_var.mode = mode * 2 + 1;
#else #else
if (mode >= 0) if (mode >= 0)
gcov_var.file = fopen (name, "r+b"); gcov_var.file = fopen (name, (mode > 0) ? "rb" : "r+b");
if (gcov_var.file) if (gcov_var.file)
gcov_var.mode = 1; gcov_var.mode = 1;
else if (mode <= 0) else if (mode <= 0)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment