X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=examples%2Fnfsclient-sync.c;h=0985acdbf61c233e36f147d0b4d42a15b4b32b30;hb=2db42ce2fc89bc88050564037688888bbb8876e9;hp=a481652f01489c0fc05c91891bd10ef060efb504;hpb=dba24f1079c0814f2efde0f8394b0c180f868c3c;p=deb_libnfs.git diff --git a/examples/nfsclient-sync.c b/examples/nfsclient-sync.c index a481652..0985acd 100644 --- a/examples/nfsclient-sync.c +++ b/examples/nfsclient-sync.c @@ -15,30 +15,34 @@ along with this program; if not, see . */ +#define _FILE_OFFSET_BITS 64 +#define _GNU_SOURCE + /* Example program using the highlevel sync interface */ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#ifdef AROS +#include "aros_compat.h" +#endif + #ifdef WIN32 #include "win32_compat.h" +#pragma comment(lib, "ws2_32.lib") +WSADATA wsaData; +#define PRId64 "ll" #else -#include +#include +#include #include +#ifndef AROS #include #endif - -#define SERVER "10.1.1.27" -#define EXPORT "/VIRTUAL" -#define NFSFILE "/BOOKS/Classics/Dracula.djvu.truncated" -#define NFSFILER "/BOOKS/Classics/Dracula.djvu.renamed" -#define NFSFILEW "/BOOKS/Classics/foo" -#define NFSDIR "/BOOKS/Classics/" - -#define _GNU_SOURCE +#endif -#if defined(WIN32) -#pragma comment(lib, "ws2_32.lib") -WSADATA wsaData; -#else -#include +#ifdef HAVE_UNISTD_H #include #endif @@ -49,7 +53,6 @@ WSADATA wsaData; #include #include #include "libnfs.h" -#include /* for authunix_create() */ #include "libnfs-raw.h" #include "libnfs-raw-mount.h" @@ -63,11 +66,16 @@ struct client { char buf[3*1024*1024+337]; -int main(int argc _U_, char *argv[] _U_) +void print_usage(void) { - struct nfs_context *nfs; - int i, ret; - off_t offset; + fprintf(stderr, "Usage: nfsclient-sync [-?|--help] [--usage] \n"); +} + +int main(int argc, char *argv[]) +{ + struct nfs_context *nfs = NULL; + int i, ret, res; + uint64_t offset; struct client client; struct stat st; struct nfsfh *nfsfh; @@ -75,218 +83,150 @@ int main(int argc _U_, char *argv[] _U_) struct nfsdirent *nfsdirent; struct statvfs svfs; exports export, tmp; + const char *url = NULL; + char *server = NULL, *path = NULL, *strp; -#if defined(WIN32) +#ifdef WIN32 if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { printf("Failed to start Winsock2\n"); exit(10); } #endif - client.server = SERVER; - client.export = EXPORT; - client.is_finished = 0; - export = mount_getexports(SERVER); - if (export != NULL) { - printf("exports on server %s\n", SERVER); - tmp = export; - while (tmp != NULL) { - printf("Export: %s\n", tmp->ex_dir); - tmp = tmp->ex_next; - } - - mount_free_export_list(export); - } else { - printf("no exports on server %s\n", SERVER); - } - - nfs = nfs_init_context(); - if (nfs == NULL) { - printf("failed to init context\n"); - exit(10); - } - - ret = nfs_mount(nfs, client.server, client.export); - if (ret != 0) { - printf("Failed to mount nfs share : %s\n", nfs_get_error(nfs)); - exit(10); - } - printf("mounted share successfully %s\n", nfs_get_error(nfs)); +#ifdef AROS + aros_init_socket(); +#endif + url = argv[1]; - ret = nfs_stat(nfs, NFSFILE, &st); - if (ret != 0) { - printf("Failed to stat(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); + if (url == NULL) { + fprintf(stderr, "No URL specified.\n"); + print_usage(); + exit(0); } - printf("Mode %04o\n", st.st_mode); - printf("Size %d\n", (int)st.st_size); - printf("Inode %04o\n", (int)st.st_ino); - ret = nfs_open(nfs, NFSFILE, O_RDONLY, &nfsfh); - if (ret != 0) { - printf("Failed to open(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); + if (strncmp(url, "nfs://", 6)) { + fprintf(stderr, "Invalid URL specified.\n"); + print_usage(); + exit(0); } -#if 0 - ret = nfs_read(nfs, nfsfh, 16, buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); - } - printf("read %d bytes\n", ret); - for (i=0;i<16;i++) { - printf("%02x ", buf[i]&0xff); - } - printf("\n"); -#endif - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); + server = strdup(url + 6); + if (server == NULL) { + fprintf(stderr, "Failed to strdup server string\n"); exit(10); } - printf("read %d bytes\n", ret); - for (i=0;i<16;i++) { - printf("%02x ", buf[i]&0xff); - } - printf("\n"); - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); - } - printf("read %d bytes\n", ret); - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); + if (server[0] == '/' || server[0] == '\0') { + fprintf(stderr, "Invalid server string.\n"); + free(server); exit(10); } - printf("read %d bytes\n", ret); - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); + strp = strchr(server, '/'); + if (strp == NULL) { + fprintf(stderr, "Invalid URL specified.\n"); + print_usage(); + free(server); + exit(0); } - printf("read %d bytes\n", ret); - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); + path = strdup(strp); + if (path == NULL) { + fprintf(stderr, "Failed to strdup server string\n"); + free(server); exit(10); } - printf("read %d bytes\n", ret); - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Failed to pread(%s) %s\n", NFSFILE, nfs_get_error(nfs)); + if (path[0] != '/') { + fprintf(stderr, "Invalid path.\n"); + free(server); + free(path); exit(10); } - printf("read %d bytes\n", ret); + *strp = 0; + + client.server = server; + client.export = path; + client.is_finished = 0; - ret = (int)nfs_lseek(nfs, nfsfh, 0, SEEK_CUR, &offset); - if (ret < 0) { - printf("Failed to lseek(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); - } - printf("File position is %d\n", (int)offset); - printf("seek to end of file\n"); - ret = (int)nfs_lseek(nfs, nfsfh, 0, SEEK_END, &offset); - if (ret < 0) { - printf("Failed to lseek(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); + nfs = nfs_init_context(); + if (nfs == NULL) { + printf("failed to init context\n"); + goto finished; } - printf("File position is %d\n", (int)offset); - ret = nfs_fstat(nfs, nfsfh, &st); + ret = nfs_mount(nfs, client.server, client.export); if (ret != 0) { - printf("Failed to stat(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); + printf("Failed to mount nfs share : %s\n", nfs_get_error(nfs)); + goto finished; } - printf("Mode %04o\n", st.st_mode); - printf("Size %d\n", (int)st.st_size); - printf("Inode %04o\n", (int)st.st_ino); - - ret = nfs_close(nfs, nfsfh); - if (ret < 0) { - printf("Failed to close(%s): %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); - } - ret = nfs_opendir(nfs, NFSDIR, &nfsdir); + ret = nfs_opendir(nfs, "/", &nfsdir); if (ret != 0) { - printf("Failed to open(%s) %s\n", NFSFILE, nfs_get_error(nfs)); + printf("Failed to opendir(\"/\") %s\n", nfs_get_error(nfs)); exit(10); } while((nfsdirent = nfs_readdir(nfs, nfsdir)) != NULL) { - char filename[1024]; - printf("Inode:%d Name:%s ", (int)nfsdirent->inode, nfsdirent->name); - sprintf(filename, "%s/%s", NFSDIR, nfsdirent->name); - ret = nfs_open(nfs, filename, O_RDONLY, &nfsfh); - if (ret != 0) { - printf("Failed to open(%s) %s\n", filename, nfs_get_error(nfs)); - exit(10); + char path[1024]; + + if (!strcmp(nfsdirent->name, ".") || !strcmp(nfsdirent->name, "..")) { + continue; } - ret = nfs_read(nfs, nfsfh, sizeof(buf), buf); - if (ret < 0) { - printf("Error reading file\n"); + + sprintf(path, "%s/%s", "/", nfsdirent->name); + ret = nfs_stat(nfs, path, &st); + if (ret != 0) { + fprintf(stderr, "Failed to stat(%s) %s\n", path, nfs_get_error(nfs)); + continue; } - printf("Read %d bytes\n", ret); - ret = nfs_close(nfs, nfsfh); - if (ret < 0) { - printf("Failed to close(%s): %s\n", NFSFILE, nfs_get_error(nfs)); - exit(10); + + switch (st.st_mode & S_IFMT) { +#ifndef WIN32 + case S_IFLNK: +#endif + case S_IFREG: + printf("-"); + break; + case S_IFDIR: + printf("d"); + break; + case S_IFCHR: + printf("c"); + break; + case S_IFBLK: + printf("b"); + break; } + printf("%c%c%c", + "-r"[!!(st.st_mode & S_IRUSR)], + "-w"[!!(st.st_mode & S_IWUSR)], + "-x"[!!(st.st_mode & S_IXUSR)] + ); + printf("%c%c%c", + "-r"[!!(st.st_mode & S_IRGRP)], + "-w"[!!(st.st_mode & S_IWGRP)], + "-x"[!!(st.st_mode & S_IXGRP)] + ); + printf("%c%c%c", + "-r"[!!(st.st_mode & S_IROTH)], + "-w"[!!(st.st_mode & S_IWOTH)], + "-x"[!!(st.st_mode & S_IXOTH)] + ); + printf(" %2d", (int)st.st_nlink); + printf(" %5d", st.st_uid); + printf(" %5d", st.st_gid); + printf(" %12" PRId64, st.st_size); + + printf(" %s\n", nfsdirent->name); } nfs_closedir(nfs, nfsdir); - ret = nfs_open(nfs, NFSFILEW, O_WRONLY, &nfsfh); - if (ret != 0) { - printf("Failed to open(%s) %s\n", NFSFILEW, nfs_get_error(nfs)); - exit(10); - } - ret = nfs_pwrite(nfs, nfsfh, 0, 16, buf); - if (ret < 0) { - printf("Failed to pwrite(%s) %s\n", NFSFILEW, nfs_get_error(nfs)); - exit(10); - } - ret = nfs_fsync(nfs, nfsfh); - if (ret < 0) { - printf("Failed to fsync(%s) %s\n", NFSFILEW, nfs_get_error(nfs)); - exit(10); - } - ret = nfs_close(nfs, nfsfh); - if (ret < 0) { - printf("Failed to close(%s) %s\n", NFSFILEW, nfs_get_error(nfs)); - exit(10); - } - - - ret = nfs_statvfs(nfs, NFSDIR, &svfs); - if (ret < 0) { - printf("Failed to statvfs(%s) %s\n", NFSDIR, nfs_get_error(nfs)); - exit(10); - } - printf("files %d/%d/%d\n", (int)svfs.f_files, (int)svfs.f_ffree, (int)svfs.f_favail); - - - ret = nfs_access(nfs, NFSFILE, R_OK); - if (ret != 0) { - printf("Failed to access(%s) %s\n", NFSFILE, nfs_get_error(nfs)); +finished: + free(server); + free(path); + if (nfs != NULL) { + nfs_destroy_context(nfs); } - - /* become root */ - nfs_set_auth(nfs, authunix_create("Ronnies-Laptop", 0, 0, 0, NULL)); - - ret = nfs_link(nfs, NFSFILE, NFSFILER); - if (ret != 0) { - printf("Failed to link(%s) %s\n", NFSFILE, nfs_get_error(nfs)); - } - - - nfs_destroy_context(nfs); - printf("nfsclient finished\n"); return 0; }