diff options
Diffstat (limited to 'gdb/common/filestuff.c')
-rw-r--r-- | gdb/common/filestuff.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c index f5a754f..fa10165 100644 --- a/gdb/common/filestuff.c +++ b/gdb/common/filestuff.c @@ -417,3 +417,34 @@ make_cleanup_close (int fd) *saved_fd = fd; return make_cleanup_dtor (do_close_cleanup, saved_fd, xfree); } + +/* See common/filestuff.h. */ + +bool +is_regular_file (const char *name, int *errno_ptr) +{ + struct stat st; + const int status = stat (name, &st); + + /* Stat should never fail except when the file does not exist. + If stat fails, analyze the source of error and return true + unless the file does not exist, to avoid returning false results + on obscure systems where stat does not work as expected. */ + + if (status != 0) + { + if (errno != ENOENT) + return true; + *errno_ptr = ENOENT; + return false; + } + + if (S_ISREG (st.st_mode)) + return true; + + if (S_ISDIR (st.st_mode)) + *errno_ptr = EISDIR; + else + *errno_ptr = EINVAL; + return false; +} |