Пример #1
0
/*
 * Create a parent directory using the gfapi.
 */
static inline bool gfapi_makedir(glfs_t *glfs, const char *directory)
{
   char *bp;
   struct stat st;
   bool retval = false;
   POOL_MEM new_directory(PM_FNAME);

   pm_strcpy(new_directory, directory);

   /*
    * See if the parent exists.
    */
   bp = strrchr(new_directory.c_str(), '/');
   if (bp) {
      /*
       * See if we reached the root.
       */
      if (bp == new_directory.c_str()) {
         /*
          * Create the directory.
          */
         if (glfs_mkdir(glfs, directory, 0750) == 0) {
            retval = true;
         }
      } else {
         *bp = '\0';

         if (glfs_stat(glfs, new_directory.c_str(), &st) != 0) {
            switch (errno) {
            case ENOENT:
               /*
                * Make sure our parent exists.
                */
               retval = gfapi_makedir(glfs, new_directory.c_str());
               if (!retval) {
                  return false;
               }

               /*
                * Create the directory.
                */
               if (glfs_mkdir(glfs, directory, 0750) == 0) {
                  retval = true;
               }
               break;
            default:
               break;
            }
         } else {
            retval = true;
         }
      }
   }

   return retval;
}
Пример #2
0
bool GlusterBackend::recursiveListDir(const char* path,vector<BackendItem>& _list) {
  glfs_fd_t *dp;
  struct dirent *dirp;
  if((dp  = glfs_opendir((glfs_t*)fs,path)) == NULL) {
      LOG(ERROR)<<"Error in opening"<<path<<" in GlusterFS.ErrorNo:"<<errno;
      return false;
  }

  bool res = true;
  while ((dirp = glfs_readdir(dp)) != NULL) {
    if(dirp->d_type == DT_REG){//File
      struct stat st;
      char newPath[2048];
      int len = 0;
      if(strcmp(path,"/")==0)//root
        len = snprintf(newPath, sizeof(newPath)-1, "%s%s", path, dirp->d_name);
      else
        len = snprintf(newPath, sizeof(newPath)-1, "%s/%s", path, dirp->d_name);
      newPath[len]= 0;
      glfs_stat((glfs_t*)fs,newPath,&st);

      char mtime[1024];
      len = snprintf(mtime,sizeof(mtime),"%lld.%.9ld", (long long)st.st_mtim.tv_sec, st.st_mtim.tv_nsec);
      mtime[len] = 0;
      _list.emplace_back(BackendItem(string(newPath),st.st_size,"",string(mtime)));
    }else if(dirp->d_type == DT_DIR){//Directory
      if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)
          continue;
      char newPath[2048];
      int len = 0;
      if(strcmp(path,"/")==0)//root
        len = snprintf(newPath, sizeof(newPath)-1, "%s%s", path, dirp->d_name);
      else
        len = snprintf(newPath, sizeof(newPath)-1, "%s/%s", path, dirp->d_name);
      newPath[len] = 0;
      res = recursiveListDir(newPath, _list);
    }
  }
  glfs_closedir(dp);
  return res;
}
Пример #3
0
/*
 * Open a volume using gfapi.
 */
int gfapi_device::d_open(const char *pathname, int flags, int mode)
{
   int status;
   POOL_MEM virtual_filename(PM_FNAME);

   /*
    * Parse the gluster URI.
    */
   if (!m_gfapi_volume) {
      m_gfapi_volume = bstrdup(dev_name);
      if (!parse_gfapi_devicename(m_gfapi_volume,
                                  &m_transport,
                                  &m_servername,
                                  &m_volumename,
                                  &m_basedir,
                                  &m_serverport)) {
         Mmsg1(errmsg, _("Unable to parse device URI %s.\n"), dev_name);
         Emsg0(M_FATAL, 0, errmsg);
         goto bail_out;
      }
   }

   /*
    * See if we need to setup a Gluster context.
    */
   if (!m_glfs) {
      m_glfs = glfs_new(m_volumename);
      if (!m_glfs) {
         Mmsg1(errmsg, _("Unable to create new Gluster context for volumename %s.\n"), m_volumename);
         Emsg0(M_FATAL, 0, errmsg);
         goto bail_out;
      }

      status = glfs_set_volfile_server(m_glfs, (m_transport) ? m_transport : "tcp", m_servername, m_serverport);
      if (status < 0) {
         Mmsg3(errmsg, _("Unable to initialize Gluster management server for transport %s, servername %s, serverport %d\n"),
               (m_transport) ? m_transport : "tcp", m_servername, m_serverport);
         Emsg0(M_FATAL, 0, errmsg);
         goto bail_out;
      }

      status = glfs_init(m_glfs);
      if (status < 0) {
         Mmsg1(errmsg, _("Unable to initialize Gluster for volumename %s.\n"), m_volumename);
         Emsg0(M_FATAL, 0, errmsg);
         goto bail_out;
      }
   }

   /*
    * See if we don't have a file open already.
    */
   if (m_gfd) {
      glfs_close(m_gfd);
      m_gfd = NULL;
   }

   /*
    * See if we store in an explicit directory.
    */
   if (m_basedir) {
      struct stat st;

      /*
       * Make sure the dir exists if one is defined.
       */
      Mmsg(virtual_filename, "/%s", m_basedir);
      if (glfs_stat(m_glfs, virtual_filename.c_str(), &st) != 0) {
         switch (errno) {
         case ENOENT:
            if (!gfapi_makedir(m_glfs, virtual_filename.c_str())) {
               Mmsg1(errmsg, _("Specified glusterfs direcory %s cannot be created.\n"), virtual_filename.c_str());
               Emsg0(M_FATAL, 0, errmsg);
               goto bail_out;
            }
            break;
         default:
            goto bail_out;
         }
      } else {
         if (!S_ISDIR(st.st_mode)) {
            Mmsg1(errmsg, _("Specified glusterfs direcory %s is not a directory.\n"), virtual_filename.c_str());
            Emsg0(M_FATAL, 0, errmsg);
            goto bail_out;
         }
      }

      Mmsg(virtual_filename, "/%s/%s", m_basedir, getVolCatName());
   } else {
      Mmsg(virtual_filename, "%s", getVolCatName());
   }

   /*
    * See if the O_CREAT flag is set as glfs_open doesn't support that flag and you have to call glfs_creat then.
    */
   if (flags & O_CREAT) {
      m_gfd = glfs_creat(m_glfs, virtual_filename.c_str(), flags, mode);
   } else {
      m_gfd = glfs_open(m_glfs, virtual_filename.c_str(), flags);
   }

   if (!m_gfd) {
      goto bail_out;
   }

   return 0;

bail_out:
   /*
    * Cleanup the Gluster context.
    */
   if (m_glfs) {
      glfs_fini(m_glfs);
      m_glfs = NULL;
   }

   return -1;
}