aboutsummaryrefslogtreecommitdiffstats
path: root/plpfuse
diff options
context:
space:
mode:
authorReuben Thomas <rrt@sc3d.org>2007-12-15 13:50:22 +0000
committerReuben Thomas <rrt@sc3d.org>2007-12-15 13:50:22 +0000
commit55218405178c6fd21b83b19f14d549f2fb602101 (patch)
tree6ae43c9d5a163537f71793874443e8f132af14e1 /plpfuse
parent305b4a4389af61749bae8d153532b09c1071b624 (diff)
downloadplptools-55218405178c6fd21b83b19f14d549f2fb602101.tar.gz
plptools-55218405178c6fd21b83b19f14d549f2fb602101.tar.bz2
plptools-55218405178c6fd21b83b19f14d549f2fb602101.zip
Sort out command-line arguments, so that both FUSE and plpfuse get to
parse them. Force FUSE to run single-threaded.
Diffstat (limited to 'plpfuse')
-rw-r--r--plpfuse/fuse.c8
-rw-r--r--plpfuse/main.cc98
2 files changed, 58 insertions, 48 deletions
diff --git a/plpfuse/fuse.c b/plpfuse/fuse.c
index 92720e2..f33863c 100644
--- a/plpfuse/fuse.c
+++ b/plpfuse/fuse.c
@@ -24,10 +24,8 @@
#include <errno.h>
#include <syslog.h>
-#include <fuse.h>
-#include "rfsv_api.h"
-
#include "plpfuse.h"
+#include "rfsv_api.h"
#define NO_PSION ENOMEDIUM
@@ -39,8 +37,8 @@ debuglog(char *fmt, ...)
va_list ap;
char *buf;
- //if (!debug)
- // return 0;
+ if (!debug)
+ return 0;
va_start(ap, fmt);
vasprintf(&buf, fmt, ap);
syslog(LOG_DEBUG, "%s", buf);
diff --git a/plpfuse/main.cc b/plpfuse/main.cc
index a6743b4..d61e9ee 100644
--- a/plpfuse/main.cc
+++ b/plpfuse/main.cc
@@ -49,6 +49,8 @@
#endif
#include <getopt.h>
+#include <fuse/fuse_lowlevel.h>
+
using namespace std;
static rfsv *a;
@@ -277,11 +279,6 @@ help()
) << DPORT << "\n\n";
}
-static void
-usage() {
- cerr << _("Try `plpfuse --help' for more information") << endl;
-}
-
static struct option opts[] = {
{"help", no_argument, 0, 'h'},
{"debug", no_argument, 0, 'd'},
@@ -320,12 +317,30 @@ parse_destination(const char *arg, const char **host, int *port)
*port = atoi(pp);
}
+int fuse(int argc, char *argv[])
+{
+ struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
+ struct fuse_chan *ch;
+ char *mountpoint;
+ int err = -1;
+
+ if (fuse_parse_cmdline(&args, &mountpoint, NULL, NULL) != -1 &&
+ (ch = fuse_mount(mountpoint, &args)) != NULL) {
+ struct fuse *fp = fuse_new(ch, &args, &plp_oper, sizeof(plp_oper), NULL);
+ if (fp != NULL)
+ err = fuse_loop(fp);
+ fuse_unmount(mountpoint, ch);
+ }
+ fuse_opt_free_args(&args);
+
+ return err ? 1 : 0;
+}
+
int main(int argc, char**argv) {
ppsocket *skt;
ppsocket *skt2;
const char *host = "127.0.0.1";
int sockNum = DPORT;
- int status = 0;
int i, c;
struct servent *se = getservbyname("psion", "tcp");
@@ -333,48 +348,45 @@ int main(int argc, char**argv) {
if (se != 0L)
sockNum = ntohs(se->s_port);
-// while ((c = getopt_long(argc, argv, "hVp:d", opts, NULL)) != -1) {
-// switch (c) {
-// case 'V':
-// cerr << _("plpfuse version ") << VERSION << endl;
-// return 0;
-// case 'h':
-// help();
-// break;
-// case 'd':
-// debug++;
-// break;
-// case 'p':
-// parse_destination(optarg, &host, &sockNum);
-// break;
-// }
-// }
+ opterr = 0; // Suppress errors from unknown options
+ while ((c = getopt_long(argc, argv, "hVp:d", opts, NULL)) != -1) {
+ switch (c) {
+ case 'V':
+ cerr << _("plpfuse version ") << VERSION << endl;
+ break;
+ case 'h':
+ help();
+ break;
+ case 'd':
+ debug++;
+ break;
+ case 'p':
+ parse_destination(optarg, &host, &sockNum);
+ for (i = optind; i < argc - 1; i++)
+ argv[i] = argv[i + 2];
+ argc -= 2;
+ break;
+ }
+ }
skt = new ppsocket();
if (!skt->connect(host, sockNum)) {
- cerr << "plpfuse: could not connect to ncpd" << endl;
- status = 1;
+ cerr << _("plpfuse: could not connect to ncpd") << endl;
+ return 1;
}
skt2 = new ppsocket();
if (!skt2->connect(host, sockNum)) {
- cerr << "plpfuse: could not connect to ncpd" << endl;
- status = 1;
+ cerr << _("plpfuse: could not connect to ncpd") << endl;
+ return 1;
}
- if (status == 0) {
- rf = new rfsvfactory(skt);
- rp = new rpcsfactory(skt2);
- a = rf->create(true);
- r = rp->create(true);
- if (a != NULL && r != NULL)
- debuglog("plpfuse: connected, status is %d", status);
- else
- debuglog("plpfuse: could not create rfsv or rpcs object, connect delayed");
-// for (i = 0; i < optind; i++)
-// argv[i + 1] = argv[i + optind];
-// argc -= optind - 1;
- status = fuse_main(argc, argv, &plp_oper, NULL);
- delete a;
- delete r;
- }
- exit(status);
+
+ rf = new rfsvfactory(skt);
+ rp = new rpcsfactory(skt2);
+ a = rf->create(true);
+ r = rp->create(true);
+ if (a != NULL && r != NULL)
+ debuglog("plpfuse: connected");
+ else
+ debuglog("plpfuse: could not create rfsv or rpcs object, connect delayed");
+ return fuse(argc, argv);
}