Example #1
0
int32_t coolapi_open_device(int32_t demux_index, int32_t demux_id)
{
	dmx_t *dmx;

	SAFE_MUTEX_LOCK(&demux_lock);

	dmx = find_demux(0, demux_index);
	if(!dmx)
	{
		SAFE_MUTEX_UNLOCK(&demux_lock);
		cs_log("no free demux found");
		return 0;
	}

	if(!ll_cool_filter)
		{ ll_cool_filter = ll_create("ll_cool_filter"); }

	if(!ll_cool_chanhandle)
		{ ll_cool_chanhandle = ll_create("ll_cool_chanhandle"); }

	dmx->demux_id = demux_id;
	dmx->pid = -1;

	//dmx->device = dmx_handles[demux_index].handle;
	dmx->opened = 1;

	pthread_mutexattr_t attr;
	SAFE_MUTEXATTR_INIT(&attr);
	SAFE_MUTEXATTR_SETTYPE(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
	SAFE_MUTEX_INIT(&dmx->mutex, &attr);

	SAFE_MUTEX_UNLOCK(&demux_lock);

	return dmx->fd;
}
Example #2
0
static void * card_poll(void) {
	struct s_client *cl;
	struct s_reader *rdr;
	pthread_mutex_t card_poll_sleep_cond_mutex;
	SAFE_MUTEX_INIT(&card_poll_sleep_cond_mutex, NULL);
	SAFE_COND_INIT(&card_poll_sleep_cond, NULL);
	set_thread_name(__func__);
	while (!exit_oscam) {
		cs_readlock(__func__, &readerlist_lock);
		for (rdr=first_active_reader; rdr; rdr=rdr->next) {
			if (rdr->enable && rdr->card_status == CARD_INSERTED) {
				cl = rdr->client;
				if (cl && !cl->kill)
					{ add_job(cl, ACTION_READER_POLL_STATUS, 0, 0); }
			}
		}
		cs_readunlock(__func__, &readerlist_lock);
		struct timespec ts;
		struct timeval tv;
		gettimeofday(&tv, NULL);
		ts.tv_sec = tv.tv_sec;
		ts.tv_nsec = tv.tv_usec * 1000;
		ts.tv_sec += 1;
		SAFE_MUTEX_LOCK(&card_poll_sleep_cond_mutex);
		SAFE_COND_TIMEDWAIT(&card_poll_sleep_cond, &card_poll_sleep_cond_mutex, &ts); // sleep on card_poll_sleep_cond
		SAFE_MUTEX_UNLOCK(&card_poll_sleep_cond_mutex);
	}
	return NULL;
}
Example #3
0
/**
 * called by signal SIGHUP
 *
 * reloads configs:
 *  - useraccounts (oscam.user)
 *  - readers      (oscam.server)
 *  - services ids (oscam.srvid)
 *  - tier ids     (oscam.tiers)
 *  Also clears anticascading stats.
 **/
static void cs_reload_config(void)
{
	static pthread_mutex_t mutex;
	static int8_t mutex_init = 0;
	
	if(!mutex_init)
	{
		SAFE_MUTEX_INIT(&mutex, NULL);
		mutex_init = 1;
	}
	
	if(pthread_mutex_trylock(&mutex))
	{
		return;	
	}
	
	cs_accounts_chk();
	reload_readerdb();
	init_provid();
	init_srvid();
	init_tierid();
	init_fakecws();
	ac_init_stat();
	cs_reopen_log(); // FIXME: aclog.log, emm logs, cw logs (?)
	
	SAFE_MUTEX_UNLOCK(&mutex);
}
Example #4
0
struct s_client *create_client(IN_ADDR_T ip)
{
	struct s_client *cl;
	if(!cs_malloc(&cl, sizeof(struct s_client)))
	{
		cs_log("max connections reached (out of memory) -> reject client %s", IP_ISSET(ip) ? cs_inet_ntoa(ip) : "with null address");
		return NULL;
	}
	
	//client part
	IP_ASSIGN(cl->ip, ip);
	cl->account = first_client->account;
	
	//master part
	SAFE_MUTEX_INIT(&cl->thread_lock, NULL);
	cl->login = cl->last = time(NULL);
	cl->tid = (uint32_t)rand();
	
	//Now add new client to the list:
	struct s_client *last;
	cs_writelock(__func__, &clientlist_lock);
	
	for(last = first_client; last && last->next; last = last->next)
		{ ; } //ends with cl on last client
		
	if (last)
		last->next = cl;
		
	int32_t bucket = (uintptr_t)cl / 16 % CS_CLIENT_HASHBUCKETS;
	cl->nexthashed = first_client_hashed[bucket];
	first_client_hashed[bucket] = cl;
	
	cs_writeunlock(__func__, &clientlist_lock);
	
	return cl;
}
Example #5
0
int32_t stapi_open(void)
{
    uint32_t ErrorCode;

    DIR *dirp;
    struct dirent entry, *dp = NULL;
    struct stat buf;
    int32_t i;
    char pfad[80];
    stapi_on = 1;
    int32_t stapi_priority = 0;

    dirp = opendir(PROCDIR);
    if(!dirp)
    {
        cs_log("opendir failed (errno=%d %s)", errno, strerror(errno));
        return 0;
    }

    memset(dev_list, 0, sizeof(struct STDEVICE)*PTINUM);

    if(dvbapi_priority)
    {
        struct s_dvbapi_priority *p;
        for(p = dvbapi_priority; p != NULL; p = p->next)
        {
            if(p->type == 's')
            {
                stapi_priority = 1;
                break;
            }
        }
    }

    if(!stapi_priority)
    {
        cs_log("WARNING: no PTI devices defined, stapi disabled");
        return 0;
    }

    oscam_stapi5_GetRevision();
    oscam_sttkd_GetRevision();

    i = 0;
    while(!cs_readdir_r(dirp, &entry, &dp))
    {
        if(!dp) {
            break;
        }

        snprintf(pfad, sizeof(pfad), "%s%s", PROCDIR, dp->d_name);
        if(stat(pfad, &buf) != 0)
        {
            continue;
        }

        if(!(buf.st_mode & S_IFDIR && strncmp(dp->d_name, ".", 1) != 0))
        {
            continue;
        }

        int32_t do_open = 0;
        struct s_dvbapi_priority *p;

        for(p = dvbapi_priority; p != NULL; p = p->next)
        {
            if(p->type != 's') {
                continue;
            }
            if(strcmp(dp->d_name, p->devname) == 0)
            {
                do_open = 1;
                break;
            }
        }

        if(!do_open)
        {
            cs_log("PTI: %s skipped", dp->d_name);
            continue;
        }

        ErrorCode = oscam_stapi5_Open(dp->d_name, &dev_list[i].SessionHandle);
        if(ErrorCode != 0)
        {
            cs_log("STPTI_Open ErrorCode: %d", ErrorCode);
            continue;
        }

        //debug
        //oscam_stapi_Capability(dp->d_name);

        cs_strncpy(dev_list[i].name, dp->d_name, sizeof(dev_list[i].name));
        cs_log("PTI: %s open %d", dp->d_name, i);

        ErrorCode = oscam_stapi5_SignalAllocate(dev_list[i].SessionHandle, &dev_list[i].SignalHandle);
        if(ErrorCode != 0)
        {
            cs_log("SignalAllocate: ErrorCode: %d SignalHandle: %x", ErrorCode, dev_list[i].SignalHandle);
        }

        i++;
        if(i >= PTINUM) {
            break;
        }
    }
    closedir(dirp);

    if(i == 0) {
        return 0;
    }

    uint8_t TKD_InstanceID = 0;
    memset(&tkd_desc_info, 0, sizeof(tkd_desc_info[0]) * MAX_DESCRAMBLER);

    for(TKD_InstanceID = 0; TKD_InstanceID < TKD_MAX_NUMBER; TKD_InstanceID++)
    {
        /* Generate the device name dynamically based upon the Instance ID */
        snprintf(TKD_DeviceName[TKD_InstanceID], sizeof(TKD_DeviceName), "TKD_%02d", TKD_InstanceID);

        ErrorCode = oscam_sttkd_Open(TKD_DeviceName[TKD_InstanceID], &TKDHandle[TKD_InstanceID]);
        if(ErrorCode != 0)
            cs_log("oscam_sttkd_Open: DeviceName: %s, TKDHandle: 0x%08X, ErrorCode: %d", TKD_DeviceName[TKD_InstanceID], TKDHandle[TKD_InstanceID], ErrorCode);
    }

    SAFE_MUTEX_INIT(&filter_lock, NULL);

    for(i = 0; i < PTINUM; i++)
    {
        if(dev_list[i].SessionHandle == 0)
        {
            continue;
        }

        struct read_thread_param *para;
        if(!cs_malloc(&para, sizeof(struct read_thread_param)))
        {
            return 0;
        }
        para->id = i;
        para->cli = cur_client();

        int32_t ret = start_thread("stapi read", stapi_read_thread, (void *)para, &dev_list[i].thread, 1, 0);
        if(ret)
        {
            return 0;
        }
    }

    atexit(stapi_off);

    cs_log("liboscam_stapi5 v.%s initialized", oscam_stapi5_LibVersion());
    return 1;
}