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; }
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; }
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; }
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; }
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; }
/* { "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; }
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; }