static int fstat_file(struct file_context *fc, struct stat *st) { if (fc->is_nfs == 0) { return fstat(fc->fd, st); } else { int res; struct nfs_stat_64 nfs_st; res = nfs_fstat64(fc->nfs, fc->nfsfh, &nfs_st); st->st_dev = nfs_st.nfs_dev; st->st_ino = nfs_st.nfs_ino; st->st_mode = nfs_st.nfs_mode; st->st_nlink = nfs_st.nfs_nlink; st->st_uid = nfs_st.nfs_uid; st->st_gid = nfs_st.nfs_gid; st->st_rdev = nfs_st.nfs_rdev; st->st_size = nfs_st.nfs_size; st->st_blksize = nfs_st.nfs_blksize; st->st_blocks = nfs_st.nfs_blocks; st->st_atim.tv_sec = nfs_st.nfs_atime; st->st_mtim.tv_sec = nfs_st.nfs_mtime; st->st_ctim.tv_sec = nfs_st.nfs_ctime; return res; } }
static int fstat_file(struct file_context *fc, struct stat *st) { if (fc->is_nfs == 0) { return fstat(fc->fd, st); } else { int res; struct nfs_stat_64 nfs_st; res = nfs_fstat64(fc->nfs, fc->nfsfh, &nfs_st); st->st_dev = (dev_t)nfs_st.nfs_dev; st->st_ino = (ino_t)nfs_st.nfs_ino; #ifndef WIN32 st->st_mode = (mode_t)nfs_st.nfs_mode; st->st_nlink = (nlink_t)nfs_st.nfs_nlink; st->st_blksize = nfs_st.nfs_blksize; st->st_blocks = nfs_st.nfs_blocks; #endif st->st_uid = (uid_t)nfs_st.nfs_uid; st->st_gid = (gid_t)nfs_st.nfs_gid; st->st_rdev = (dev_t)nfs_st.nfs_rdev; st->st_size = (off_t)nfs_st.nfs_size; st->st_atime = nfs_st.nfs_atime; st->st_mtime = nfs_st.nfs_mtime; st->st_ctime = nfs_st.nfs_ctime; return res; } }
int main(int argc, char *argv[]) { int ret; struct file_context *nf; struct nfs_stat_64 st; uint64_t off; int64_t count; #ifdef WIN32 if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { printf("Failed to start Winsock2\n"); return 10; } #endif #ifdef AROS aros_init_socket(); #endif if (argc < 2) { usage(); } nf = open_file(argv[1], O_RDONLY); if (nf == NULL) { fprintf(stderr, "Failed to open %s\n", argv[1]); exit(10); } if (nfs_fstat64(nf->nfs, nf->nfsfh, &st) < 0) { fprintf(stderr, "Failed to stat %s\n", argv[1]); exit(10); } off = 0; while (off < st.nfs_size) { count = st.nfs_size - off; if (count > BUFSIZE) { count = BUFSIZE; } count = nfs_pread(nf->nfs, nf->nfsfh, off, count, buf); if (count < 0) { fprintf(stderr, "Failed to read from file\n"); free_file_context(nf); return 10; } fwrite(buf, count, 1, stdout); off += count; } free_file_context(nf); return 0; }