static int32_t db2com_init(struct s_reader *reader) { if(reader->typ != R_DB2COM1 && reader->typ != R_DB2COM2) { detect_db2com_reader(reader); } reader->handle = open(reader->device, O_RDWR | O_NOCTTY | O_SYNC); if(reader->handle < 0) { rdr_log(reader, "ERROR: Opening device %s (errno=%d %s)", reader->device, errno, strerror(errno)); return ERROR; } if((reader->fdmc = open(DEV_MULTICAM, O_RDWR)) < 0) { rdr_log(reader, "ERROR: Opening device %s (errno=%d %s)", DEV_MULTICAM, errno, strerror(errno)); close(reader->handle); return ERROR; } if(Phoenix_Init(reader)) { rdr_log(reader, "ERROR: Phoenix_Init returns error"); Phoenix_Close(reader); return ERROR; } return OK; }
int32_t ICC_Async_Device_Init (struct s_reader *reader) { reader->fdmc=-1; cs_debug_mask (D_IFD, "IFD: Opening device %s\n", reader->device); reader->written = 0; if (reader->crdr.active==1 && reader->crdr.reader_init) { return reader->crdr.reader_init(reader); } switch(reader->typ) { case R_SC8in1: cs_writelock(&sc8in1_lock); if (reader->handle != 0) {//this reader is already initialized cs_writeunlock(&sc8in1_lock); return OK; } //this reader is uninitialized, thus the first one, since the first one initializes all others //get physical device name int32_t pos = strlen(reader->device)-2; //this is where : should be located; is also valid length of physical device name if (reader->device[pos] != 0x3a) //0x3a = ":" cs_log("ERROR: '%c' detected instead of slot separator `:` at second to last position of device %s", reader->device[pos], reader->device); reader->slot=(int)reader->device[pos+1] - 0x30; reader->device[pos]= 0; //slot 1 reader now gets correct physicalname //open physical device reader->handle = open (reader->device, O_RDWR | O_NOCTTY| O_NONBLOCK); if (reader->handle < 0) { cs_log("ERROR opening device %s",reader->device); cs_writeunlock(&sc8in1_lock); return ERROR; } //copy physical device name and file handle to other slots struct s_reader *rdr; LL_ITER itr = ll_iter_create(configured_readers); while((rdr = ll_iter_next(&itr))) //copy handle to other slots if (rdr->typ == R_SC8in1 && rdr != reader) { //we have another sc8in1 reader unsigned char save = rdr->device[pos]; rdr->device[pos]=0; //set to 0 so we can compare device names if (!strcmp(reader->device, rdr->device)) {//we have a match to another slot with same device name rdr->handle = reader->handle; rdr->slot=(int)rdr->device[pos+1] - 0x30; } else rdr->device[pos] = save; //restore character } break; case R_MP35: case R_MOUSE: reader->handle = open (reader->device, O_RDWR | O_NOCTTY| O_NONBLOCK); if (reader->handle < 0) { cs_log("ERROR opening device %s",reader->device); return ERROR; } break; #if defined(TUXBOX) && defined(PPC) case R_DB2COM1: case R_DB2COM2: reader->handle = open (reader->device, O_RDWR | O_NOCTTY| O_SYNC); if (reader->handle < 0) { cs_log("ERROR opening device %s",reader->device); return ERROR; } if ((reader->fdmc = open(DEV_MULTICAM, O_RDWR)) < 0) { close(reader->handle); cs_log("ERROR opening device %s",DEV_MULTICAM); return ERROR; } break; #endif case R_SMART: #if defined(LIBUSB) call (SR_Init(reader)); break; #else cs_log("ERROR, you have specified 'protocol = smartreader' in oscam.server,"); cs_log("recompile with SmartReader support."); return ERROR; #endif case R_INTERNAL: #if defined(COOL) return Cool_Init(reader->device); #elif defined(AZBOX) return Azbox_Init(reader); #elif defined(SCI_DEV) #if defined(SH4) || defined(STB04SCI) reader->handle = open (reader->device, O_RDWR|O_NONBLOCK|O_NOCTTY); #else reader->handle = open (reader->device, O_RDWR); #endif if (reader->handle < 0) { cs_log("ERROR opening device %s",reader->device); return ERROR; } #elif defined(WITH_STAPI) return STReader_Open(reader->device, &reader->stsmart_handle); #else//SCI_DEV cs_log("ERROR, you have specified 'protocol = internal' in oscam.server,"); cs_log("recompile with internal reader support."); return ERROR; #endif//SCI_DEV break; #ifdef HAVE_PCSC case R_PCSC: return (pcsc_reader_init(reader, reader->device)); break; #endif default: cs_log("ERROR ICC_Device_Init: unknow reader type %i",reader->typ); return ERROR; } if (reader->typ == R_MP35) { if (MP35_Init(reader)) { cs_log("ERROR: MP35_Init returns error"); MP35_Close (reader); return ERROR; } } else if (reader->typ <= R_MOUSE) if (Phoenix_Init(reader)) { cs_log("ERROR: Phoenix_Init returns error"); Phoenix_Close (reader); return ERROR; } if (reader->typ == R_SC8in1) { call(Sc8in1_Init(reader)); cs_writeunlock(&sc8in1_lock); } cs_debug_mask (D_IFD, "IFD: Device %s succesfully opened\n", reader->device); return OK; }