Exemple #1
0
int svrapp::stop_realplay_reqx(param_list * pl){
	
	log_out(log_debug, "stop_realplay_req::%s\n", pl->content);
	realplay_info * rpif = (realplay_info*)pl->n->get_context();
	
	char new_serial[128] = {0};
	create_serial(rpif->get_id(), pl->serial, new_serial, sizeof(new_serial));
	
	handle_stop_realplay(rpif,new_serial);
	
	return 0;
}
Exemple #2
0
static struct object *create_file( const char *nameptr, data_size_t len, unsigned int access,
                                   unsigned int sharing, int create, unsigned int options,
                                   unsigned int attrs )
{
    struct object *obj = NULL;
    struct fd *fd;
    int flags;
    char *name;
    mode_t mode;

    if (!(name = mem_alloc( len + 1 ))) return NULL;
    memcpy( name, nameptr, len );
    name[len] = 0;

    switch(create)
    {
    case FILE_CREATE:       flags = O_CREAT | O_EXCL; break;
    case FILE_OVERWRITE_IF: /* FIXME: the difference is whether we trash existing attr or not */
    case FILE_SUPERSEDE:    flags = O_CREAT | O_TRUNC; break;
    case FILE_OPEN:         flags = 0; break;
    case FILE_OPEN_IF:      flags = O_CREAT; break;
    case FILE_OVERWRITE:    flags = O_TRUNC; break;
    default:                set_error( STATUS_INVALID_PARAMETER ); goto done;
    }

    mode = (attrs & FILE_ATTRIBUTE_READONLY) ? 0444 : 0666;

    if (len >= 4 &&
        (!strcasecmp( name + len - 4, ".exe" ) || !strcasecmp( name + len - 4, ".com" )))
        mode |= 0111;

    access = generic_file_map_access( access );

    /* FIXME: should set error to STATUS_OBJECT_NAME_COLLISION if file existed before */
    fd = open_fd( name, flags | O_NONBLOCK | O_LARGEFILE, &mode, access, sharing, options );
    if (!fd) goto done;

    if (S_ISDIR(mode))
        obj = create_dir_obj( fd );
    else if (S_ISCHR(mode) && is_serial_fd( fd ))
        obj = create_serial( fd, options );
    else
        obj = create_file_obj( fd, access, options );

    release_object( fd );

done:
    free( name );
    return obj;
}
Exemple #3
0
int svrapp::client_req(param_list * pl){

	ipaddr &peeraddr = pl->n->get_peeraddr();
	
	log_out(log_debug, "client_req::%s..%s\n", peeraddr.ip, pl->content);

	cnt_info * c = (cnt_info*)pl->n->get_context();
	if (!c){
		cJSON * jsfrom = cJSON_GetObjectItem(pl->jsdata, "from");
		if(!jsfrom || jsfrom->type != cJSON_String 
		  || strcmp(jsfrom->valuestring, "web")){
			log_out(log_debug, "client_req::no permission\n");
			post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_NO_PERMISSION, "no permission");
			return -1;
		}
		else{
			c = new cnt_info(cnt_type);
			c->parse_token(NULL) ;
			pl->n->set_context(c);
			m_cntmap[c->get_id()] = pl->n;
		}
	}
	
	cJSON * jsdev = cJSON_GetObjectItem(pl->jsdata, "device_id");
	if(!jsdev || jsdev->type != cJSON_Number){
		log_out(log_error, "client_req::invalid device(%s)\n", pl->content);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_PARAM, "device id invalid");
		return -1;
	}

	std::map<uint, app_connection*>::iterator it = m_devmap.find(jsdev->valueuint);
	if(it == m_devmap.end()){
		log_out(log_error, "client_req::device(%u) off line\n",jsdev->valueuint);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline");
		return -1;
	}	

	char new_serial[128] = {0};
	create_serial(c->get_id(), pl->serial, new_serial, sizeof(new_serial));
	char * out = cJSON_PrintUnformatted(pl->jsdata);
	
	app_connection * dn = it->second;
	post_req(dn, pl->cmd, out, new_serial);
	free(out);

	return 0;
}
Exemple #4
0
bool
TPUARTwrap::setup()
{
  ackallgroup = cfg->value("ack-group",false);
  ackallindividual = cfg->value("ack-individual",false);
  monitor = cfg->value("monitor",false);

  if (cfg->value("device","").length() > 0)
    {
      if (cfg->value("ip-address","").length() > 0 ||
          cfg->value("port",-1) != -1)
        {
          ERRORPRINTF (t, E_ERROR, "Don't specify both device and IP options!");
          return false;
        }
      iface = create_serial(this, cfg);
    }
  else
    {
      if (cfg->value("baudrate",-1) != -1)
        {
          ERRORPRINTF (t, E_ERROR, "Don't specify both device and IP options!");
          return false;
        }
      iface = new LLtcp(this, cfg);
    }

  if (t->ShowPrint(0))
    iface = new LLlog (this,cfg, iface);

  FilterPtr single = findFilter("single");
  if (single != nullptr)
    {
      std::shared_ptr<NatL2Filter> f = std::dynamic_pointer_cast<NatL2Filter>(single);
      if (f)
        my_addr = f->addr;
    }
  
  if (!LowLevelFilter::setup())
    return false;

  return true;
}
Exemple #5
0
static struct object *create_file( struct fd *root, const char *nameptr, data_size_t len,
                                   unsigned int access, unsigned int sharing, int create,
                                   unsigned int options, unsigned int attrs,
                                   const struct security_descriptor *sd )
{
    struct object *obj = NULL;
    struct fd *fd;
    int flags;
    char *name;
    mode_t mode;

    if (!len || ((nameptr[0] == '/') ^ !root))
    {
        set_error( STATUS_OBJECT_PATH_SYNTAX_BAD );
        return NULL;
    }
    if (!(name = mem_alloc( len + 1 ))) return NULL;
    memcpy( name, nameptr, len );
    name[len] = 0;

    switch(create)
    {
    case FILE_CREATE:       flags = O_CREAT | O_EXCL; break;
    case FILE_OVERWRITE_IF: /* FIXME: the difference is whether we trash existing attr or not */
                            access |= FILE_WRITE_ATTRIBUTES;
    case FILE_SUPERSEDE:    flags = O_CREAT | O_TRUNC; break;
    case FILE_OPEN:         flags = 0; break;
    case FILE_OPEN_IF:      flags = O_CREAT; break;
    case FILE_OVERWRITE:    flags = O_TRUNC;
                            access |= FILE_WRITE_ATTRIBUTES; break;
    default:                set_error( STATUS_INVALID_PARAMETER ); goto done;
    }

    if (sd)
    {
        const SID *owner = sd_get_owner( sd );
        if (!owner)
            owner = token_get_user( current->process->token );
        mode = sd_to_mode( sd, owner );
    }
    else if (options & FILE_DIRECTORY_FILE)
        mode = (attrs & FILE_ATTRIBUTE_READONLY) ? 0555 : 0777;
    else
        mode = (attrs & FILE_ATTRIBUTE_READONLY) ? 0444 : 0666;

    if (len >= 4 &&
        (!strcasecmp( name + len - 4, ".exe" ) || !strcasecmp( name + len - 4, ".com" )))
    {
        if (mode & S_IRUSR)
            mode |= S_IXUSR;
        if (mode & S_IRGRP)
            mode |= S_IXGRP;
        if (mode & S_IROTH)
            mode |= S_IXOTH;
    }

    access = generic_file_map_access( access );

    /* FIXME: should set error to STATUS_OBJECT_NAME_COLLISION if file existed before */
    fd = open_fd( root, name, flags | O_NONBLOCK | O_LARGEFILE, &mode, access, sharing, options );
    if (!fd) goto done;

    if (S_ISDIR(mode))
        obj = create_dir_obj( fd, access, mode );
    else if (S_ISCHR(mode) && is_serial_fd( fd ))
        obj = create_serial( fd );
    else
        obj = create_file_obj( fd, access, mode );

    release_object( fd );

done:
    free( name );
    return obj;
}
Exemple #6
0
/*
{
	"serial":"",
	"cmd":"start_realpaly_req",
	"data":{
		"token":"",
		"channel":0,
		"sub_channel":0,
	}
}*/
int svrapp::start_realplay_reqx(param_list * pl){

	realplay_info * rpif = (realplay_info*)pl->n->get_context();
	if(!rpif){
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_NO_SUPPORT, "try again");
		log_out(log_error, "start_realplay_reqx::unknow error\n");
		return -1;
	}
	
	if(rpif->is_playing()){
		rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_NO_SUPPORT, "is playing");
		log_out(log_error, "start_realplay_reqx::is playing\n");
		return -1;
	}
	
	stream_key  * stmkey = rpif->get_stream_key();
	uint64 key64 = rpif->get_key64();
	
	//find dev
	std::map<uint, app_connection*>::iterator it = m_devmap.find(stmkey->device_id);
	if(it == m_devmap.end()){
		log_out(log_error, "start_realpaly_req::device(%u) off line\n", stmkey->device_id);
		rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline");
		return -1;
	}
	
	std::map<uint, app_connection*>::iterator it1 = m_cntmap.find(rpif->get_id());
	if(it1 == m_cntmap.end() ){
		m_cntmap[rpif->get_id()] = pl->n;
	}

	//判断是否已经在播放
	std::map<uint64, stream_info*>::iterator it0 = m_realplaymap.find(key64);
	if(it0 != m_realplaymap.end()){
		stream_info * stmif = it0->second;
		stmif->add(rpif->get_id(), pl->n);
		
		rpif->reset_resource();
		rpif->set_playing();
		rpif->post_ack(pl->ack_cmd, pl->serial, ERROR_OK, "ok");
		log_out(log_debug, "start_realpaly_req::appid(%d) stream(%llX) already playing, clients(%u)\n",
		get_appid(), key64, stmif->client_number());		
		return 0;
	}
	else{
		stream_info * stmif = new stream_info(stm_type, stmkey);
		m_realplaymap[key64] = stmif;
		stmif->add(rpif->get_id(), pl->n);
	}

	rpif->reset_resource();
	rpif->set_playing();
	
	///add realplay server
	char serverAddr[64] = {0};
	sprintf(serverAddr, "%s:%d",g_sdr->self_ipaddr.ip, g_sdr->self_ipaddr.port);
	cJSON_AddStringToObject(pl->jsdata, "server", serverAddr);
	cJSON_AddStringToObject(pl->jsdata, "transport_protocol", "tcp");
	
	//generate token
	char token[128] = {0};
	sprintf(token, "%08X%04X%04X", stmkey->device_id, stmkey->chn, stmkey->sub_chn);
	cJSON_DeleteItemFromObject(pl->jsdata, "token");
	cJSON_AddStringToObject(pl->jsdata, "token", token);
	
	
	//send request to mgr
	char new_serial[128] = {0};
	create_serial(rpif->get_id(), pl->serial, new_serial, sizeof(new_serial));
	char * out = cJSON_PrintUnformatted(pl->jsdata);
	log_out(log_debug, "start_realpaly_req::appid(%d) %s\n",get_appid(),  out);
		
	app_connection * dn = it->second;
	post_req(dn, pl->cmd, out, new_serial);
	free(out);
	return 0;
}
Exemple #7
0
int svrapp::client_req(param_list * pl){

	ipaddr &peeraddr = pl->n->get_peeraddr();
	log_out(log_debug, "client_req::%s..%s\n", peeraddr.ip, pl->content);

	cnt_info * cif = (cnt_info*)pl->n->get_context();
	if (!cif){
		cif = new cnt_info(cnt_type);
		cif->parse_token(NULL) ;
		pl->n->set_context(cif);
		m_cntmap[cif->get_numkey()] = pl->n;
	}
	
	cJSON * jsdev = cJSON_GetObjectItem(pl->jsdata, "device_id");
	if(!jsdev || jsdev->type != cJSON_Number){
		log_out(log_error, "client_req::invalid device(%s)\n", pl->content);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_PARAM, "device_id invalid");
		return -1;
	}
    
    uint platform = get_platform_code_delete_item(pl->jsdata);
    
    char devkey[strkey_len] = {0};
    create_devkey(platform, jsdev->valueuint64, devkey);

	std::map<strkey_t, app_connection*>::iterator it = m_devmap.find(devkey);
	if(it == m_devmap.end()){
		log_out(log_error, "client_req::device(%s) off line\n", devkey);
		post_ack(pl->n, pl->ack_cmd, pl->serial, ERROR_DEV_OFFLINE, "device is offline");
		return -1;
	}	
	
	//***********save cmd****************
    //here fixed
	int channel = 0;
	cJSON * jschn = cJSON_GetObjectItem(pl->jsdata, "channel");
	if(jschn && jschn->type == cJSON_Number){
		channel = jschn->valueint;
	}

    char chnkey[strkey_len] = {0};
    create_chnkey(devkey, channel, chnkey);
    
	int index = hash_key(jsdev->valueuint64, max_group_count);
	std::map<strkey_t, cmd_s> & temp = m_cmds_map[index];
	std::map<strkey_t, cmd_s>::iterator it1 = temp.find(chnkey);
	if(it1 == temp.end()){
		cmd_s cs;
		memset(&cs, 0, sizeof(cs));
		it1 = temp.insert(std::make_pair(chnkey, cs)).first;	
	}
	cmd_s &cs = it1->second;
	cs.last_cmd_time = (uint)time(NULL);
	strncpy(cs.last_cmd, pl->cmd, sizeof(cs.last_cmd) -1 );
	//***********save cmd****************

    //create_serial
	char new_serial[128] = {0};
	create_serial(cif->get_numkey(), pl->serial, new_serial, sizeof(new_serial));
    
    //create devkey
    cJSON_DeleteItemFromParent(pl->jsdata, jsdev);
    cJSON_AddStringToObject(pl->jsdata, "devkey", devkey);
	char * out = cJSON_PrintUnformatted(pl->jsdata);
	
	app_connection * dn = it->second;
	post_req(dn, pl->cmd, out, new_serial);
	free(out);

	return 0;
}