const char* misc_model_dialog(GtkWidget* parent) { StringOutputStream buffer(1024); buffer << g_qeglobals.m_userGamePath.c_str() << "models/"; if(!file_readable(buffer.c_str())) { // just go to fsmain buffer.clear(); buffer << g_qeglobals.m_userGamePath.c_str() << "/"; } const char *filename = file_dialog (parent, TRUE, "Choose Model", buffer.c_str(), ModelLoader::Name()); if (filename != 0) { // use VFS to get the correct relative path const char* relative = path_make_relative(filename, GlobalFileSystem().findRoot(filename)); if(relative == filename) { globalOutputStream() << "WARNING: could not extract the relative path, using full path instead\n"; } return relative; } return 0; }
void realise () { ASSERT_MESSAGE(m_unrealised != 0, "ModelResource::realise: already realised"); if (--m_unrealised == 0) { m_path = rootPath(m_originalName); m_name = path_make_relative(m_originalName, m_path); m_observers.realise(); } }
void visit(const char* name) { const char* subname = path_make_relative(name, m_directory); if(subname != name) { if(subname[0] == '/') ++subname; if(m_extension[0] == '*' || extension_equal(path_get_extension(subname), m_extension)) pathlist_prepend_unique(m_matches, g_strdup (subname)); } }
virtual void forEachFile(VisitorFunc visitor, const char* root) { std::vector<Directory*> dirs; UnixPath path(m_root.c_str()); path.push(root); dirs.push_back(directory_open(path.c_str())); while(!dirs.empty() && directory_good(dirs.back())) { const char* name = directory_read_and_increment(dirs.back()); if(name == 0) { directory_close(dirs.back()); dirs.pop_back(); path.pop(); } else if(!string_equal(name, ".") && !string_equal(name, "..")) { path.push_filename(name); bool is_directory = file_is_directory(path.c_str()); if(!is_directory) visitor.file(path_make_relative(path.c_str(), m_root.c_str())); path.pop(); if(is_directory) { path.push(name); if(!visitor.directory(path_make_relative(path.c_str(), m_root.c_str()), dirs.size())) dirs.push_back(directory_open(path.c_str())); else path.pop(); } } } }
void realise() { ASSERT_MESSAGE(m_unrealised != 0, "ModelResource::realise: already realised"); if(--m_unrealised == 0) { m_path = rootPath(m_originalName.c_str()); m_name = path_make_relative(m_originalName.c_str(), m_path.c_str()); //globalOutputStream() << "ModelResource::realise: " << m_path.c_str() << m_name.c_str() << "\n"; m_observers.realise(); } }
const char *misc_model_dialog( ui::Widget parent ){ const char *filename = parent.file_dialog( TRUE, "Choose Model", getLastModelFolderPath(), ModelLoader::Name() ); if ( filename != NULL ) { g_strLastModelFolder = g_path_get_dirname( filename ); // use VFS to get the correct relative path const char *relative = path_make_relative( filename, GlobalFileSystem().findRoot( filename ) ); if ( relative == filename ) { globalOutputStream() << "WARNING: could not extract the relative path, using full path instead\n"; } return relative; } return 0; }
void visit(const char* name) { const char* subname = path_make_relative(name, m_directory); if(subname != name) { if(subname[0] == '/') ++subname; char* dir = g_strdup(subname); char* last_char = dir + strlen(dir); if(last_char != dir && *(--last_char) == '/') *last_char = '\0'; pathlist_prepend_unique(m_matches, dir); } }
static int node_symlink(sd_device *dev, const char *node, const char *slink) { _cleanup_free_ char *slink_dirname = NULL, *target = NULL; const char *id_filename, *slink_tmp; struct stat stats; int r; assert(dev); assert(node); assert(slink); slink_dirname = dirname_malloc(slink); if (!slink_dirname) return log_oom(); /* use relative link */ r = path_make_relative(slink_dirname, node, &target); if (r < 0) return log_device_error_errno(dev, r, "Failed to get relative path from '%s' to '%s': %m", slink, node); /* preserve link with correct target, do not replace node of other device */ if (lstat(slink, &stats) == 0) { if (S_ISBLK(stats.st_mode) || S_ISCHR(stats.st_mode)) { log_device_error(dev, "Conflicting device node '%s' found, link to '%s' will not be created.", slink, node); return -EOPNOTSUPP; } else if (S_ISLNK(stats.st_mode)) { _cleanup_free_ char *buf = NULL; if (readlink_malloc(slink, &buf) >= 0 && streq(target, buf)) { log_device_debug(dev, "Preserve already existing symlink '%s' to '%s'", slink, target); (void) label_fix(slink, LABEL_IGNORE_ENOENT); (void) utimensat(AT_FDCWD, slink, NULL, AT_SYMLINK_NOFOLLOW); return 0; } } } else { log_device_debug(dev, "Creating symlink '%s' to '%s'", slink, target); do { r = mkdir_parents_label(slink, 0755); if (!IN_SET(r, 0, -ENOENT)) break; mac_selinux_create_file_prepare(slink, S_IFLNK); if (symlink(target, slink) < 0) r = -errno; mac_selinux_create_file_clear(); } while (r == -ENOENT); if (r == 0) return 0; if (r < 0) log_device_debug_errno(dev, r, "Failed to create symlink '%s' to '%s', trying to replace '%s': %m", slink, target, slink); } log_device_debug(dev, "Atomically replace '%s'", slink); r = device_get_id_filename(dev, &id_filename); if (r < 0) return log_device_error_errno(dev, r, "Failed to get id_filename: %m"); slink_tmp = strjoina(slink, ".tmp-", id_filename); (void) unlink(slink_tmp); do { r = mkdir_parents_label(slink_tmp, 0755); if (!IN_SET(r, 0, -ENOENT)) break; mac_selinux_create_file_prepare(slink_tmp, S_IFLNK); if (symlink(target, slink_tmp) < 0) r = -errno; mac_selinux_create_file_clear(); } while (r == -ENOENT); if (r < 0) return log_device_error_errno(dev, r, "Failed to create symlink '%s' to '%s': %m", slink_tmp, target); if (rename(slink_tmp, slink) < 0) { r = log_device_error_errno(dev, errno, "Failed to rename '%s' to '%s' failed: %m", slink_tmp, slink); (void) unlink(slink_tmp); } return r; }
std::string FileSystem::getRelative (const std::string& name) { const std::string abolsoluteBasePath = findRoot(name); return path_make_relative(name, abolsoluteBasePath); }