fuse_init.c
上传用户:quxuerui
上传日期:2018-01-08
资源大小:41811k
文件大小:4k
源码类别:

网格计算

开发平台:

Java

  1. /**
  2.  * Licensed to the Apache Software Foundation (ASF) under one
  3.  * or more contributor license agreements.  See the NOTICE file
  4.  * distributed with this work for additional information
  5.  * regarding copyright ownership.  The ASF licenses this file
  6.  * to you under the Apache License, Version 2.0 (the
  7.  * "License"); you may not use this file except in compliance
  8.  * with the License.  You may obtain a copy of the License at
  9.  *
  10.  *     http://www.apache.org/licenses/LICENSE-2.0
  11.  *
  12.  * Unless required by applicable law or agreed to in writing, software
  13.  * distributed under the License is distributed on an "AS IS" BASIS,
  14.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15.  * See the License for the specific language governing permissions and
  16.  * limitations under the License.
  17.  */
  18. #include <strings.h>
  19. #include "fuse_dfs.h"
  20. #include "fuse_init.h"
  21. #include "fuse_options.h"
  22. #include "fuse_context_handle.h"
  23. // Hacked up function to basically do:
  24. //  protectedpaths = split(options.protected,':');
  25. void init_protectedpaths(dfs_context *dfs) {
  26.   char *tmp = options.protected;
  27.   // handle degenerate case up front.
  28.   if (tmp == NULL || 0 == *tmp) {
  29.     dfs->protectedpaths = (char**)malloc(sizeof(char*));
  30.     dfs->protectedpaths[0] = NULL;
  31.     return;
  32.   }
  33.   assert(tmp);
  34.   if (options.debug) {
  35.     print_options();
  36.   }
  37.   int i = 0;
  38.   while (tmp && (NULL != (tmp = index(tmp,':')))) {
  39.     tmp++; // pass the ,
  40.     i++;
  41.   }
  42.   i++; // for the last entry
  43.   i++; // for the final NULL
  44.   dfs->protectedpaths = (char**)malloc(sizeof(char*)*i);
  45.   assert(dfs->protectedpaths);
  46.   tmp = options.protected;
  47.   int j  = 0;
  48.   while (NULL != tmp && j < i) {
  49.     int length;
  50.     char *eos = index(tmp,':');
  51.     if (NULL != eos) {
  52.       length = eos - tmp; // length of this value
  53.     } else {
  54.       length = strlen(tmp);
  55.     }
  56.     dfs->protectedpaths[j] = (char*)malloc(sizeof(char)*length+1);
  57.     assert(dfs->protectedpaths[j]);
  58.     strncpy(dfs->protectedpaths[j], tmp, length);
  59.     dfs->protectedpaths[j][length] = '';
  60.     if (eos) {
  61.       tmp = eos + 1;
  62.     } else {
  63.       tmp = NULL;
  64.     }
  65.     j++;
  66.   }
  67.   dfs->protectedpaths[j] = NULL;
  68.   /*
  69.     j  = 0;
  70.     while (dfs->protectedpaths[j]) {
  71.     printf("dfs->protectedpaths[%d]=%sn",j,dfs->protectedpaths[j]);
  72.     fflush(stdout);
  73.     j++;
  74.     }
  75.     exit(1);
  76.   */
  77. }
  78. void *dfs_init()
  79. {
  80.   //
  81.   // Create a private struct of data we will pass to fuse here and which
  82.   // will then be accessible on every call.
  83.   //
  84.   dfs_context *dfs = (dfs_context*)malloc(sizeof (dfs_context));
  85.   if (NULL == dfs) {
  86.     syslog(LOG_ERR, "FATAL: could not malloc fuse dfs context struct - out of memory %s:%d", __FILE__, __LINE__);
  87.     exit(1);
  88.   }
  89.   // initialize the context
  90.   dfs->debug                 = options.debug;
  91.   dfs->nn_hostname           = options.server;
  92.   dfs->nn_port               = options.port;
  93.   dfs->fs                    = NULL;
  94.   dfs->read_only             = options.read_only;
  95.   dfs->usetrash              = options.usetrash;
  96.   dfs->protectedpaths        = NULL;
  97.   dfs->rdbuffer_size         = options.rdbuffer_size;
  98.   dfs->direct_io             = options.direct_io;
  99.   bzero(dfs->dfs_uri,0);
  100.   sprintf(dfs->dfs_uri,"dfs://%s:%d/",dfs->nn_hostname,dfs->nn_port);
  101.   dfs->dfs_uri_len = strlen(dfs->dfs_uri);
  102.   // use ERR level to ensure it makes it into the log.
  103.   syslog(LOG_ERR, "mounting %s", dfs->dfs_uri);
  104.   init_protectedpaths(dfs);
  105.   assert(dfs->protectedpaths != NULL);
  106.   if (dfs->rdbuffer_size <= 0) {
  107.     syslog(LOG_DEBUG, "WARN: dfs->rdbuffersize <= 0 = %ld %s:%d", dfs->rdbuffer_size, __FILE__, __LINE__);
  108.     dfs->rdbuffer_size = 32768;
  109.   }
  110.   return (void*)dfs;
  111. }
  112. void dfs_destroy (void *ptr)
  113. {
  114.   TRACE("destroy")
  115.   dfs_context *dfs = (dfs_context*)ptr;
  116.   dfs->fs = NULL;
  117. }