void *init_oscam_ser(struct s_client *UNUSED(cl), uchar *UNUSED(mbuf), int32_t module_idx) { char sdevice[512]; int32_t ret; struct s_thread_param param; pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setstacksize(&attr, PTHREAD_STACK_SIZE); oscam_init_serialdata(¶m.serialdata); if(cfg.ser_device) { cs_strncpy(sdevice, cfg.ser_device, sizeof(sdevice)); } else { memset(sdevice, 0, sizeof(sdevice)); } param.module_idx = module_idx; char *p; pthread_t temp; char cltype = 'c'; //now auto should work if(bcopy_end == -1) //mutex should be initialized only once { pthread_mutex_init(&mutex, NULL); pthread_cond_init(&cond, NULL); bcopy_end = 0; } while((p = strrchr(sdevice, ';'))) { *p = 0; if(!(p + 1) || (!(p + 1)[0])) { return NULL; } if(!oscam_ser_parse_url(p + 1, ¶m.serialdata, &cltype)) { return NULL; } ret = pthread_create(&temp, &attr, oscam_ser_fork, (void *) ¶m); if(ret) { cs_log("ERROR: can't create serial reader thread (errno=%d %s)", ret, strerror(ret)); pthread_attr_destroy(&attr); return NULL; } else { oscam_wait_ser_fork(); pthread_detach(temp); } } if(!sdevice[0]) { return NULL; } if(!oscam_ser_parse_url(sdevice, ¶m.serialdata, &cltype)) { return NULL; } ret = pthread_create(&temp, &attr, oscam_ser_fork, (void *) ¶m); if(ret) { cs_log("ERROR: can't create serial reader thread (errno=%d %s)", ret, strerror(ret)); pthread_attr_destroy(&attr); return NULL; } else { oscam_wait_ser_fork(); pthread_detach(temp); } pthread_attr_destroy(&attr); return NULL; }
static int32_t oscam_ser_client_init(struct s_client *client) { if (!client->serialdata && !cs_malloc(&client->serialdata, sizeof(struct s_serial_client))) return 1; oscam_init_serialdata(client->serialdata); if ((!client->reader->device[0])) cs_disconnect_client(client); if (!oscam_ser_parse_url(client->reader->device, client->serialdata, NULL)) cs_disconnect_client(client); client->pfd=init_oscam_ser_device(client); return((client->pfd>0) ? 0 : 1); }