mirror of
https://github.com/xorgy/mediafire-fuse
synced 2026-01-13 21:24:28 -08:00
fuse: allow to parse config file
This commit is contained in:
224
fuse/main.c
224
fuse/main.c
@@ -31,10 +31,13 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <bits/fcntl-linux.h>
|
#include <bits/fcntl-linux.h>
|
||||||
#include <fuse/fuse_common.h>
|
#include <fuse/fuse_common.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <wordexp.h>
|
||||||
|
|
||||||
#include "../mfapi/mfconn.h"
|
#include "../mfapi/mfconn.h"
|
||||||
#include "../mfapi/apicalls.h"
|
#include "../mfapi/apicalls.h"
|
||||||
#include "hashtbl.h"
|
#include "hashtbl.h"
|
||||||
|
#include "../utils/strings.h"
|
||||||
|
|
||||||
/* what you can safely assume about requests to your filesystem
|
/* what you can safely assume about requests to your filesystem
|
||||||
*
|
*
|
||||||
@@ -100,26 +103,6 @@ struct mediafirefs_user_options {
|
|||||||
char *server;
|
char *server;
|
||||||
int app_id;
|
int app_id;
|
||||||
char *api_key;
|
char *api_key;
|
||||||
} mediafirefs_user_options = {
|
|
||||||
NULL, NULL, NULL, NULL, -1, NULL};
|
|
||||||
|
|
||||||
static struct fuse_opt mediafirefs_opts[] = {
|
|
||||||
FUSE_OPT_KEY("-h", KEY_HELP),
|
|
||||||
FUSE_OPT_KEY("--help", KEY_HELP),
|
|
||||||
FUSE_OPT_KEY("-V", KEY_VERSION),
|
|
||||||
FUSE_OPT_KEY("--version", KEY_VERSION),
|
|
||||||
{"-c %s", offsetof(struct mediafirefs_user_options, configfile), 0},
|
|
||||||
{"--config=%s", offsetof(struct mediafirefs_user_options, configfile), 0},
|
|
||||||
{"-u %s", offsetof(struct mediafirefs_user_options, username), 0},
|
|
||||||
{"--username %s", offsetof(struct mediafirefs_user_options, username), 0},
|
|
||||||
{"-p %s", offsetof(struct mediafirefs_user_options, password), 0},
|
|
||||||
{"--password %s", offsetof(struct mediafirefs_user_options, password), 0},
|
|
||||||
{"--server %s", offsetof(struct mediafirefs_user_options, server), 0},
|
|
||||||
{"-i %d", offsetof(struct mediafirefs_user_options, app_id), 0},
|
|
||||||
{"--app-id %d", offsetof(struct mediafirefs_user_options, app_id), 0},
|
|
||||||
{"-k %s", offsetof(struct mediafirefs_user_options, api_key), 0},
|
|
||||||
{"--api-key %s", offsetof(struct mediafirefs_user_options, api_key), 0},
|
|
||||||
FUSE_OPT_END
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void usage(const char *progname)
|
static void usage(const char *progname)
|
||||||
@@ -349,36 +332,186 @@ mediafirefs_opt_proc(void *data, const char *arg, int key,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
static void parse_config_file(FILE * fp, int *argc, char ***argv)
|
||||||
{
|
{
|
||||||
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
|
// read the config file line by line and pass each line to wordexp to
|
||||||
FILE *fd;
|
// retain proper quoting
|
||||||
|
char *line = NULL;
|
||||||
|
size_t len = 0;
|
||||||
|
ssize_t read;
|
||||||
|
wordexp_t p;
|
||||||
|
int ret;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
while ((read = getline(&line, &len, fp)) != -1) {
|
||||||
|
if (line[0] == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// replace possible trailing newline by zero
|
||||||
|
if (line[strlen(line) - 1] == '\n')
|
||||||
|
line[strlen(line) - 1] = '\0';
|
||||||
|
ret = wordexp(line, &p, WRDE_SHOWERR | WRDE_UNDEF);
|
||||||
|
if (ret != 0) {
|
||||||
|
switch (ret) {
|
||||||
|
case WRDE_BADCHAR:
|
||||||
|
fprintf(stderr, "wordexp: WRDE_BADCHAR\n");
|
||||||
|
break;
|
||||||
|
case WRDE_BADVAL:
|
||||||
|
fprintf(stderr, "wordexp: WRDE_BADVAL\n");
|
||||||
|
break;
|
||||||
|
case WRDE_CMDSUB:
|
||||||
|
fprintf(stderr, "wordexp: WRDE_CMDSUB\n");
|
||||||
|
break;
|
||||||
|
case WRDE_NOSPACE:
|
||||||
|
fprintf(stderr, "wordexp: WRDE_NOSPACE\n");
|
||||||
|
break;
|
||||||
|
case WRDE_SYNTAX:
|
||||||
|
fprintf(stderr, "wordexp: WRDE_SYNTAX\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wordfree(&p);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// now insert those arguments into argv right after the first
|
||||||
|
*argv = (char **)realloc(*argv, sizeof(char *) * (*argc + p.we_wordc));
|
||||||
|
memmove((*argv) + p.we_wordc + 1, (*argv) + 1,
|
||||||
|
sizeof(char *) * (*argc - 1));
|
||||||
|
*argc += p.we_wordc;
|
||||||
|
for (i = 0; i < p.we_wordc; i++) {
|
||||||
|
(*argv)[i + 1] = strdup(p.we_wordv[i]);
|
||||||
|
}
|
||||||
|
wordfree(&p);
|
||||||
|
}
|
||||||
|
free(line);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void parse_config(int *argc, char ***argv, char *configfile)
|
||||||
|
{
|
||||||
|
FILE *fp;
|
||||||
|
char *homedir;
|
||||||
|
|
||||||
|
// parse the configuration file
|
||||||
|
// if a value is not set (it is NULL) then it has not been set by the
|
||||||
|
// commandline and should be set by the configuration file
|
||||||
|
|
||||||
|
// try set config file first if set
|
||||||
|
if (configfile != NULL && (fp = fopen(configfile, "r")) != NULL) {
|
||||||
|
parse_config_file(fp, argc, argv);
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// try "./.mediafire-tools.conf" second
|
||||||
|
if ((fp = fopen("./.mediafire-tools.conf", "r")) != NULL) {
|
||||||
|
parse_config_file(fp, argc, argv);
|
||||||
|
fclose(fp);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// try "~/.mediafire-tools.conf" third
|
||||||
|
if ((homedir = getenv("HOME")) == NULL) {
|
||||||
|
homedir = getpwuid(getuid())->pw_dir;
|
||||||
|
}
|
||||||
|
homedir = strdup_printf("%s/.mediafire-tools.conf", homedir);
|
||||||
|
if ((fp = fopen("./.mediafire-tools.conf", "r")) != NULL) {
|
||||||
|
parse_config_file(fp, argc, argv);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
free(homedir);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void parse_arguments(int *argc, char ***argv,
|
||||||
|
struct mediafirefs_user_options *options)
|
||||||
|
{
|
||||||
|
char **argv_new;
|
||||||
|
|
||||||
|
/* In the first pass, we only search for the help, version and config file
|
||||||
|
* options.
|
||||||
|
*
|
||||||
|
* In case help or version options are found, the program will display
|
||||||
|
* them and quit
|
||||||
|
*
|
||||||
|
* Otherwise, the program will read the config file (possibly supplied
|
||||||
|
* through the option being set in the first pass), prepend its arguments
|
||||||
|
* to argv and parse the arguments again as a second pass.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct fuse_opt mediafirefs_opts_fst[] = {
|
||||||
|
FUSE_OPT_KEY("-h", KEY_HELP),
|
||||||
|
FUSE_OPT_KEY("--help", KEY_HELP),
|
||||||
|
FUSE_OPT_KEY("-V", KEY_VERSION),
|
||||||
|
FUSE_OPT_KEY("--version", KEY_VERSION),
|
||||||
|
{"-c %s", offsetof(struct mediafirefs_user_options, configfile), 0},
|
||||||
|
{"--config %s", offsetof(struct mediafirefs_user_options, configfile),
|
||||||
|
0},
|
||||||
|
FUSE_OPT_END
|
||||||
|
};
|
||||||
|
|
||||||
|
// copy argv into a new area so that we can realloc later
|
||||||
|
argv_new = malloc(sizeof(char *) * (*argc));
|
||||||
|
memcpy(argv_new, *argv, sizeof(char *) * (*argc));
|
||||||
|
*argv = argv_new;
|
||||||
|
|
||||||
|
struct fuse_args args_fst = FUSE_ARGS_INIT(*argc, *argv);
|
||||||
|
|
||||||
if (fuse_opt_parse
|
if (fuse_opt_parse
|
||||||
(&args, &mediafirefs_user_options, mediafirefs_opts,
|
(&args_fst, options, mediafirefs_opts_fst,
|
||||||
mediafirefs_opt_proc) == -1) {
|
mediafirefs_opt_proc) == -1) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
*argc = args_fst.argc;
|
||||||
|
*argv = args_fst.argv;
|
||||||
|
|
||||||
if (mediafirefs_user_options.app_id == -1) {
|
parse_config(argc, argv, options->configfile);
|
||||||
mediafirefs_user_options.app_id = 42709;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mediafirefs_user_options.server == NULL) {
|
struct fuse_opt mediafirefs_opts_snd[] = {
|
||||||
mediafirefs_user_options.server = "www.mediafire.com";
|
{"-c %s", offsetof(struct mediafirefs_user_options, configfile), 0},
|
||||||
}
|
{"--config %s", offsetof(struct mediafirefs_user_options, configfile),
|
||||||
|
0},
|
||||||
|
{"-u %s", offsetof(struct mediafirefs_user_options, username), 0},
|
||||||
|
{"--username %s", offsetof(struct mediafirefs_user_options, username),
|
||||||
|
0},
|
||||||
|
{"-p %s", offsetof(struct mediafirefs_user_options, password), 0},
|
||||||
|
{"--password %s", offsetof(struct mediafirefs_user_options, password),
|
||||||
|
0},
|
||||||
|
{"--server %s", offsetof(struct mediafirefs_user_options, server), 0},
|
||||||
|
{"-i %d", offsetof(struct mediafirefs_user_options, app_id), 0},
|
||||||
|
{"--app-id %d", offsetof(struct mediafirefs_user_options, app_id), 0},
|
||||||
|
{"-k %s", offsetof(struct mediafirefs_user_options, api_key), 0},
|
||||||
|
{"--api-key %s", offsetof(struct mediafirefs_user_options, api_key),
|
||||||
|
0},
|
||||||
|
FUSE_OPT_END
|
||||||
|
};
|
||||||
|
|
||||||
if (mediafirefs_user_options.username == NULL ||
|
struct fuse_args args_snd = FUSE_ARGS_INIT(*argc, *argv);
|
||||||
mediafirefs_user_options.password == NULL) {
|
|
||||||
fprintf(stderr, "You must specify username and pasword\n");
|
if (fuse_opt_parse(&args_snd, options, mediafirefs_opts_snd, NULL)
|
||||||
|
== -1) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
conn = mfconn_create(mediafirefs_user_options.server,
|
*argc = args_snd.argc;
|
||||||
mediafirefs_user_options.username,
|
*argv = args_snd.argv;
|
||||||
mediafirefs_user_options.password,
|
}
|
||||||
mediafirefs_user_options.app_id,
|
|
||||||
mediafirefs_user_options.api_key);
|
static void connect_mf(struct mediafirefs_user_options *options)
|
||||||
|
{
|
||||||
|
FILE *fd;
|
||||||
|
|
||||||
|
if (options->app_id == -1) {
|
||||||
|
options->app_id = 42709;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options->server == NULL) {
|
||||||
|
options->server = "www.mediafire.com";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options->username == NULL || options->password == NULL) {
|
||||||
|
fprintf(stderr, "You must specify username and password\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
conn = mfconn_create(options->server,
|
||||||
|
options->username,
|
||||||
|
options->password, options->app_id, options->api_key);
|
||||||
|
|
||||||
if (conn == NULL) {
|
if (conn == NULL) {
|
||||||
fprintf(stderr, "Cannot establish connection\n");
|
fprintf(stderr, "Cannot establish connection\n");
|
||||||
@@ -406,6 +539,17 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
fprintf(stderr, "tree before starting fuse:\n");
|
fprintf(stderr, "tree before starting fuse:\n");
|
||||||
folder_tree_debug(tree);
|
folder_tree_debug(tree);
|
||||||
|
}
|
||||||
return fuse_main(args.argc, args.argv, &mediafirefs_oper, NULL);
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
struct mediafirefs_user_options options = {
|
||||||
|
NULL, NULL, NULL, NULL, -1, NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
parse_arguments(&argc, &argv, &options);
|
||||||
|
|
||||||
|
connect_mf(&options);
|
||||||
|
|
||||||
|
return fuse_main(argc, argv, &mediafirefs_oper, NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user