コード例 #1
0
ファイル: Shm.cpp プロジェクト: jackaudio/jack2
    int Shm::server_initialize_shm (int new_registry) {
        int rc;
    
        jack_d("server_initialize_shm\n");
    
        if (jack_shm_header)
            return 0;        /* already initialized */
    
        if (shm_lock_registry () < 0) {
            jack_error ("jack_shm_lock_registry fails...");
            return -1;
        }
    
        rc = access_registry (&registry_info);
    
        if (new_registry) {
            remove_shm (&registry_id);
            rc = ENOENT;
        }
    
        switch (rc) {
        case ENOENT:        /* registry does not exist */
            rc = create_registry (&registry_info);
            break;
        case 0:                /* existing registry */
            if (shm_validate_registry () == 0)
                break;
            /* else it was invalid, so fall through */
        case EINVAL:            /* bad registry */
            /* Apparently, this registry was created by an older
             * JACK version.  Delete it so we can try again. */
            release_shm (&registry_info);
            remove_shm (&registry_id);
            if ((rc = create_registry (&registry_info)) != 0) {
                //jack_error ("incompatible shm registry (%s)",
                //        strerror (errno));
                jack_error ("incompatible shm registry");
//#ifndef USE_POSIX_SHM
//            jack_error ("to delete, use `ipcrm -M 0x%0.8x'", JACK_SHM_REGISTRY_KEY);
//#endif
            }
            break;
        default:            /* failure return code */
            break;
        }
    
        shm_unlock_registry ();
        return rc;
    }
コード例 #2
0
static void open_registry(void)
{
	int fd;
	int i;
	unsigned int len;
	if(regs)
	{
		printf("Multiple open_registry(>\n");
		return;
	}
	fd = open(localregpathname, O_RDONLY);
	if (fd == -1)
	{
	    printf("Creating new registry\n");
	    create_registry();
	    return;
	}
	read(fd, &reg_size, 4);
	regs=malloc(reg_size*sizeof(struct reg_value));
	head = 0;
	for(i=0; i<reg_size; i++)
	{
		read(fd,&regs[i].type,4);
		read(fd,&len,4);
		regs[i].name=malloc(len+1);
		if(regs[i].name==0)
		{
			reg_size=i+1;
			goto error;
		}
		read(fd, regs[i].name, len);
		regs[i].name[len]=0;
		read(fd,&regs[i].len,4);
		regs[i].value=malloc(regs[i].len+1);
		if(regs[i].value==0)
		{
		        free(regs[i].name);
			reg_size=i+1;
			goto error;
		}
		read(fd, regs[i].value, regs[i].len);
		regs[i].value[regs[i].len]=0;
	}
error:
	close(fd);
	return;
}
コード例 #3
0
static void init_registry(void)
{
  // can't be free-ed - it's static and probably thread
  // unsafe structure which is stored in glibc

  if( regpathname != NULL )
    localregpathname = regpathname;

  if(!open_registry(localregpathname))
    create_registry();

  // required base handles
  insert_handle((long)HKEY_LOCAL_MACHINE, "HKLM");
  insert_handle((long)HKEY_CURRENT_USER, "HKCU");

  load_registry_xml("special://xbmc/system/registry.xml");
  load_registry_xml("special://masterprofile/registry.xml");
}
コード例 #4
0
static struct reg_value* insert_reg_value(int handle, const char* name, int type, const void* value, int len)
{
	reg_handle_t* t;
	struct reg_value* v;
	char* fullname;
	if((fullname=build_keyname(handle, name))==NULL)
	{
		TRACE("Invalid handle\n");
		return NULL;
	}

	if((v=find_value_by_name(fullname))==0)
	//creating new value in registry
	{
		if(regs==0)
		    create_registry();
		regs=(struct reg_value*)realloc(regs, sizeof(struct reg_value)*(reg_size+1));
		//regs=(struct reg_value*)my_realloc(regs, sizeof(struct reg_value)*(reg_size+1));
		v=regs+reg_size;
		reg_size++;
	}
	else
	//replacing old one
	{
	    free(v->value);
	    free(v->name);
	}
	TRACE("RegInsert '%s'  %p  v:%d  len:%d\n", name, value, *(int*)value, len);
	v->type=type;
	v->len=len;
	v->value=malloc(len);
	memcpy(v->value, value, len);
	v->name=malloc(strlen(fullname)+1);
	strcpy(v->name, fullname);
        free(fullname);
	save_registry();
	return v;
}