/* * 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; }
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; }
/* * 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; }