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

网格计算

开发平台:

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 <math.h>
  19. #include <pthread.h>
  20. #include <grp.h>
  21. #include <pwd.h>
  22. #include "fuse_dfs.h"
  23. #include "fuse_stat_struct.h"
  24. #include "fuse_context_handle.h"
  25. #if PERMS
  26. /**
  27.  * getpwuid and getgrgid return static structs so we safeguard the contents
  28.  * while retrieving fields using the 2 structs below.
  29.  * NOTE: if using both, always get the passwd struct firt!
  30.  */
  31. extern pthread_mutex_t passwdstruct_mutex; 
  32. extern pthread_mutex_t groupstruct_mutex;
  33. #endif
  34. const int default_id       = 99; // nobody  - not configurable since soon uids in dfs, yeah!
  35. const int blksize = 512;
  36. /**
  37.  * Converts from a hdfs hdfsFileInfo to a POSIX stat struct
  38.  *
  39.  */
  40. int fill_stat_structure(hdfsFileInfo *info, struct stat *st) 
  41. {
  42.   assert(st);
  43.   assert(info);
  44.   // initialize the stat structure
  45.   memset(st, 0, sizeof(struct stat));
  46.   // by default: set to 0 to indicate not supported for directory because we cannot (efficiently) get this info for every subdirectory
  47.   st->st_nlink = (info->mKind == kObjectKindDirectory) ? 0 : 1;
  48.   uid_t owner_id = default_id;
  49. #if PERMS
  50.   if (info->mOwner != NULL) {
  51.     //
  52.     // Critical section - protect from concurrent calls in different threads since
  53.     // the struct below is static.
  54.     // (no returns until end)
  55.     //
  56.     pthread_mutex_lock(&passwdstruct_mutex);
  57.     struct passwd *passwd_info = getpwnam(info->mOwner);
  58.     owner_id = passwd_info == NULL ? default_id : passwd_info->pw_uid;
  59.     //
  60.     // End critical section 
  61.     // 
  62.     pthread_mutex_unlock(&passwdstruct_mutex);
  63.   } 
  64. #endif
  65.   gid_t group_id = default_id;
  66. #if PERMS
  67.   if (info->mGroup != NULL) {
  68.     //
  69.     // Critical section - protect from concurrent calls in different threads since
  70.     // the struct below is static.
  71.     // (no returns until end)
  72.     //
  73.     pthread_mutex_lock(&groupstruct_mutex);
  74.     struct group *grp = getgrnam(info->mGroup);
  75.     group_id = grp == NULL ? default_id : grp->gr_gid;
  76.     //
  77.     // End critical section 
  78.     // 
  79.     pthread_mutex_unlock(&groupstruct_mutex);
  80.   }
  81. #endif
  82.   short perm = (info->mKind == kObjectKindDirectory) ? (S_IFDIR | 0777) :  (S_IFREG | 0666);
  83. #if PERMS
  84.   if (info->mPermissions > 0) {
  85.     perm = (info->mKind == kObjectKindDirectory) ? S_IFDIR:  S_IFREG ;
  86.     perm |= info->mPermissions;
  87.   }
  88. #endif
  89.   // set stat metadata
  90.   st->st_size     = (info->mKind == kObjectKindDirectory) ? 4096 : info->mSize;
  91.   st->st_blksize  = blksize;
  92.   st->st_blocks   =  ceil(st->st_size/st->st_blksize);
  93.   st->st_mode     = perm;
  94.   st->st_uid      = owner_id;
  95.   st->st_gid      = group_id;
  96. #if PERMS
  97.   st->st_atime    = info->mLastAccess;
  98. #else
  99.   st->st_atime    = info->mLastMod;
  100. #endif
  101.   st->st_mtime    = info->mLastMod;
  102.   st->st_ctime    = info->mLastMod;
  103.   return 0;
  104. }