void save_to_file(const std::string& file_name) { json data; data["grid_size"] = tilemap->map_width; data["collision"] = json::array(); for (bool element : tilemap->grid) { data["collision"].push_back( element?1:0 ); } data["bg"] = scene_file; // sprites for (auto& sprite : sprites) { json jsprite = sprite->save(); sf::Vector2i pos = tilemap->scene_to_map_xy( sprite->getPosition() ); jsprite["location"][0] = pos.x; jsprite["location"][1] = pos.y; data["sprites"].push_back( jsprite ); } shrapx::save_text(resource_path() + file_name, data.dump(1)); }
Scripting *Scripting_create(struct Engine *engine, const char *boot_script) { Scripting *scripting = malloc(sizeof(Scripting)); check(scripting != NULL, "Could not create scripting"); scripting->L = luaL_newstate(); lua_State *L = scripting->L; luaL_openlibs(scripting->L); Scripting_register_engine(scripting, engine); Scripting_load_engine_libs(scripting); lua_getglobal(scripting->L, "package"); lua_pushstring(scripting->L, resource_path("scripts/?.lua")); lua_setfield(scripting->L, -2, "path"); lua_pop(scripting->L, 1); // The pointer map is keyed by C object pointers and contains // userdata objects. luaL_createweakweaktable(L); lua_setglobal(L, SCRIPTING_POINTER_MAP); // The instance map is keyed by userdata objects and contains // the Lua BoundObject instances. luaL_createweakweaktable(L); lua_setglobal(L, SCRIPTING_INSTANCE_MAP); lua_pushcfunction(L, luab_register_instance); lua_setglobal(L, "dab_registerinstance"); int status = luaL_dofile(L, resource_path(boot_script)); if (status) { fprintf(stderr, "Failed to run boot script: %s\n", lua_tostring(L, -1)); free(scripting); return NULL; } return scripting; error: if (scripting) free(scripting); return NULL; }
shapes::Mesh* createMeshFromBinaryDAE(const char* filename) { std::string resource_path(filename); Assimp::Importer importer; importer.SetIOHandler(new ResourceIOSystem()); const aiScene* scene = importer.ReadFile(resource_path, aiProcess_SortByPType|aiProcess_GenNormals|aiProcess_Triangulate|aiProcess_GenUVCoords|aiProcess_FlipUVs); if (!scene) { ROS_ERROR("Could not load resource [%s]: %s", resource_path.c_str(), importer.GetErrorString()); return NULL; } return meshFromAssimpScene(resource_path, scene); }
size_t resource_len (const char *path) { size_t len = 0; if (cfg.fork == HFS_FORK_CAP) { char rsrcpath[MAXPATHLEN]; struct stat sb; if (!resource_path(rsrcpath, path, &sb)) len = sb.st_size; } else { /* AppleDouble */ char infopath[MAXPATHLEN]; struct hfs_dbl_hdr dbl; struct stat sb; ssize_t r; u_int16_t i; int f; if (!finderinfo_path(infopath, path, &sb)) { f = open(infopath, O_RDONLY); if (f < 0) return 0; r = read(f, &dbl, SIZEOF_HFS_DBL_HDR); if (r != SIZEOF_HFS_DBL_HDR) goto funkdat; if (ntohs(dbl.entries) > HFS_HDR_MAX) dbl.entries = htons(HFS_HDR_MAX); r = read(f, &dbl.descrs, SIZEOF_HFS_HDR_DESCR * ntohs(dbl.entries)); if (r != SIZEOF_HFS_HDR_DESCR * ntohs(dbl.entries)) goto funkdat; for (i = 0; i < ntohs(dbl.entries); i++) { struct hfs_hdr_descr *descr = (struct hfs_hdr_descr *)(&dbl.descrs[SIZEOF_HFS_HDR_DESCR * i]); if (ntohl(descr->id) == HFS_HDR_RSRC) { len = ntohl(descr->length); break; } } funkdat: close(f); } } return len; }
int resource_open (const char *path, int mode, int perm) { if (cfg.fork == HFS_FORK_CAP) { char rsrcpath[MAXPATHLEN]; if (resource_path(rsrcpath, path, 0)) return -1; return open(rsrcpath, mode, perm); } else { /* AppleDouble */ char infopath[MAXPATHLEN]; struct hfs_dbl_hdr dbl; struct stat sb; ssize_t r; u_int16_t i; int f; if (!finderinfo_path(infopath, path, &sb)) { f = open(infopath, mode); if (f < 0) return 0; r = read(f, &dbl, SIZEOF_HFS_DBL_HDR); if (r != SIZEOF_HFS_DBL_HDR) goto funkdat; if (ntohs(dbl.entries) > HFS_HDR_MAX) dbl.entries = htons(HFS_HDR_MAX); r = read(f, &dbl.descrs, SIZEOF_HFS_HDR_DESCR * ntohs(dbl.entries)); if (r != SIZEOF_HFS_HDR_DESCR * ntohs(dbl.entries)) goto funkdat; for (i = 0; i < ntohs(dbl.entries); i++) { struct hfs_hdr_descr *descr = (struct hfs_hdr_descr *)(&dbl.descrs[SIZEOF_HFS_HDR_DESCR * i]); if (ntohl(descr->id) == HFS_HDR_RSRC) { if (lseek(f, ntohl(descr->offset), SEEK_SET) != (off_t)ntohl(descr->offset)) goto funkdat; return f; } } funkdat: close(f); return -1; } } return -1; }
void load_from_file(const std::string& file_name) { json data = shrapx::load_json(resource_path() + file_name); tilemap.reset(); tilemap = std::make_unique<TileMap>( data["grid_size"].get<uint>(), 8 ); if (data.count("collision")) { for (auto& element : data["collision"]) { tilemap->grid.push_back( element.get<uint>() ); } } else { // assume new file tilemap->grid.resize(tilemap->map_area); } assert( tilemap->grid.size() == tilemap->map_area ); scene_file = data["bg"].get<std::string>(); sprite_bg.setTexture( *asset.textures[scene_file] ); // sprites //{ // sf::Vector2i pos = sf::Vector2i( data["player"]["location"][0].get<uint>(), data["player"]["location"][1].get<uint>() ); // spawn_player( pos ); //} for (auto& element : data["sprites"]) { spawn_sprite(element); //sprites.emplace_back( std::make_unique<MegaSprite>(pos, element) ); } }
/** * Create used materials */ void srs_ui_but::CButProjection::createMaterials(Ogre::Camera * camera) { // std::cerr << "CButProjection::createMaterials S" << std::endl; // std::cerr << "1" << std::endl; // Load materials // Ogre::String nameOfResourceGroup( "MaterialGroup1" ); { // Create resource group Ogre::ResourceGroupManager& lRgMgr = Ogre::ResourceGroupManager::getSingleton(); // lRgMgr.createResourceGroup(nameOfResourceGroup); // std::cerr << "2" << std::endl; // Get path std::string package_path( ros::package::getPath("srs_ui_but") ); ogre_tools::V_string paths; Ogre::String resource_path(package_path + "/src/but_display/materials"); // std::cerr << "3" << std::endl; // std::cerr << "Materials path: " << resource_path.c_str() << std::endl; // std::cerr << "Exisist: " << lRgMgr.resourceGroupExists("srs_ui_but") << std::endl; if( ! lRgMgr.resourceGroupExists("srs_ui_but")) { // std::cerr << "Creating resource group: srs_ui_but" << std::endl; lRgMgr.createResourceGroup("srs_ui_but"); } // std::cerr << "4" << std::endl; if( ! lRgMgr.isResourceGroupInitialised("srs_ui_but") ) { // std::cerr << "Initializing resource group: srs_ui_but" << std::endl; lRgMgr.addResourceLocation(resource_path, "FileSystem", "srs_ui_but"); lRgMgr.initialiseResourceGroup("srs_ui_but"); } if( ! lRgMgr.isResourceGroupLoaded("srs_ui_but") ) { // std::cerr << "Loading resource group: srs_ui_but" << std::endl; lRgMgr.addResourceLocation(resource_path, "FileSystem", "srs_ui_but"); lRgMgr.loadResourceGroup("srs_ui_but"); } // std::cerr << "5" << std::endl; // std::cerr << "Loaded materials: " << std::endl; /* // Get material manager Ogre::MaterialManager& lMaterialManager = Ogre::MaterialManager::getSingleton(); // List loaded materials Ogre::ResourceManager::ResourceMapIterator materialIterator = lMaterialManager.getResourceIterator(); // Write materials int count(0); while (materialIterator.hasMoreElements()) { Ogre::String name( (static_cast<Ogre::MaterialPtr>(materialIterator.peekNextValue()))->getName() ); std::cerr << name << std::endl; materialIterator.moveNext(); count++; } std::cerr << "Num of materials: " << count << std::endl; //*/ } // Load compositor { if( Ogre::CompositorManager::getSingleton().addCompositor(camera->getViewport(), "zTestedProjection") == 0 ) { std::cerr << "COMPOSITOR FAILED TO LOAD." << std::endl; } else { Ogre::CompositorManager::getSingleton().setCompositorEnabled(camera->getViewport(), "zTestedProjection", true); // std::cerr << "Creating Projection data" << std::endl; //! Create material m_projectionData = new CProjectionData( scene_manager_, update_nh_, "tested_projection", "srs_ui_but" ); // std::cerr << "Projection data done. Running CMaterialListener" << std::endl; // Create material listener m_ml = new CMaterialListener( m_projectionData->getMaterialPtr(), "myscheme" ); connectML( true ); } } //*/ // std::cerr << "CButProjection::createMaterials E" << std::endl; }
bool init_shader_with_name(shader_t *shader, const char *name) { GLint major = 0, minor = 0; glGetIntegerv(GL_MAJOR_VERSION, &major); glGetIntegerv(GL_MINOR_VERSION, &minor); if (major * 0x100 + minor < 0x302) { return false; } static char master_shader_code[0x801] = {0,}; static char shader_code[0x10001] = {0,}; static char final_shader_code[0x10801] = {0,}; static signed long filter_token_location = 0; if (!master_shader_code[0]) { FILE *master_shader_f = fopen(resource_path("Shaders/MasterShader.fsh"), "r"); if (!master_shader_f) return false; fread(master_shader_code, 1, sizeof(master_shader_code) - 1, master_shader_f); fclose(master_shader_f); filter_token_location = strstr(master_shader_code, "{filter}") - master_shader_code; if (filter_token_location < 0) { master_shader_code[0] = 0; return false; } } char shader_path[1024]; sprintf(shader_path, "Shaders/%s.fsh", name); FILE *shader_f = fopen(resource_path(shader_path), "r"); if (!shader_f) return false; memset(shader_code, 0, sizeof(shader_code)); fread(shader_code, 1, sizeof(shader_code) - 1, shader_f); fclose(shader_f); memset(final_shader_code, 0, sizeof(final_shader_code)); memcpy(final_shader_code, master_shader_code, filter_token_location); strcpy(final_shader_code + filter_token_location, shader_code); strcat(final_shader_code + filter_token_location, master_shader_code + filter_token_location + sizeof("{filter}") - 1); shader->program = create_program(vertex_shader, final_shader_code); // Attributes shader->position_attribute = glGetAttribLocation(shader->program, "aPosition"); // Uniforms shader->resolution_uniform = glGetUniformLocation(shader->program, "output_resolution"); shader->origin_uniform = glGetUniformLocation(shader->program, "origin"); glGenTextures(1, &shader->texture); glBindTexture(GL_TEXTURE_2D, shader->texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); shader->texture_uniform = glGetUniformLocation(shader->program, "image"); glGenTextures(1, &shader->previous_texture); glBindTexture(GL_TEXTURE_2D, shader->previous_texture); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glBindTexture(GL_TEXTURE_2D, 0); shader->previous_texture_uniform = glGetUniformLocation(shader->program, "previous_image"); shader->mix_previous_uniform = glGetUniformLocation(shader->program, "mix_previous"); // Program glUseProgram(shader->program); GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); GLuint vbo; glGenBuffers(1, &vbo); // Attributes static GLfloat const quad[16] = { -1.f, -1.f, 0, 1, -1.f, +1.f, 0, 1, +1.f, -1.f, 0, 1, +1.f, +1.f, 0, 1, }; glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(quad), quad, GL_STATIC_DRAW); glEnableVertexAttribArray(shader->position_attribute); glVertexAttribPointer(shader->position_attribute, 4, GL_FLOAT, GL_FALSE, 0, 0); return true; }
void rcv_file_delete (struct htlc_conn *htlc) { u_int16_t fnlen = 0; char dir[MAXPATHLEN], filename[NAME_MAX], oldbuf[MAXPATHLEN]; char rsrcpath_old[MAXPATHLEN]; struct stat sb, rsb; int err; dir[0] = 0; dh_start(htlc) switch (dh_type) { case HTLC_DATA_FILE_NAME: fnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(filename, dh_data, fnlen); break; case HTLC_DATA_DIR: if ((err = hldir_to_path(dh, ROOTDIR, dir, dir))) { snd_strerror(htlc, err); return; } break; } dh_end() if (!fnlen && !dir[0]) { hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, 6, "huh?!?"); return; } if (dir[0]) { if (fnlen) snprintf(oldbuf, sizeof(oldbuf), "%s/%s", dir, filename); else strcpy(oldbuf, dir); } else { snprintf(oldbuf, sizeof(oldbuf), "%s/%s", ROOTDIR, filename); } if (check_dropbox(htlc, oldbuf)) { snd_strerror(htlc, EPERM); return; } if (log_delete) hxd_log("%s:%s:%u - delete %s", htlc->name, htlc->login, htlc->uid, oldbuf); if (SYS_lstat(oldbuf, &sb)) { snd_strerror(htlc, errno); return; } #if defined(CONFIG_HFS) if (!hxd_cfg.operation.hfs) goto skiphfs; if (hxd_cfg.files.fork == HFS_FORK_CAP) { if (!S_ISDIR(sb.st_mode) && !resource_path(rsrcpath_old, oldbuf, &rsb) && !S_ISDIR(rsb.st_mode)) { if (unlink(rsrcpath_old)) { snd_strerror(htlc, errno); return; } } } if (!finderinfo_path(rsrcpath_old, oldbuf, &rsb)) { if (unlink(rsrcpath_old)) { snd_strerror(htlc, errno); return; } } skiphfs: #endif /* CONFIG_HFS */ if (S_ISDIR(sb.st_mode) && !S_ISLNK(sb.st_mode)) err = recursive_rmdir(oldbuf); else err = unlink(oldbuf); if (err) snd_strerror(htlc, errno); else hlwrite(htlc, HTLS_HDR_TASK, 0, 0); }
void rcv_file_symlink (struct htlc_conn *htlc) { u_int16_t fnlen = 0, newfnlen = 0; char dir[MAXPATHLEN], newdir[MAXPATHLEN], filename[NAME_MAX], newfilename[NAME_MAX], oldbuf[MAXPATHLEN], newbuf[MAXPATHLEN]; char rsrcpath_old[MAXPATHLEN], rsrcpath_new[MAXPATHLEN]; struct stat rsb; int err; dir[0] = newdir[0] = 0; dh_start(htlc) switch (dh_type) { case HTLC_DATA_FILE_NAME: fnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(filename, dh_data, fnlen); break; case HTLC_DATA_FILE_RENAME: newfnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(newfilename, dh_data, newfnlen); break; case HTLC_DATA_DIR: if ((err = hldir_to_path(dh, ROOTDIR, dir, dir))) { snd_strerror(htlc, err); return; } break; case HTLC_DATA_DIR_RENAME: if ((err = hldir_to_path(dh, ROOTDIR, newdir, newdir))) { snd_strerror(htlc, err); return; } break; } dh_end() if ((!dir[0] && !fnlen) || !newdir[0]) { hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, 6, "huh?!?"); return; } if (!dir[0]) strcpy(dir, ROOTDIR); if (fnlen) { snprintf(oldbuf, sizeof(oldbuf), "%s/%s", dir, filename); snprintf(newbuf, sizeof(newbuf), "%s/%s", newdir, newfnlen ? newfilename : filename); } else { strcpy(oldbuf, dir); strcpy(newbuf, newdir); } if (check_dropbox(htlc, oldbuf)) { snd_strerror(htlc, EPERM); return; } if (log_symlink) hxd_log("%s:%s:%u - symlink %s to %s", htlc->name, htlc->login, htlc->uid, newbuf, oldbuf); if (sys_symlink(oldbuf, newbuf)) snd_strerror(htlc, errno); else hlwrite(htlc, HTLS_HDR_TASK, 0, 0); #if defined(CONFIG_HFS) if (!hxd_cfg.operation.hfs) return; if (hxd_cfg.files.fork == HFS_FORK_CAP) { if (!resource_path(rsrcpath_old, oldbuf, &rsb)) { if ((err = resource_path(rsrcpath_new, newbuf, 0))) { /* (void)unlink(newbuf); */ snd_strerror(htlc, err); return; } else { if (sys_symlink(rsrcpath_old, rsrcpath_new)) { /* (void)unlink(newbuf); */ snd_strerror(htlc, errno); return; } } } } if (!finderinfo_path(rsrcpath_old, oldbuf, &rsb)) { if ((err = finderinfo_path(rsrcpath_new, newbuf, 0))) { /* (void)unlink(newbuf); */ snd_strerror(htlc, err); return; } else { if (sys_symlink(rsrcpath_old, rsrcpath_new)) { /* (void)unlink(newbuf); */ snd_strerror(htlc, errno); return; } } } #endif /* CONFIG_HFS */ }
void rcv_file_move (struct htlc_conn *htlc) { u_int16_t fnlen = 0; char dir[MAXPATHLEN], newdir[MAXPATHLEN], filename[NAME_MAX], oldbuf[MAXPATHLEN], newbuf[MAXPATHLEN]; char rsrcpath_old[MAXPATHLEN], rsrcpath_new[MAXPATHLEN]; struct stat sb, rsb; int err; dev_t diff_device; dir[0] = newdir[0] = 0; dh_start(htlc) switch (dh_type) { case HTLC_DATA_FILE_NAME: fnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(filename, dh_data, fnlen); break; case HTLC_DATA_DIR: if ((err = hldir_to_path(dh, ROOTDIR, dir, dir))) { snd_strerror(htlc, err); return; } break; case HTLC_DATA_DIR_RENAME: if ((err = hldir_to_path(dh, ROOTDIR, newdir, newdir))) { snd_strerror(htlc, err); return; } break; } dh_end() if ((!dir[0] && !fnlen) || !newdir[0]) { hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, 6, "huh?!?"); return; } if (!dir[0]) strcpy(dir, ROOTDIR); if (fnlen) { snprintf(oldbuf, sizeof(oldbuf), "%s/%s", dir, filename); snprintf(newbuf, sizeof(newbuf), "%s/%s", newdir, filename); } else { strcpy(oldbuf, dir); strcpy(newbuf, newdir); } if (check_dropbox(htlc, oldbuf) || check_dropbox(htlc, newbuf)) { snd_strerror(htlc, EPERM); return; } if (stat(oldbuf, &sb)) { snd_strerror(htlc, errno); return; } if (S_ISDIR(sb.st_mode)) { if (!htlc->access.move_folders) { snd_strerror(htlc, EPERM); return; } } else { if (!htlc->access.move_files) { snd_strerror(htlc, EPERM); return; } } if (log_move) hxd_log("%s:%s:%u - move %s to %s", htlc->name, htlc->login, htlc->uid, oldbuf, newbuf); diff_device = sb.st_dev; if (stat(newdir, &sb)) { snd_strerror(htlc, errno); return; } #if 0 /* gcc on hpux does not like this */ diff_device &= ~sb.st_dev; #else diff_device = diff_device != sb.st_dev; #endif if (diff_device ? copy_and_unlink(oldbuf, newbuf) : rename(oldbuf, newbuf)) { snd_strerror(htlc, errno); return; } #if defined(CONFIG_HFS) if (!hxd_cfg.operation.hfs) goto ret; if (hxd_cfg.files.fork == HFS_FORK_CAP) { if (!resource_path(rsrcpath_old, oldbuf, &rsb)) { if ((err = resource_path(rsrcpath_new, newbuf, 0))) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, err); return; } else { if (diff_device ? copy_and_unlink(rsrcpath_old, rsrcpath_new) : rename(rsrcpath_old, rsrcpath_new)) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, errno); return; } } } } if (!finderinfo_path(rsrcpath_old, oldbuf, &rsb)) { if ((err = finderinfo_path(rsrcpath_new, newbuf, 0))) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, err); return; } else { if (diff_device ? copy_and_unlink(rsrcpath_old, rsrcpath_new) : rename(rsrcpath_old, rsrcpath_new)) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, errno); return; } } } ret: #endif /* CONFIG_HFS */ hlwrite(htlc, HTLS_HDR_TASK, 0, 0); }
void rcv_file_setinfo (struct htlc_conn *htlc) { u_int16_t fnlen = 0, newfnlen = 0, comlen = 0; char dir[MAXPATHLEN], oldbuf[MAXPATHLEN], newbuf[MAXPATHLEN], filename[NAME_MAX], newfilename[NAME_MAX]; char rsrcpath_old[MAXPATHLEN], rsrcpath_new[MAXPATHLEN]; u_int8_t comment[200]; struct stat sb; int err; dir[0] = 0; dh_start(htlc) switch (dh_type) { case HTLC_DATA_FILE_NAME: fnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(filename, dh_data, fnlen); break; case HTLC_DATA_FILE_RENAME: newfnlen = dh_len >= NAME_MAX ? NAME_MAX - 1 : dh_len; read_filename(newfilename, dh_data, newfnlen); break; case HTLC_DATA_DIR: if ((err = hldir_to_path(dh, ROOTDIR, dir, dir))) { snd_strerror(htlc, err); return; } break; case HTLC_DATA_FILE_COMMENT: comlen = dh_len > 255 ? 255 : dh_len; memcpy(comment, dh_data, comlen); break; } dh_end() if (!fnlen || (!newfnlen && !comlen)) { hlwrite(htlc, HTLS_HDR_TASK, 1, 1, HTLS_DATA_TASKERROR, 6, "huh?!?"); return; } snprintf(oldbuf, sizeof(oldbuf), "%s/%s", dir[0] ? dir : ROOTDIR, filename); if (stat(oldbuf, &sb)) { snd_strerror(htlc, errno); return; } if (check_dropbox(htlc, oldbuf)) { snd_strerror(htlc, EPERM); return; } #if defined(CONFIG_HFS) if (hxd_cfg.operation.hfs && comlen) { if (S_ISDIR(sb.st_mode)) { if (!htlc->access.comment_folders) { snd_strerror(htlc, EPERM); return; } } else { if (!htlc->access.comment_files) { snd_strerror(htlc, EPERM); return; } } if (log_comment) hxd_log("%s:%s:%u - comment %s to %.*s", htlc->name, htlc->login, htlc->uid, oldbuf, comlen, comment); comment_write(oldbuf, comment, comlen); } #endif if (!newfnlen) goto ret; if (dir[0]) snprintf(newbuf, sizeof(newbuf), "%s/%s", dir, newfilename); else snprintf(newbuf, sizeof(newbuf), "%s/%s", ROOTDIR, newfilename); if (S_ISDIR(sb.st_mode)) { if (!htlc->access.rename_folders) { snd_strerror(htlc, EPERM); return; } } else { if (!htlc->access.rename_files) { snd_strerror(htlc, EPERM); return; } } if (log_rename) hxd_log("%s:%s:%u - rename %s to %s", htlc->name, htlc->login, htlc->uid, oldbuf, newbuf); if (rename(oldbuf, newbuf)) { snd_strerror(htlc, errno); return; } #if defined(CONFIG_HFS) if (!hxd_cfg.operation.hfs) goto ret; if (hxd_cfg.files.fork == HFS_FORK_CAP) { if (!resource_path(rsrcpath_old, oldbuf, &sb)) { if ((err = resource_path(rsrcpath_new, newbuf, 0))) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, err); return; } else { if (rename(rsrcpath_old, rsrcpath_new)) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, errno); return; } } } } if (!finderinfo_path(rsrcpath_old, oldbuf, &sb)) { if ((err = finderinfo_path(rsrcpath_new, newbuf, 0))) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, err); return; } else { if (rename(rsrcpath_old, rsrcpath_new)) { /* (void)rename(newbuf, oldbuf); */ snd_strerror(htlc, errno); return; } } } #endif /* CONFIG_HFS */ ret: hlwrite(htlc, HTLS_HDR_TASK, 0, 0); }