diff --git a/src/xpdev/sopenfile.c b/src/xpdev/sopenfile.c index d2d70b86f4e75241e6a150b1c57b3072324daa88..71f1cf9e077ecfc0e9fc608f6a6b9f88cde8937b 100644 --- a/src/xpdev/sopenfile.c +++ b/src/xpdev/sopenfile.c @@ -1,20 +1,40 @@ #include "filewrap.h" +#include "threadwrap.h" #include <stdlib.h> #include <string.h> +int access_ = O_RDWR; + +void child(void* arg) +{ + char* path = (char*)arg; + + printf("Opening in child thread: "); + int fd = open(path, access_, DEFFILEMODE); + if(fd < 0) + perror(path); + else { + printf("Success\n"); + printf("close(%s) = %d\n", path, close(fd)); + } +} + int main(int argc, char** argv) { - int access = O_RDWR; char* share = "NWA"; bool try_all = true; bool loop = false; bool rm = false; + bool second = false; + bool thread = false; if(argc < 2) { - printf("usage: sopenfile [-r] [-l] <path/filename> [share-mode]\n"); + printf("usage: sopenfile [-opts] <path/filename> [share-mode]\n"); printf("\n"); printf("-r open file read-only instead of read/write\n"); printf("-c open file with create permissions\n"); + printf("-2 open and close a second descriptor\n"); + printf("-t open and close a second descriptor in a second thread\n"); printf("-R remove file after open\n"); printf("-l loop until failure\n"); printf("\n"); @@ -24,21 +44,21 @@ int main(int argc, char** argv) return EXIT_SUCCESS; } int argn = 1; - if(strcmp(argv[argn], "-r") == 0) { - access = O_RDONLY; - ++argn; - } - if(strcmp(argv[argn], "-c") == 0) { - access |= O_CREAT; - ++argv; - } - if(strcmp(argv[argn], "-R") == 0) { - rm = true; - ++argn; - } - if(strcmp(argv[argn], "-l") == 0) { - loop = true; - ++argn; + for(; argn < argc; ++argn) { + if(strcmp(argv[argn], "-r") == 0) + access_ = O_RDONLY; + else if(strcmp(argv[argn], "-c") == 0) + access_ |= O_CREAT; + else if(strcmp(argv[argn], "-2") == 0) + second = true; + else if(strcmp(argv[argn], "-t") == 0) + thread = true; + else if(strcmp(argv[argn], "-l") == 0) + loop = true; + else if(strcmp(argv[argn], "-R") == 0) + rm = true; + else + break; } const char* path = argv[argn++]; if(argc > argn) { @@ -65,11 +85,23 @@ int main(int argc, char** argv) return EXIT_FAILURE; } fprintf(stderr, "%s Deny-%c (share mode %x): ", path, toupper(share_flag), share_mode); - int file = sopen(path, access, share_mode, DEFFILEMODE); + int file = sopen(path, access_, share_mode, DEFFILEMODE); if(file < 0) fprintf(stderr, "Error %d (%s)\n", errno, strerror(errno)); else { printf("Success\n"); + if(second) { + printf("Opening second descriptor: "); + int fd2 = open(path, access_, DEFFILEMODE); + if(fd2 < 0) + fprintf(stderr, "Error %d (%s)\n", errno, strerror(errno)); + else { + printf("Success\n"); + printf("close(%s) = %d\n", path, close(fd2)); + } + } + if(thread) + _beginthread(child, 0, (void*)path); if(rm) printf("remove(%s) = %d\n", path, unlink(path)); if(!try_all) {