Ejemplo n.º 1
0
	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));
	}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
 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);
 }
Ejemplo n.º 4
0
Archivo: hfs.c Proyecto: asvitkine/phxd
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;
}
Ejemplo n.º 5
0
Archivo: hfs.c Proyecto: asvitkine/phxd
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;
}
Ejemplo n.º 6
0
	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) );
		}
	}
Ejemplo n.º 7
0
/**
 * 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;
}
Ejemplo n.º 8
0
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;
}
Ejemplo n.º 9
0
Archivo: files.c Proyecto: Schala/mhxd
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);
}
Ejemplo n.º 10
0
Archivo: files.c Proyecto: Schala/mhxd
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 */
}
Ejemplo n.º 11
0
Archivo: files.c Proyecto: Schala/mhxd
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);
}
Ejemplo n.º 12
0
Archivo: files.c Proyecto: Schala/mhxd
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);
}