int satipc_open_device(adapter *ad) { if (!ad->sip) return 1; int ctime = getTick(); if ((ad->last_connect > 0) && (ctime - ad->last_connect < 30000)) return 3; ad->last_connect = ctime; ad->fe = tcp_connect(ad->sip, ad->sport, NULL, 0); // non-blockin socket if (ad->fe < 0) return 2; LOG("satipc: connected to SAT>IP server %s port %d, handle %d", ad->sip, ad->sport, ad->fe); ad->listen_rtp = opts.start_rtp + 1000 + ad->id * 2; ad->dvr = udp_bind(NULL, ad->listen_rtp); ad->rtcp = udp_bind(NULL, ad->listen_rtp + 1); ad->fe_sock = sockets_add(ad->fe, NULL, ad->id, TYPE_TCP, (socket_action) satipc_reply, (socket_action) satipc_close, (socket_action) satipc_timeout); ad->rtcp_sock = sockets_add(ad->rtcp, NULL, ad->id, TYPE_TCP, (socket_action) satipc_rtcp_reply, (socket_action) satipc_close, NULL); sockets_timeout(ad->fe_sock, 15000); // 15s set_socket_receive_buffer(ad->dvr, opts.output_buffer); if (ad->fe_sock < 0 || ad->dvr < 0 || ad->rtcp < 0 || ad->rtcp_sock < 0) { sockets_del(ad->rtcp_sock); sockets_del(ad->fe_sock); close(ad->rtcp); close(ad->dvr); close(ad->fe); } ad->type = ADAPTER_SATIP; ad->session[0] = 0; lap[ad->id] = 0; ldp[ad->id] = 0; ad->cseq = 1; ad->err = 0; ad->expect_reply = 0; ad->last_connect = 0; ad->sent_transport = 0; ad->session[0] = 0; ad->stream_id = -1; ad->wp = ad->qp = ad->want_commit = 0; ad->rcvp = ad->repno = 0; ad->rtp_miss = ad->rtp_ooo = 0; ad->rtp_seq = 0xFFFF; ad->ignore_packets = 1; ad->force_commit = 0; ad->satip_last_setup = -10000; ad->last_cmd = 0; return 0; }
void incoming_connection(t_server *server, fd_set *readfds, int *addrlen) { int new_socket; // const char message[] = "You're connected\n"; if (FD_ISSET(server->master_socket, readfds)) { if ((new_socket = accept(server->master_socket, (struct sockaddr *)&server->address, (socklen_t*)addrlen))<0) { perror("accept"); exit(EXIT_FAILURE); } //inform user of socket number - used in send and receive commands if (VERBOSE) printf("New connection , socket fd is %d , ip is : %s , port : %d \n" , new_socket , inet_ntoa(server->address.sin_addr) , ntohs(server->address.sin_port)); //send new connection greeting message // if (send(new_socket, message, sizeof(message) - 1, 0) != (ssize_t)strlen(message)) // perror("send"); //add new socket to array of sockets sockets_add(server->pending_sockets, new_socket, MAX_PENDINGS); } }
int sockets_accept(int socket, void *buf, int len, sockets *ss) { int new_sock, sas, ni; struct sockaddr_in sa; sas = sizeof(sa); new_sock = accept(ss->sock, (struct sockaddr *) &sa, (socklen_t *) &sas); if (new_sock < 0) { if (errno != EINTR) { LOG("sockets_accept: accept()"); return 1; } } ni = sockets_add(new_sock, &sa, -1, TYPE_TCP, NULL, NULL, NULL); if (ss->action != NULL) { ss->action(s[ni]); } set_linux_socket_timeout(new_sock); return 1; }
int init_hw(int i) { char name[100]; adapter *ad; if (i < 0 || i >= MAX_ADAPTERS) return 1; if (a[i] && a[i]->enabled) return 1; if (!a[i]) return 1; ad = a[i]; mutex_init(&ad->mutex); mutex_lock(&ad->mutex); if (ad->force_disable) goto NOK; if (ad->enabled) goto NOK; ad->sock = -1; ad->id = i; ad->fe_sock = -1; ad->sock = -1; if (ad->enabled) { goto NOK; } if (ad->open(ad)) { init_complete = 0; goto NOK; } ad->enabled = 1; if (!ad->buf) ad->buf = malloc1(opts.adapter_buffer + 10); if (!ad->buf) { LOG( "memory allocation failed for %d bytes failed, adapter %d, trying %d bytes", opts.adapter_buffer, i, ADAPTER_BUFFER); opts.adapter_buffer = ADAPTER_BUFFER; ad->buf = malloc1(opts.adapter_buffer + 10); if (!ad->buf) { LOG("memory allocation failed for %d bytes failed, adapter %d", opts.adapter_buffer, i); close_adapter(i); } goto NOK; } memset(ad->buf, 0, opts.adapter_buffer + 1); init_dvb_parameters(&ad->tp); mark_pids_deleted(i, -1, NULL); update_pids(i); ad->delsys(i, ad->fe, ad->sys); ad->master_sid = -1; ad->sid_cnt = 0; ad->pid_err = ad->dec_err = 0; ad->new_gs = 0; ad->force_close = 0; ad->ca_mask = 0; ad->rtime = getTick(); ad->sock = sockets_add(ad->dvr, NULL, i, TYPE_DVR, (socket_action) read_dmx, (socket_action) close_adapter_for_socket, (socket_action) adapter_timeout); memset(ad->buf, 0, opts.adapter_buffer + 1); set_socket_buffer(ad->sock, (unsigned char*) ad->buf, opts.adapter_buffer); sockets_timeout(ad->sock, ADAPTER_TIMEOUT); snprintf(ad->name, sizeof(ad->name), "AD%d", i); set_socket_thread(ad->sock, start_new_thread(ad->name)); tables_init_device(ad); if (ad->post_init) ad->post_init(ad); // set_sock_lock(ad->sock, &ad->mutex); // locks automatically the adapter on reading from the DVR LOG("done opening adapter %i fe_sys %d %d %d %d", i, ad->sys[0], ad->sys[1], ad->sys[2], ad->sys[3]); OK: mutex_unlock(&ad->mutex); return 0; NOK: mutex_unlock(&ad->mutex); return 1; }