git_off_t git_futils_filesize(git_file fd) { struct stat sb; if (p_fstat(fd, &sb)) return GIT_ERROR; return sb.st_size; }
git_off_t git_futils_filesize(git_file fd) { struct stat sb; if (p_fstat(fd, &sb)) { giterr_set(GITERR_OS, "Failed to stat file descriptor"); return -1; } return sb.st_size; }
int git_futils_readbuffer_updated( git_buf *buf, const char *path, time_t *mtime, size_t *size, int *updated) { git_file fd; struct stat st; bool changed = false; assert(buf && path && *path); if (updated != NULL) *updated = 0; if ((fd = git_futils_open_ro(path)) < 0) return fd; if (p_fstat(fd, &st) < 0 || S_ISDIR(st.st_mode) || !git__is_sizet(st.st_size+1)) { p_close(fd); giterr_set(GITERR_OS, "Invalid regular file stat for '%s'", path); return -1; } /* * If we were given a time and/or a size, we only want to read the file * if it has been modified. */ if (size && *size != (size_t)st.st_size) changed = true; if (mtime && *mtime != st.st_mtime) changed = true; if (!size && !mtime) changed = true; if (!changed) { p_close(fd); return 0; } if (mtime != NULL) *mtime = st.st_mtime; if (size != NULL) *size = (size_t)st.st_size; if (git_futils_readbuffer_fd(buf, fd, (size_t)st.st_size) < 0) { p_close(fd); return -1; } p_close(fd); if (updated != NULL) *updated = 1; return 0; }
int git_futils_readbuffer_updated(git_buf *buf, const char *path, time_t *mtime, int *updated) { git_file fd; size_t len; struct stat st; assert(buf && path && *path); if (updated != NULL) *updated = 0; if ((fd = git_futils_open_ro(path)) < 0) return fd; if (p_fstat(fd, &st) < 0 || S_ISDIR(st.st_mode) || !git__is_sizet(st.st_size+1)) { p_close(fd); giterr_set(GITERR_OS, "Invalid regular file stat for '%s'", path); return -1; } /* * If we were given a time, we only want to read the file if it * has been modified. */ if (mtime != NULL && *mtime >= st.st_mtime) { p_close(fd); return 0; } if (mtime != NULL) *mtime = st.st_mtime; len = (size_t) st.st_size; git_buf_clear(buf); if (git_buf_grow(buf, len + 1) < 0) { p_close(fd); return -1; } buf->ptr[len] = '\0'; while (len > 0) { ssize_t read_size = p_read(fd, buf->ptr, len); if (read_size < 0) { p_close(fd); giterr_set(GITERR_OS, "Failed to read descriptor for '%s'", path); return -1; } len -= read_size; buf->size += read_size; } p_close(fd); if (updated != NULL) *updated = 1; return 0; }