//************************************************************************************************************************ //* client functions //************************************************************************************************************************ int32_t constcw_client_init(struct s_client *client) { int32_t fdp[2]; client->pfd = 0; if (socketpair(PF_LOCAL, SOCK_STREAM, 0, fdp)) { cs_log("Socket creation failed (%s)", strerror(errno)); cs_exit(1); } client->udp_fd =fdp[0]; pserver = fdp[1]; memset((char *) &client->udp_sa, 0, sizeof(client->udp_sa)); SIN_GET_FAMILY(client->udp_sa) = AF_INET; // Oscam has no reader.au in s_reader like ki's mpcs ;) // reader[ridx].au = 0; // cs_log("local reader: %s (file: %s) constant cw au=0", reader[ridx].label, reader[ridx].device); cs_log("local reader: %s (file: %s) constant cw", client->reader->label, client->reader->device); client->pfd = client->udp_fd; if (constcw_file_available()) { client->reader->tcp_connected = 2; client->reader->card_status = CARD_INSERTED; } return (0); }
int32_t cs_init_log(void) { if(logStarted == 0) { pthread_mutex_init(&log_mutex, NULL); cs_pthread_cond_init(&log_thread_sleep_cond_mutex, &log_thread_sleep_cond); #if defined(WEBIF) || defined(MODULE_MONITOR) cs_lock_create(&loghistory_lock, "loghistory_lock", 5000); #endif log_list = ll_create(LOG_LIST); pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, PTHREAD_STACK_SIZE); int32_t ret = pthread_create(&log_thread, &attr, (void *)&log_list_thread, NULL); if(ret) { fprintf(stderr, "ERROR: Can't create logging thread (errno=%d %s)", ret, strerror(ret)); pthread_attr_destroy(&attr); cs_exit(1); } pthread_attr_destroy(&attr); } int32_t rc = 0; if(!cfg.disablelog) { rc = cs_open_logfiles(); } logStarted = 1; return rc; }
int32_t cs_init_log(void) { if(logStarted == 0) { init_syslog_socket(); SAFE_MUTEX_INIT_NOLOG(&log_mutex, NULL); cs_pthread_cond_init_nolog(__func__, &log_thread_sleep_cond_mutex, &log_thread_sleep_cond); #if defined(WEBIF) || defined(MODULE_MONITOR) cs_lock_create_nolog(__func__, &loghistory_lock, "loghistory_lock", 5000); #endif log_list = ll_create(LOG_LIST); int32_t ret = start_thread_nolog("logging", (void *)&log_list_thread, NULL, &log_thread, 0, 1); if(ret) { cs_exit(1); } logStarted = 1; } int32_t rc = 0; if(!cfg.disablelog) { rc = cs_open_logfiles(); } logStarted = 1; if(cfg.initial_debuglevel > 0) { cs_dblevel = cfg.initial_debuglevel; cs_log("debug_level=%d", cs_dblevel); } return rc; }
static int32_t monitor_process_request(char *req) { int32_t i, rc; static const char *cmd[] = {"login", "exit", "log", "status", "shutdown", "reload", "details", "version", "debug", "getuser", "setuser", "setserver", "commands", "keepalive", "reread" #ifdef WEBIF ,"restart" #endif }; int32_t cmdcnt = sizeof(cmd)/sizeof(char *); // Calculate the amount of items in array char *arg; struct s_client *cur_cl = cur_client(); if( (arg = strchr(req, ' ')) ) { *arg++ = 0; trim(arg); } //trim(req); if ((!cur_cl->auth) && (strcmp(req, cmd[0]))) monitor_login(NULL); for (rc=1, i = 0; i < cmdcnt; i++) if (!strcmp(req, cmd[i])) { switch(i) { case 0: monitor_login(arg); break; // login case 1: cs_exit(0); break; // exit case 2: monitor_logsend(arg); break; // log case 3: monitor_process_info(); break; // status case 4: if (cur_cl->monlvl > 3) cs_exit_oscam(); break; // shutdown case 5: if (cur_cl->monlvl > 2) cs_accounts_chk(); break; // reload case 6: monitor_process_details(arg); break; // details case 7: monitor_send_details_version(); break; // version case 8: if (cur_cl->monlvl > 3) monitor_set_debuglevel(arg); break; // debuglevel case 9: if (cur_cl->monlvl > 3) monitor_get_account(); break; // getuser case 10: if (cur_cl->monlvl > 3) monitor_set_account(arg); break; // setuser case 11: if (cur_cl->monlvl > 3) monitor_set_server(arg); break; // setserver case 12: if (cur_cl->monlvl > 3) monitor_list_commands(cmd, cmdcnt); break; // list commands case 13: if (cur_cl->monlvl > 3) monitor_send_keepalive_ack(); break; // keepalive case 14: { char buf[64];snprintf(buf, sizeof(buf), "[S-0000]reread\n");monitor_send_info(buf, 1); cs_card_info(); break; } // reread #ifdef WEBIF case 15: if (cur_cl->monlvl > 3) monitor_restart_server(); break; // keepalive #endif default: continue; } break; } return rc; }
/* Allows to kill another thread specified through the client cl with locking. If the own thread has to be cancelled, cs_exit or cs_disconnect_client has to be used. */ void kill_thread(struct s_client *cl) { if (!cl || cl->kill) return; if (cl == cur_client()) { cs_log("Trying to kill myself, exiting."); cs_exit(0); } add_job(cl, ACTION_CLIENT_KILL, NULL, 0); //add kill job, ... cl->kill=1; //then set kill flag! }
void cs_disconnect_client(struct s_client * client) { char buf[32] = { 0 }; if (IP_ISSET(client->ip)) snprintf(buf, sizeof(buf), " from %s", cs_inet_ntoa(client->ip)); cs_log("%s disconnected%s", username(client), buf); if (client == cur_client()) cs_exit(0); else kill_thread(client); }
static void radegast_auth_client(in_addr_t ip) { int32_t ok; struct s_auth *account; ok = check_ip(cfg.rad_allowed, ip); if (!ok) { cs_auth_client(cur_client(), (struct s_auth *)0, NULL); cs_exit(0); } for (ok=0, account=cfg.account; (cfg.rad_usr[0]) && (account) && (!ok); account=account->next) { ok=(!strcmp(cfg.rad_usr, account->usr)); if (ok && cs_auth_client(cur_client(), account, NULL)) cs_exit(0); } if (!ok) cs_auth_client(cur_client(), (struct s_auth *)(-1), NULL); }
int32_t main (int32_t argc, char *argv[]) { int32_t i, j; prog_name = argv[0]; if (pthread_key_create(&getclient, NULL)) { fprintf(stderr, "Could not create getclient, exiting..."); exit(1); } void (*mod_def[])(struct s_module *)= { #ifdef MODULE_MONITOR module_monitor, #endif #ifdef MODULE_CAMD33 module_camd33, #endif #ifdef MODULE_CAMD35 module_camd35, #endif #ifdef MODULE_CAMD35_TCP module_camd35_tcp, #endif #ifdef MODULE_NEWCAMD module_newcamd, #endif #ifdef MODULE_CCCAM module_cccam, #endif #ifdef MODULE_PANDORA module_pandora, #endif #ifdef MODULE_GHTTP module_ghttp, #endif #ifdef CS_CACHEEX module_csp, #endif #ifdef MODULE_GBOX module_gbox, #endif #ifdef MODULE_CONSTCW module_constcw, #endif #ifdef MODULE_RADEGAST module_radegast, #endif #ifdef MODULE_SERIAL module_serial, #endif #ifdef HAVE_DVBAPI module_dvbapi, #endif 0 }; void (*cardsystem_def[])(struct s_cardsystem *)= { #ifdef READER_NAGRA reader_nagra, #endif #ifdef READER_IRDETO reader_irdeto, #endif #ifdef READER_CONAX reader_conax, #endif #ifdef READER_CRYPTOWORKS reader_cryptoworks, #endif #ifdef READER_SECA reader_seca, #endif #ifdef READER_VIACCESS reader_viaccess, #endif #ifdef READER_VIDEOGUARD reader_videoguard1, reader_videoguard2, reader_videoguard12, #endif #ifdef READER_DRE reader_dre, #endif #ifdef READER_TONGFANG reader_tongfang, #endif #ifdef READER_BULCRYPT reader_bulcrypt, #endif #ifdef READER_GRIFFIN reader_griffin, #endif #ifdef READER_DGCRYPT reader_dgcrypt, #endif 0 }; void (*cardreader_def[])(struct s_cardreader *)= { #ifdef CARDREADER_DB2COM cardreader_db2com, #endif #if defined(CARDREADER_INTERNAL_AZBOX) cardreader_internal_azbox, #elif defined(CARDREADER_INTERNAL_COOLAPI) cardreader_internal_cool, #elif defined(CARDREADER_INTERNAL_SCI) cardreader_internal_sci, #endif #ifdef CARDREADER_PHOENIX cardreader_mouse, #endif #ifdef CARDREADER_MP35 cardreader_mp35, #endif #ifdef CARDREADER_PCSC cardreader_pcsc, #endif #ifdef CARDREADER_SC8IN1 cardreader_sc8in1, #endif #ifdef CARDREADER_SMARGO cardreader_smargo, #endif #ifdef CARDREADER_SMART cardreader_smartreader, #endif #ifdef CARDREADER_STAPI cardreader_stapi, #endif 0 }; parse_cmdline_params(argc, argv); if (bg && do_daemon(1,0)) { printf("Error starting in background (errno=%d: %s)", errno, strerror(errno)); cs_exit(1); } get_random_bytes_init(); #ifdef WEBIF if (cs_restart_mode) restart_daemon(); #endif memset(&cfg, 0, sizeof(struct s_config)); cfg.max_pending = max_pending; if (cs_confdir[strlen(cs_confdir) - 1] != '/') strcat(cs_confdir, "/"); init_signal_pre(); // because log could cause SIGPIPE errors, init a signal handler first init_first_client(); cs_lock_create(&system_lock, 5, "system_lock"); cs_lock_create(&config_lock, 10, "config_lock"); cs_lock_create(&gethostbyname_lock, 10, "gethostbyname_lock"); cs_lock_create(&clientlist_lock, 5, "clientlist_lock"); cs_lock_create(&readerlist_lock, 5, "readerlist_lock"); cs_lock_create(&fakeuser_lock, 5, "fakeuser_lock"); cs_lock_create(&ecmcache_lock, 5, "ecmcache_lock"); cs_lock_create(&readdir_lock, 5, "readdir_lock"); cs_lock_create(&cwcycle_lock, 5, "cwcycle_lock"); cs_lock_create(&hitcache_lock, 5, "hitcache_lock"); coolapi_open_all(); init_config(); cs_init_log(); if (!oscam_pidfile && cfg.pidfile) oscam_pidfile = cfg.pidfile; if (!oscam_pidfile) { oscam_pidfile = get_tmp_dir_filename(default_pidfile, sizeof(default_pidfile), "oscam.pid"); } if (oscam_pidfile) pidfile_create(oscam_pidfile); cs_init_statistics(); init_check(); init_stat(); // These initializations *MUST* be called after init_config() // because modules depend on config values. for (i=0; mod_def[i]; i++) { struct s_module *module = &modules[i]; mod_def[i](module); } for (i=0; cardsystem_def[i]; i++) { memset(&cardsystems[i], 0, sizeof(struct s_cardsystem)); cardsystem_def[i](&cardsystems[i]); } for (i=0; cardreader_def[i]; i++) { memset(&cardreaders[i], 0, sizeof(struct s_cardreader)); cardreader_def[i](&cardreaders[i]); } init_sidtab(); init_readerdb(); cfg.account = init_userdb(); init_signal(); init_srvid(); init_tierid(); init_provid(); start_garbage_collector(gbdb); cacheex_init(); init_len4caid(); init_irdeto_guess_tab(); write_versionfile(false); led_init(); led_status_default(); azbox_init(); mca_init(); global_whitelist_read(); cacheex_load_config_file(); for (i = 0; i < CS_MAX_MOD; i++) { struct s_module *module = &modules[i]; if ((module->type & MOD_CONN_NET)) { for (j = 0; j < module->ptab.nports; j++) { start_listener(module, &module->ptab.ports[j]); } } } //set time for server to now to avoid 0 in monitor/webif first_client->last=time((time_t *)0); webif_init(); start_thread((void *) &reader_check, "reader check"); cw_process_thread_start(); lcd_thread_start(); do_report_emm_support(); init_cardreader(); cs_waitforcardinit(); led_status_starting(); ac_init(); for (i = 0; i < CS_MAX_MOD; i++) { struct s_module *module = &modules[i]; if ((module->type & MOD_CONN_SERIAL) && module->s_handler) module->s_handler(NULL, NULL, i); } // main loop function process_clients(); cw_process_thread_wakeup(); // Stop cw_process thread pthread_cond_signal(&reader_check_sleep_cond); // Stop reader_check thread // Cleanup webif_close(); azbox_close(); coolapi_close_all(); mca_close(); led_status_stopping(); led_stop(); lcd_thread_stop(); remove_versionfile(); stat_finish(); cccam_done_share(); kill_all_clients(); kill_all_readers(); if (oscam_pidfile) unlink(oscam_pidfile); webif_tpls_free(); init_free_userdb(cfg.account); cfg.account = NULL; init_free_sidtab(); free_readerdb(); free_irdeto_guess_tab(); config_free(); cs_log("cardserver down"); log_free(); stop_garbage_collector(); free(first_client->account); free(first_client); // This prevents the compiler from removing config_mak from the final binary syslog_ident = config_mak; return exit_oscam; }
int32_t radegast_cli_init(struct s_client *cl) { *cl = *cl; //prevent compiler warning struct sockaddr_in loc_sa; int32_t handle; cur_client()->pfd=0; if (cur_client()->reader->r_port<=0) { cs_log("radegast: invalid port %d for server %s", cur_client()->reader->r_port, cur_client()->reader->device); return(1); } cur_client()->ip=0; memset((char *)&loc_sa,0,sizeof(loc_sa)); loc_sa.sin_family = AF_INET; #ifdef LALL if (cfg.serverip[0]) loc_sa.sin_addr.s_addr = inet_addr(cfg.serverip); else #endif loc_sa.sin_addr.s_addr = INADDR_ANY; loc_sa.sin_port = htons(cur_client()->reader->l_port); if ((cur_client()->udp_fd=socket(PF_INET, SOCK_STREAM, IPPROTO_TCP))<0) { cs_log("radegast: Socket creation failed (errno=%d %s)", errno, strerror(errno)); cs_exit(1); } #ifdef SO_PRIORITY if (cfg.netprio) setsockopt(cur_client()->udp_fd, SOL_SOCKET, SO_PRIORITY, (void *)&cfg.netprio, sizeof(uintptr_t)); #endif if (!cur_client()->reader->tcp_ito) { uint32_t keep_alive = cur_client()->reader->tcp_ito?1:0; setsockopt(cur_client()->udp_fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keep_alive, sizeof(uintptr_t)); } memset((char *)&cur_client()->udp_sa,0,sizeof(cur_client()->udp_sa)); cur_client()->udp_sa.sin_family = AF_INET; cur_client()->udp_sa.sin_port = htons((uint16_t)cur_client()->reader->r_port); cs_log("radegast: proxy %s:%d (fd=%d)", cur_client()->reader->device, cur_client()->reader->r_port, cur_client()->udp_fd); handle = network_tcp_connection_open(); if(handle < 0) return -1; cur_client()->reader->tcp_connected = 2; cur_client()->reader->card_status = CARD_INSERTED; cur_client()->reader->last_g = cur_client()->reader->last_s = time((time_t *)0); cs_debug_mask(D_CLIENT, "radegast: last_s=%d, last_g=%d", cur_client()->reader->last_s, cur_client()->reader->last_g); cur_client()->pfd=cur_client()->udp_fd; return(0); }
CsLexer* cs_lexer_new() { CsLexer* lex = cs_alloc_object(CsLexer); if (cs_unlikely(lex == NULL)) cs_exit(CS_REASON_NOMEM); return lex; }
int32_t main(int32_t argc, char *argv[]) { fix_stacksize(); run_tests(); int32_t i, j; prog_name = argv[0]; struct timespec start_ts; cs_gettime(&start_ts); // Initialize clock_type if(pthread_key_create(&getclient, NULL)) { fprintf(stderr, "Could not create getclient, exiting..."); exit(1); } void (*mod_def[])(struct s_module *) = { #ifdef MODULE_MONITOR module_monitor, #endif #ifdef MODULE_CAMD33 module_camd33, #endif #ifdef MODULE_CAMD35 module_camd35, #endif #ifdef MODULE_CAMD35_TCP module_camd35_tcp, #endif #ifdef MODULE_NEWCAMD module_newcamd, #endif #ifdef MODULE_CCCAM module_cccam, #endif #ifdef MODULE_PANDORA module_pandora, #endif #ifdef MODULE_GHTTP module_ghttp, #endif #ifdef CS_CACHEEX module_csp, #endif #ifdef MODULE_GBOX module_gbox, #endif #ifdef MODULE_CONSTCW module_constcw, #endif #ifdef MODULE_RADEGAST module_radegast, #endif #ifdef MODULE_SCAM module_scam, #endif #ifdef MODULE_SERIAL module_serial, #endif #ifdef HAVE_DVBAPI module_dvbapi, #endif 0 }; find_conf_dir(); parse_cmdline_params(argc, argv); if(bg && do_daemon(1, 0)) { printf("Error starting in background (errno=%d: %s)", errno, strerror(errno)); cs_exit(1); } get_random_bytes_init(); #ifdef WEBIF if(cs_restart_mode) { restart_daemon(); } #endif memset(&cfg, 0, sizeof(struct s_config)); cfg.max_pending = max_pending; if(cs_confdir[strlen(cs_confdir) - 1] != '/') { strcat(cs_confdir, "/"); } init_signal_pre(); // because log could cause SIGPIPE errors, init a signal handler first init_first_client(); cs_lock_create(__func__, &system_lock, "system_lock", 5000); cs_lock_create(__func__, &config_lock, "config_lock", 10000); cs_lock_create(__func__, &gethostbyname_lock, "gethostbyname_lock", 10000); cs_lock_create(__func__, &clientlist_lock, "clientlist_lock", 5000); cs_lock_create(__func__, &readerlist_lock, "readerlist_lock", 5000); cs_lock_create(__func__, &fakeuser_lock, "fakeuser_lock", 5000); cs_lock_create(__func__, &ecmcache_lock, "ecmcache_lock", 5000); cs_lock_create(__func__, &ecm_pushed_deleted_lock, "ecm_pushed_deleted_lock", 5000); cs_lock_create(__func__, &readdir_lock, "readdir_lock", 5000); cs_lock_create(__func__, &cwcycle_lock, "cwcycle_lock", 5000); init_cache(); cacheex_init_hitcache(); init_config(); cs_init_log(); init_machine_info(); init_check(); if(!oscam_pidfile && cfg.pidfile) { oscam_pidfile = cfg.pidfile; } if(!oscam_pidfile) { oscam_pidfile = get_tmp_dir_filename(default_pidfile, sizeof(default_pidfile), "oscam.pid"); } if(oscam_pidfile) { pidfile_create(oscam_pidfile); } cs_init_statistics(); coolapi_open_all(); init_stat(); ssl_init(); // These initializations *MUST* be called after init_config() // because modules depend on config values. for(i = 0; mod_def[i]; i++) { struct s_module *module = &modules[i]; mod_def[i](module); } init_sidtab(); init_readerdb(); cfg.account = init_userdb(); init_signal(); init_provid(); init_srvid(); init_tierid(); init_fakecws(); start_garbage_collector(gbdb); cacheex_init(); init_len4caid(); init_irdeto_guess_tab(); write_versionfile(false); led_init(); led_status_default(); azbox_init(); mca_init(); global_whitelist_read(); ratelimit_read(); for(i = 0; i < CS_MAX_MOD; i++) { struct s_module *module = &modules[i]; if((module->type & MOD_CONN_NET)) { for(j = 0; j < module->ptab.nports; j++) { start_listener(module, &module->ptab.ports[j]); } } } //set time for server to now to avoid 0 in monitor/webif first_client->last = time((time_t *)0); webif_init(); start_thread("reader check", (void *) &reader_check, NULL, NULL, 1, 1); cw_process_thread_start(); checkcache_process_thread_start(); lcd_thread_start(); do_report_emm_support(); init_cardreader(); cs_waitforcardinit(); emm_load_cache(); load_emmstat_from_file(); led_status_starting(); ac_init(); start_thread("card poll", (void *) &card_poll, NULL, NULL, 1, 1); for(i = 0; i < CS_MAX_MOD; i++) { struct s_module *module = &modules[i]; if((module->type & MOD_CONN_SERIAL) && module->s_handler) { module->s_handler(NULL, NULL, i); } } // main loop function process_clients(); SAFE_COND_SIGNAL(&card_poll_sleep_cond); // Stop card_poll thread cw_process_thread_wakeup(); // Stop cw_process thread SAFE_COND_SIGNAL(&reader_check_sleep_cond); // Stop reader_check thread // Cleanup #ifdef MODULE_GBOX stop_sms_sender(); #endif webif_close(); azbox_close(); coolapi_close_all(); mca_close(); led_status_stopping(); led_stop(); lcd_thread_stop(); remove_versionfile(); stat_finish(); dvbapi_stop_all_descrambling(); dvbapi_save_channel_cache(); emm_save_cache(); save_emmstat_to_file(); cccam_done_share(); gbox_send_good_night(); kill_all_clients(); kill_all_readers(); for(i = 0; i < CS_MAX_MOD; i++) { struct s_module *module = &modules[i]; if((module->type & MOD_CONN_NET)) { for(j = 0; j < module->ptab.nports; j++) { struct s_port *port = &module->ptab.ports[j]; if(port->fd) { shutdown(port->fd, SHUT_RDWR); close(port->fd); port->fd = 0; } } } } if(oscam_pidfile) { unlink(oscam_pidfile); } // sleep a bit, so hopefully all threads are stopped when we continue cs_sleepms(200); free_cache(); cacheex_free_hitcache(); webif_tpls_free(); init_free_userdb(cfg.account); cfg.account = NULL; init_free_sidtab(); free_readerdb(); free_irdeto_guess_tab(); config_free(); ssl_done(); detect_valgrind(); if (!running_under_valgrind) cs_log("cardserver down"); else cs_log("running under valgrind, waiting 5 seconds before stopping cardserver"); log_free(); if (running_under_valgrind) sleep(5); // HACK: Wait a bit for things to settle stop_garbage_collector(); NULLFREE(first_client->account); NULLFREE(first_client); free(stb_boxtype); free(stb_boxname); // This prevents the compiler from removing config_mak from the final binary syslog_ident = config_mak; return exit_oscam; }