int parse_option(void *data, const char *arg, int key, struct fuse_args *outargs) { if (sscanf(arg, " cache_timeout = %[^\r\n ]", options.cache_timeout) || sscanf(arg, " verify_ssl = %[^\r\n ]", options.verify_ssl) || sscanf(arg, " segment_above = %[^\r\n ]", options.segment_above) || sscanf(arg, " segment_size = %[^\r\n ]", options.segment_size) || sscanf(arg, " storage_url = %[^\r\n ]", options.storage_url) || sscanf(arg, " container = %[^\r\n ]", options.container) || sscanf(arg, " temp_dir = %[^\r\n ]", options.temp_dir) || sscanf(arg, " client_id = %[^\r\n ]", options.client_id) || sscanf(arg, " client_secret = %[^\r\n ]", options.client_secret) || sscanf(arg, " refresh_token = %[^\r\n ]", options.refresh_token)) return 0; if (!strcmp(arg, "-f") || !strcmp(arg, "-d") || !strcmp(arg, "debug")) cloudfs_debug(1); return 1; }
int parse_option(void* data, const char* arg, int key, struct fuse_args* outargs) { if (sscanf(arg, " cache_timeout = %[^\r\n ]", options.cache_timeout) || sscanf(arg, " verify_ssl = %[^\r\n ]", options.verify_ssl) || sscanf(arg, " segment_above = %[^\r\n ]", options.segment_above) || sscanf(arg, " segment_size = %[^\r\n ]", options.segment_size) || sscanf(arg, " storage_url = %[^\r\n ]", options.storage_url) || sscanf(arg, " container = %[^\r\n ]", options.container) || sscanf(arg, " temp_dir = %[^\r\n ]", options.temp_dir) || sscanf(arg, " client_id = %[^\r\n ]", options.client_id) || sscanf(arg, " client_secret = %[^\r\n ]", options.client_secret) || sscanf(arg, " refresh_token = %[^\r\n ]", options.refresh_token) || sscanf(arg, " get_extended_metadata = %[^\r\n ]", extra_options.get_extended_metadata) || sscanf(arg, " curl_verbose = %[^\r\n ]", extra_options.curl_verbose) || sscanf(arg, " cache_statfs_timeout = %[^\r\n ]", extra_options.cache_statfs_timeout) || sscanf(arg, " debug_level = %[^\r\n ]", extra_options.debug_level) || sscanf(arg, " curl_progress_state = %[^\r\n ]", extra_options.curl_progress_state) || sscanf(arg, " enable_chmod = %[^\r\n ]", extra_options.enable_chmod) || sscanf(arg, " enable_chown = %[^\r\n ]", extra_options.enable_chown) ) return 0; if (!strncmp(arg, "settings_filename=", 18)) { arg += 18; strncpy(extra_options.settings_filename, arg, MAX_PATH_SIZE); return 0; } // Detect help for help enrichment if (!strcmp(arg, "-h") || !strcmp(arg, "--help")) strcpy(extra_options.help, "true"); if (!strcmp(arg, "-f") || !strcmp(arg, "-d") || !strcmp(arg, "debug")) cloudfs_debug(1); return 1; }
int main(int argc, char **argv) { char line[1024]; char username[sizeof(line)] = "", api_key[sizeof(line)] = "", settings_filename[sizeof(line)] = "", use_snet[sizeof(line)] = "", authurl[MAX_URL_SIZE] = "https://auth.api.rackspacecloud.com/v1.0"; FILE *settings; int foreground = 0; struct fuse_args args = FUSE_ARGS_INIT(argc, argv); char *home = get_home_dir(); snprintf(settings_filename, sizeof(settings_filename), "%s%s.cloudfuse", home, home[strlen(home)] == '/' ? "" : "/"); if ((settings = fopen(settings_filename, "r"))) { while (fgets(line, sizeof(line), settings)) { sscanf(line, " username = %[^\r\n ]", username); sscanf(line, " api_key = %[^\r\n ]", api_key); sscanf(line, " cache_timeout = %d", &cache_timeout); sscanf(line, " authurl = %[^\r\n ]", authurl); sscanf(line, " use_snet = %[^\r\n ]", use_snet); } fclose(settings); } if (!*username || !*api_key) { fprintf(stderr, "Unable to read %s\n", settings_filename); fprintf(stderr, "It should contain:\n\n"); fprintf(stderr, " username=[Mosso username]\n"); fprintf(stderr, " api_key=[Mosso api key]\n\n"); fprintf(stderr, "These entries are optional:\n\n"); fprintf(stderr, " cache_timeout=[seconds for directory caching]\n"); fprintf(stderr, " use_snet=[True to connect to snet]\n"); fprintf(stderr, " authurl=[used for testing]\n"); return 1; } fuse_parse_cmdline(&args, NULL, NULL, &foreground); cloudfs_debug(foreground); if (!cloudfs_connect(username, api_key, authurl, !strncasecmp(use_snet, "true", sizeof(use_snet)))) { fprintf(stderr, "Unable to authenticate.\n"); return 1; } static struct fuse_operations cfs_oper = { .readdir = cfs_readdir, .mkdir = cfs_mkdir, .read = cfs_read, .create = cfs_create, .open = cfs_open, .fgetattr = cfs_fgetattr, .getattr = cfs_getattr, .flush = cfs_flush, .release = cfs_release, .rmdir = cfs_rmdir, .ftruncate = cfs_ftruncate, .truncate = cfs_truncate, .write = cfs_write, .unlink = cfs_unlink, .fsync = cfs_fsync, .statfs = cfs_statfs, .chmod = cfs_chmod, .chown = cfs_chown, }; pthread_mutex_init(&dmut, NULL); signal(SIGPIPE, SIG_IGN); return fuse_main(argc, argv, &cfs_oper, NULL); }