tERROR cTmProfile::UnlockTask() { if( !m_lockRef ) return errUNEXPECTED; if( --m_lockRef && !m_bFailOver ) return (m_lockRef > 1) ? errOBJECT_ALREADY_EXISTS : errOK; m_taskRef.lock(false); m_taskObj = NULL; m_remoteTask = NULL; m_taskRef.unlock(false); if( m_task ) { if( m_cfg.m_bRemote ) m_tm->DestroyRemoteTask(m_task); else m_task->sysCloseObject(); m_task = NULL; m_processId = PR_PROCESS_LOCAL; } close_object(m_token); PR_TRACE((m_tm, prtIMPORTANT, "tm\t%S - task closed (ref=%d)", m_sName.data(), m_ref)); LockTaskReports(false); if( isService() && m_bClone ) Delete(); Release(); return errOK; }
tERROR cTmProfile::CreateTask() { if( !m_iid || m_bTaskGroup && !isService() && m_cfg.m_bRemote ) return errOK; tERROR err = errOK; cAutoObj<cObj> task; PR_TRACE((m_tm, prtIMPORTANT, "tm\t%S - creating task...", m_sName.data())); if( m_cfg.m_bRemote ) err = m_tm->CreateRemoteTask(this, task); else err = m_host->sysCreateObject((cObj**)&task, m_iid, m_pid); if( PR_SUCC(err) ) { tDWORD nActivityId = m_dad && m_dad->m_dad ? m_dad->id() : id(); task->propSetDWord( pgTASK_ID, id() ); task->propSetDWord( pgTASK_PARENT_ID, nActivityId ); task->propSetDWord( m_tm->m_prop_taskid, nActivityId ); m_sType.copy( task, m_tm->m_prop_task_type ); m_sName.copy( task, m_tm->m_prop_profile ); InitDataStorage(task); err = AttachTask(task); } if( PR_SUCC(err) ) task.relinquish(); else PR_TRACE((m_tm, prtERROR, "tm\t%S - cannot create task object - %terr", m_sName.data(), err)); return err; }
void MyFmsNotifyEvent::notify() const { switch(m_pAev->getType()) { case IFmsAuthEvent::E_PLAY: { char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME); char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST); char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI); ///new prtmp fields I8 sValue; if (getI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP, sValue)) { bool isProtected = sValue != 0; } char* pCommonKeyPath = getStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_COMMON_KEY_FILE); U32 u32Value; if (getU32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_VIDEO_ENC_LEVEL, u32Value)) { U32 videoEncyption = u32Value; } I32 iValue; if (getI32Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_UPDATE_INTERVAL, iValue)) { I32 updateInterval = iValue; } if (getI8Field(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_VERIFICATION, sValue)) { bool isPrtmpSwf = sValue != 0; } char* pWhiteListPath = getStringField(m_pAev, IFmsAuthEvent::F_APP_PRTMP_SWF_WHITELIST_FOLDER); //////// char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP); char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI); char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI); char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST); char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER); char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL); char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT); char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS); char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS); char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS); char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS); char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO); char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM); char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME); char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE); char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY); char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH); if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_CODECS, iValue)) { bool bADPCM = isADPCMSupported(iValue); } if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_CODECS, iValue)) { bool bVP6 = isVP6Supported(iValue); } if (getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_TYPE, iValue)) { bool bService = isService(iValue); } if (getI32Field(m_pAev, IFmsAuthEvent::F_STREAM_ID, iValue)) { I32 iStreamId = iValue; } float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_LENGTH, fValue)) { float fLength = fValue; // in seconds } if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_POSITION, fValue)) { float iPosition = fValue; // in seconds } I64 lValue; if (getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_ID, lValue)) { I64 iClientId = lValue; } if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SECURE, sValue)) { bool bSecure = sValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AMF_ENCODING, sValue)) { bool bAMF3 = isAMF3(sValue); } if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS_LOCK, sValue)) { bool bRead = sValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS_LOCK, sValue)) { bool bWrite = sValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS_LOCK, sValue)) { bool bAudioRead = sValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS_LOCK, sValue)) { bool bVideoRead = sValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_RESET, sValue)) { bool bReset = sValue != 0; } if (getI8Field(m_pAev, IFmsAuthEvent::F_STREAM_IGNORE, sValue)) { bool bIgnore = sValue != 0; } } break; case IFmsAuthEvent::E_SEEK: { float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_SEEK_POSITION, fValue)) { float fSeekTime = fValue; } // Disconnect Action example: disconnect the client that was // specified by the E_SEEK notify event FmsVariant field; if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS) { IFmsDisconnectAction* pAction = const_cast<IFmsAuthEvent*>(m_pAev)-> addDisconnectAction("Seek is not allowed. Blocked by adaptor"); pAction->setClientId(field); } } break; case IFmsAuthEvent::E_CODEC_CHANGE: { char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME); char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST); char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI); char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP); char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI); char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI); char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST); char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER); char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL); char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT); char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS); char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS); char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS); char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS); char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO); char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM); char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME); char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE); char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY); char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH); U16 fType; if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC_TYPE, fType)) { U16 streamCodecType = fType; if (streamCodecType == kVIDEO_CODEC) { U16 fValue; if (getU16Field(m_pAev, IFmsAuthEvent::F_STREAM_CODEC, fValue)) { U16 streamCodecValue = fValue; if (streamCodecValue == VIDEO_CODEC_SORENSON) { // Disconnect Action example: Disallow clients trying // to publish content with the sorenson video codec. FmsVariant field; if (m_pAev->getField(IFmsAuthEvent::F_CLIENT_ID, field) == IFmsAuthEvent::S_SUCCESS) { IFmsDisconnectAction* pAction = const_cast<IFmsAuthEvent*>(m_pAev)-> addDisconnectAction("Sorenson is not allowed. Blocked by adaptor"); pAction->setClientId(field); } } } } } } break; case IFmsAuthEvent::E_RECORD_STOP: { char* pAppName = getStringField(m_pAev, IFmsAuthEvent::F_APP_NAME); char* pAppInst = getStringField(m_pAev, IFmsAuthEvent::F_APP_INST); char* pAppUri = getStringField(m_pAev, IFmsAuthEvent::F_APP_URI); char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP); char* pClUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI); char* pClNewUri = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REDIRECT_URI); char* pClVhost = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VHOST); char* pClRef = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_REFERRER); char* pClPurl = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PAGE_URL); char* pClAgent = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_USER_AGENT); char* pClRAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_READ_ACCESS); char* pClWAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_WRITE_ACCESS); char* pClAudioAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_AUDIO_SAMPLE_ACCESS); char* pClVideoAccess = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_VIDEO_SAMPLE_ACCESS); char* pClProto = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_PROTO); char* pClUstem = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_URI_STEM); char* pStreamName = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_NAME); char* pStreamType = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_TYPE); char* pStreamQuery = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_QUERY); char* pStreamPath = getStringField(m_pAev, IFmsAuthEvent::F_STREAM_PATH); float fValue; if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXSIZE, fValue)) { float recMaxSize = fValue; // in kilobytes } if (getFloatField(m_pAev, IFmsAuthEvent::F_STREAM_RECORD_MAXDURATION, fValue)) { float recMaxDuration = fValue; // in seconds } } break; case IFmsAuthEvent::E_SWF_VERIFY_COMPLETE: { char* pClIp = getStringField(m_pAev, IFmsAuthEvent::F_CLIENT_IP); I8 version; // version of SWF verification getI8Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_VERSION, version); I64 depth; // depth in the SWF file hashed getI64Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DEPTH, depth); I32 ttl; // time to live of the SWF hash provided getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_TTL, ttl); // digest provided to match against U8* buffer = getBufferField(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_DIGEST); // result of the attempted match-- see FmsAuthEvents.h enum // eSWFMatch for the meaning of this field I32 match; getI32Field(m_pAev, IFmsAuthEvent::F_CLIENT_SWFV_RESULT, match); std::stringstream stream; stream << "swf verification for client: " << std::string(pClIp) << " is complete, the result is: " << match; m_pFmsAuthServerContext->log(stream.str().c_str(), IFmsServerContext::kInformation, false); } break; case IFmsAuthEvent::E_APPSTART: case IFmsAuthEvent::E_APPSTOP: case IFmsAuthEvent::E_CONNECT: case IFmsAuthEvent::E_DISCONNECT: case IFmsAuthEvent::E_FILENAME_TRANSFORM: case IFmsAuthEvent::E_STOP: case IFmsAuthEvent::E_PAUSE: case IFmsAuthEvent::E_PUBLISH: case IFmsAuthEvent::E_UNPUBLISH: case IFmsAuthEvent::E_LOADSEGMENT: case IFmsAuthEvent::E_ACTION: case IFmsAuthEvent::E_RECORD: case IFmsAuthEvent::E_CLIENT_PAUSE: case IFmsAuthEvent::E_SWF_VERIFY: case IFmsAuthEvent::E_CLIENT_SEEK: case IFmsAuthEvent::E_START_TRANSMIT: case IFmsAuthEvent::E_STOP_TRANSMIT: case IFmsAuthEvent::E_MAXEVENT: break; } char buf[1024]; sprintf(buf, "Received notification type=%d id=%p\n", m_pAev->getType(), m_pAev); // log to the configured FMS log directory. If the third parameter is true, // also send the log to the system event log. m_pFmsAuthServerContext->log(buf, IFmsServerContext::kInformation, false); m_pFmsAuthServerContext->onNotify(m_pAev); }
/* Parse and check command line parameters. Return config file name or NULL * On error prints usage information and exit (see usage() function) */ char *parseargs (int argc, char *argv[]) { char *cfgfile=NULL; int i, curind; curind = 1; while ((i = getopt(argc, argv, optstring)) != -1) { switch (i) { case '-': /* GNU-style options */ if (!strcmp (argv[curind], "--help")) usage (); else #if defined (BINKD9X) if (!strcmp (argv[curind], Win9xStartService)) service_flag = w32_run_as_service; else #endif Log (0, "%s: %s: unknown command line switch", extract_filename(argv[0]), argv[curind]); break; case 'C': checkcfg_flag = 1; break; case 'c': client_flag = 1; break; case 'i': inetd_flag = 1; break; case 'a': /* remote IP address */ remote_addr = strdup(optarg); break; case 'f': /* remote FTN address */ remote_node = strdup(optarg); break; #if defined(WIN32) #if !defined (BINKD9X) case 'T': tray_flag = 1; break; #endif case 't': /* service control/query */ if (isService()) break; if ((service_flag != w32_noservice)) { Log (0, "%s: multiple '-t' switch", extract_filename(argv[0])); } if (!strcmp (optarg, "status")) service_flag = w32_queryservice; else if (!strcmp (optarg, "start")) service_flag = w32_startservice; else if (!strcmp (optarg, "stop")) service_flag = w32_stopservice; else if (!strcmp (optarg, "restart")) service_flag = w32_restartservice; else if (!strcmp (optarg, "install")) service_flag = w32_installservice; else if (!strcmp (optarg, "uninstall")) service_flag = w32_uninstallservice; else Log (0, "%s: '-t': invalid argument '%s'", extract_filename(argv[0]), optarg); break; case 'S': if (service_name) Log(0, "%s: '-S %s': service name specified before, can't overwrite!", extract_filename(argv[0]), optarg); service_name = strdup (optarg); break; #endif case 'P': /* create poll to node */ { struct maskchain new_entry; new_entry.mask = xstrdup(optarg); simplelist_add(&psPolls.linkpoint, &new_entry, sizeof(new_entry)); } break; case 'p': /* run clients and exit */ poll_flag = client_flag = 1; break; case 'q': /* quiet */ quiet_flag = 1; break; case 's': /* run server only */ server_flag = 1; break; case 'm': /* MD5 off */ no_MD5 = 1; /* fallthrough */ case 'r': /* CRYPT off */ no_crypt = 1; break; case 'v': /* verbose */ ++verbose_flag; break; case 'd': /* dump cfg */ ++dumpcfg_flag; break; #ifdef BINKD_DAEMONIZE case 'D': /* run as unix daemon */ daemon_flag = 1; break; #endif default: /* unknown parameter/option */ if (optopt != '?') /* getopt() already print error message Log (0, "%s: %s: unknown command line switch", extract_filename(argv[0]), argv[curind]); */ exit(1); case 'n': no_flag = 1; break; case 'h': /* display command line help */ usage(); } curind = optind; } if (optind<argc) cfgfile = argv[optind++]; #ifdef OS2 if (optind<argc) { if ((inetd_socket_in = atoi(argv[argc-1])) == 0 && !isdigit(argv[argc-1][0])) Log (0, "%s: bad socket number", argv[optind]); #ifdef EMX if ((inetd_socket_in = _impsockhandle (inetd_socket_in, 0)) == -1) Log (0, "_impsockhandle: %s", strerror (errno)); #endif inetd_socket_out = inetd_socket_in; argc++; } #endif if (optind<argc) Log (1, "Extra parameters ignored"); return cfgfile; }