| /** |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you under the Apache License, Version 2.0 (the |
| * "License"); you may not use this file except in compliance |
| * with the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "fuse_dfs.h" |
| #include "fuse_options.h" |
| #include "fuse_impls.h" |
| #include "fuse_init.h" |
| |
| |
| int is_protected(const char *path) { |
| |
| dfs_context *dfs = (dfs_context*)fuse_get_context()->private_data; |
| assert(dfs != NULL); |
| assert(dfs->protectedpaths); |
| |
| int i ; |
| for (i = 0; dfs->protectedpaths[i]; i++) { |
| if (strcmp(path, dfs->protectedpaths[i]) == 0) { |
| return 1; |
| } |
| } |
| return 0; |
| } |
| |
| static struct fuse_operations dfs_oper = { |
| .getattr = dfs_getattr, |
| .access = dfs_access, |
| .readdir = dfs_readdir, |
| .destroy = dfs_destroy, |
| .init = dfs_init, |
| .open = dfs_open, |
| .read = dfs_read, |
| .symlink = dfs_symlink, |
| .statfs = dfs_statfs, |
| .mkdir = dfs_mkdir, |
| .rmdir = dfs_rmdir, |
| .rename = dfs_rename, |
| .unlink = dfs_unlink, |
| .release = dfs_release, |
| .create = dfs_create, |
| .write = dfs_write, |
| .flush = dfs_flush, |
| .mknod = dfs_mknod, |
| .utimens = dfs_utimens, |
| .chmod = dfs_chmod, |
| .chown = dfs_chown, |
| .truncate = dfs_truncate, |
| }; |
| |
| |
| int main(int argc, char *argv[]) |
| { |
| |
| umask(0); |
| |
| extern const char *program; |
| program = argv[0]; |
| struct fuse_args args = FUSE_ARGS_INIT(argc, argv); |
| |
| /* clear structure that holds our options */ |
| memset(&options, 0, sizeof(struct options)); |
| |
| // some defaults |
| options.rdbuffer_size = 10*1024*1024; |
| options.attribute_timeout = 60; |
| options.entry_timeout = 60; |
| |
| if (fuse_opt_parse(&args, &options, dfs_opts, dfs_options) == -1) |
| /** error parsing options */ |
| return -1; |
| |
| |
| // Some fuse options we set |
| if (! options.private) { |
| fuse_opt_add_arg(&args, "-oallow_other"); |
| } |
| |
| if (!options.no_permissions) { |
| fuse_opt_add_arg(&args, "-odefault_permissions"); |
| } |
| |
| { |
| char buf[1024]; |
| |
| snprintf(buf, sizeof buf, "-oattr_timeout=%d",options.attribute_timeout); |
| fuse_opt_add_arg(&args, buf); |
| |
| snprintf(buf, sizeof buf, "-oentry_timeout=%d",options.entry_timeout); |
| fuse_opt_add_arg(&args, buf); |
| } |
| |
| if (options.server == NULL || options.port == 0) { |
| print_usage(argv[0]); |
| exit(0); |
| } |
| |
| |
| // |
| // Check we can connect to hdfs |
| // |
| if (options.initchecks == 1) { |
| hdfsFS temp; |
| if ((temp = hdfsConnect(options.server, options.port)) == NULL) { |
| const char *cp = getenv("CLASSPATH"); |
| const char *ld = getenv("LD_LIBRARY_PATH"); |
| fprintf(stderr, "FATAL: misconfiguration problem, cannot connect to hdfs - here's your environment\n"); |
| fprintf(stderr, "LD_LIBRARY_PATH=%s\n",ld == NULL ? "NULL" : ld); |
| fprintf(stderr, "CLASSPATH=%s\n",cp == NULL ? "NULL" : cp); |
| syslog(LOG_ERR, "FATAL: misconfiguration problem, cannot connect to hdfs - here's your environment\n"); |
| syslog(LOG_ERR, "LD_LIBRARY_PATH=%s\n",ld == NULL ? "NULL" : ld); |
| syslog(LOG_ERR, "CLASSPATH=%s\n",cp == NULL ? "NULL" : cp); |
| exit(0); |
| } |
| temp = NULL; |
| } |
| |
| int ret = fuse_main(args.argc, args.argv, &dfs_oper, NULL); |
| |
| if (ret) printf("\n"); |
| |
| /** free arguments */ |
| fuse_opt_free_args(&args); |
| |
| return ret; |
| } |