int main(int argc, char * argv[]) { RecordingData recdata; struct sockaddr_in servaddr; int ListenSocket, ConnectionSocket; u_short Port = 4000; char buf[BUFLEN]; char * p_act; int rc; int pid = 0; time_t t; char * a_arg[50]; char a_grabname[256]; char a_vpid[20]; char a_apid[20]; char a_filename[256]; char a_path[256]=""; char a_host[256]; int i,n; struct sockaddr_in cliaddr; socklen_t clilen = sizeof(cliaddr); a_arg[0] = a_grabname; a_arg[1] = (char *)"-p"; a_arg[2] = a_vpid; a_arg[3] = a_apid; a_arg[4] = (char *)"-o"; a_arg[5] = a_filename; a_arg[6] = (char *)"-host"; a_arg[7] = a_host; a_arg[8] = (char *)"-nos"; strcpy (a_grabname,argv[0]); if (strrchr(a_grabname,'/')){ strcpy (strrchr(a_grabname,'/') + 1, "ggrab"); } else { strcpy(a_grabname,"ggrab"); } #ifdef __CYGWIN__ strcat(a_grabname,".exe"); #endif n = 9; for (i = 1; i < argc; i++) { if (!strcmp("-o",argv[i])) { i++; if (i >= argc) { fprintf(stderr, "need path for -o\n"); return -1; } strcpy (a_path, argv[i]); } else if (!strcmp("-sport",argv[i])) { i++; if (i >= argc) { fprintf(stderr, "need port for -sport\n"); return -1; } Port = atoi(argv[i]); } else if (!strcmp("-h", argv[i])) { fprintf(stderr, "sserver version 0.03, Copyright (C) 2002 Axel Buehning\n" "sserver comes with ABSOLUTELY NO WARRANTY; This is free software,\n" "and you are welcome to redistribute it under the conditions of the\n" "GNU Public License, see www.gnu.org\n" "------- mandatory options: ---------\n" "-p <pid1> <pid2> <pidn> video and audio pids to receive [none]\n" "\n" "------- basic options: -------------\n" "-sport <port> port for streaming server [4000]\n" "\n" "for other options see ggrab -h\n"); exit(0); } else { a_arg[n++]=argv[i]; } } a_arg[n] = 0; //network-setup ListenSocket = socket(AF_INET, SOCK_STREAM, 0); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(Port); i = 0; while ((rc = bind(ListenSocket, (sockaddr *)&servaddr, sizeof(struct sockaddr_in)))) { fprintf(stderr, "bind to port %d failed, RC=%d...\n",Port, rc); if (i == 10) { fprintf(stderr, "Giving up\n"); exit(1); } fprintf(stderr, "%d. try, wait for 2 s\n",i++); sleep(2); } if (listen(ListenSocket, 5)) { fprintf(stderr,"listen failed\n"); exit(1); } printf("server startet\n"); do { memset(&cliaddr, 0, sizeof(cliaddr)); if((ConnectionSocket = accept(ListenSocket, (struct sockaddr *) &cliaddr, (socklen_t *) &clilen)) == -1){ fprintf(stderr,"accept failed\n"); exit(1); } strcpy(a_host,inet_ntoa(cliaddr.sin_addr)); fprintf(stderr,"request from dbox ip :%s\n",a_host); do { rc = recv(ConnectionSocket, buf, BUFLEN, 0); if ((rc > 0)) { memset((void *)&recdata, 0, sizeof(recdata)); AnalyzeXMLRequest(buf, &recdata); switch (recdata.cmd) { case CMD_VCR_UNKNOWN: fprintf(stderr, "VCR_UNKNOWN NOT HANDLED\n"); break; case CMD_VCR_RECORD: fprintf(stderr, "********************** START RECORDING **********************\n"); fprintf(stderr, "ONIDSID : %x\n", recdata.onidsid); fprintf(stderr, "APID : %x\n", recdata.apid); fprintf(stderr, "VPID : %x\n", recdata.vpid); fprintf(stderr, "CHANNELNAME : %s\n", recdata.channelname); fprintf(stderr, "EPG TITLE : %s\n", recdata.epgtitle); fprintf(stderr, "***********************************************************\n"); sprintf(a_vpid,"0x%03x",recdata.vpid); sprintf(a_apid,"0x%03x",recdata.apid); strcpy (a_filename,a_path); if (strlen(a_filename)) { strcat(a_filename,"/"); } if (strlen(recdata.channelname) > 0) { p_act = recdata.channelname; do { p_act += strcspn(p_act, "/ \"%&-\t`'´!,:;"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); strcat(a_filename, recdata.channelname); strcat(a_filename, "_"); } if (strlen(recdata.epgtitle) > 0) { p_act = recdata.epgtitle; do { p_act += strcspn(p_act, "/ \"%&-\t`'~<>!,:;?^°$\\=*#@¤|µöäüÖÄÜß"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); p_act = recdata.epgtitle; do { if ((unsigned char) (*p_act) > 128) { *p_act = '_'; } } while (*p_act++); strcat(a_filename, recdata.epgtitle); strcat(a_filename, "_"); } t = time (&t); strftime (buf, sizeof(a_filename)-1, "%Y%m%d_%H%M%S", localtime(&t)); strcat(a_filename, buf); pid = fork(); if (pid == -1) { fprintf(stderr, "fork process failed\n"); break; } if (pid == 0) { execvp(a_arg[0], a_arg); fprintf(stderr,"execv failed"); perror(""); } break; case CMD_VCR_STOP: if (pid > 0) { if(kill(pid,SIGINT)) { printf ("ggrab process not killed\n"); } waitpid(pid,0,0); fprintf(stderr,"\nStop recording\n"); } break; case CMD_VCR_PAUSE: fprintf(stderr, "VCR_PAUSE NOT HANDLED\n"); break; case CMD_VCR_RESUME: fprintf(stderr, "VCR_RESUME NOT HANDLED\n"); break; case CMD_VCR_AVAILABLE: fprintf(stderr, "VCR_AVAIABLE NOT HANDLED\n"); break; default: fprintf(stderr, "unknown VCR command\n"); break; } } } while((rc > 0)); } while (true); return 0; }
int main(int argc, char * argv[]) { RecordingData recdata; struct sockaddr_in servaddr; int ListenSocket, ConnectionSocket; u_short Port = LISTENPORT; u_short splitsize = 0; char buf[BUFLEN]; char * p_act; int rc; time_t t; char * a_arg[50]; char a_grabname[256]; char a_vpid[20]; char a_apid[20]; char a_filename[256]; char a_path[256]=""; char a_host[256]; int i,n; struct sockaddr_in cliaddr; socklen_t clilen = sizeof(cliaddr); printf("[fserver.c] fserver version $Id$\n"); // set signal handler for clean termination signal(SIGTERM, clean_exit); for (i = 1; i < argc; i++) { if (!strcmp("-sport",argv[i])) { i++; if (i >= argc) { fprintf(stderr, "[fserver.c] need port for -sport\n"); return -1; } Port = atoi(argv[i]); } else if (!strcmp("-splitsize",argv[i])) { i++; if (i >= argc) { fprintf(stderr, "[fserver.c] need size for -splizsize\n"); return -1; } splitsize = atoi(argv[i]); } else if (!strcmp("-o",argv[i])) { i++; if (i >= argc) { fprintf(stderr, "[fserver.c] need path for -o\n"); return -1; } strcpy (a_path, argv[i]); } else { a_arg[n++]=argv[i]; } } strcpy (a_grabname,argv[0]); if (strrchr(a_grabname,'/')){ strcpy (strrchr(a_grabname,'/') + 1, "streamfile"); } else { strcpy(a_grabname,"streamfile"); } n=0; a_arg[n] = a_grabname; n++; a_arg[n] = "-s"; n++; if (splitsize > 0) { a_arg[n] = "-l"; n++; char splitsize_string[10]; sprintf(splitsize_string, "%d",splitsize); a_arg[n] = splitsize_string; n++; } a_arg[n] = a_filename; n++; a_arg[n] = a_vpid; n++; a_arg[n] = a_apid; n++; a_arg[n] = 0; //network-setup ListenSocket = socket(AF_INET, SOCK_STREAM, 0); memset(&servaddr, 0, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr.s_addr = htonl(INADDR_ANY); servaddr.sin_port = htons(Port); i = 0; while ((rc = bind(ListenSocket, (struct sockaddr *)&servaddr, sizeof(struct sockaddr_in)))) { fprintf(stderr, "[fserver.c] bind to port %d failed, RC=%d...\n",Port, rc); if (i == 10) { fprintf(stderr, "[fserver.c] Giving up\n"); exit(1); } fprintf(stderr, "[fserver.c] %d. try, wait for 2 s\n",i++); sleep(2); } if (listen(ListenSocket, 5)) { fprintf(stderr,"[fserver.c] listen failed\n"); exit(1); } printf("[fserver.c] fserver successfully started\n"); do { memset(&cliaddr, 0, sizeof(cliaddr)); if((ConnectionSocket = accept(ListenSocket, (struct sockaddr *) &cliaddr, (socklen_t *) &clilen)) == -1){ fprintf(stderr,"[fserver.c] accept failed\n"); exit(1); } strcpy(a_host,inet_ntoa(cliaddr.sin_addr)); fprintf(stderr,"[fserver.c] got request from dbox ip :%s\n",a_host); do { rc = recv(ConnectionSocket, buf, BUFLEN, 0); if ((rc > 0)) { memset((void *)&recdata, 0, sizeof(recdata)); AnalyzeXMLRequest(buf, &recdata); switch (recdata.cmd) { case CMD_VCR_UNKNOWN: fprintf(stderr, "[fserver.c] VCR_UNKNOWN NOT HANDLED\n"); break; case CMD_VCR_RECORD: fprintf(stderr, "[fserver.c] ********************** START RECORDING **********************\n"); fprintf(stderr, "[fserver.c] APID : %x\n", recdata.apid); fprintf(stderr, "[fserver.c] VPID : %x\n", recdata.vpid); fprintf(stderr, "[fserver.c] CHANNELNAME : %s\n", recdata.channelname); fprintf(stderr, "[fserver.c] EPG TITLE : %s\n", recdata.epgtitle); fprintf(stderr, "[fserver.c] ***********************************************************\n"); sprintf(a_vpid,"%03x",recdata.vpid); sprintf(a_apid,"%03x",recdata.apid); // Create filename for recording strcpy (a_filename,a_path); if (strlen(a_filename)) { strcat(a_filename,"/"); } if (strlen(recdata.channelname) > 0) { p_act = recdata.channelname; do { p_act += strcspn(p_act, "/ \"%&-\t`'´!,:;"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); strcat(a_filename, recdata.channelname); strcat(a_filename, "_"); } if (strlen(recdata.epgtitle) > 0) { p_act = recdata.epgtitle; do { p_act += strcspn(p_act, "/ \"%&-\t`'~<>!,:;?^°$\\=*#@¤|µöäüÖÄÜß"); if (*p_act) { *p_act++ = '_'; } } while (*p_act); p_act = recdata.epgtitle; do { if ((unsigned char) (*p_act) > 128) { *p_act = '_'; } } while (*p_act++); strcat(a_filename, recdata.epgtitle); strcat(a_filename, "_"); } t = time (&t); strftime (buf, sizeof(a_filename)-1, "%Y%m%d_%H%M%S", localtime(&t)); strcat(a_filename, buf); // start streaming process pid = fork(); if (pid == -1) { fprintf(stderr, "[fserver.c] fork process failed\n"); break; } if (pid == 0) { execvp(a_arg[0], a_arg); fprintf(stderr,"[fserver.c] execv of %s failed", a_arg[0]); perror(""); } break; case CMD_VCR_STOP: if (pid > 0) { if(kill(pid,SIGTERM)) { printf ("[fserver.c] streamfile process not killed\n"); } waitpid(pid,0,0); fprintf(stderr,"\n[fserver.c] Stop recording\n"); } break; case CMD_VCR_PAUSE: fprintf(stderr, "[fserver.c] VCR_PAUSE NOT HANDLED\n"); break; case CMD_VCR_RESUME: fprintf(stderr, "[fserver.c] VCR_RESUME NOT HANDLED\n"); break; case CMD_VCR_AVAILABLE: fprintf(stderr, "[fserver.c] VCR_AVAILABLE NOT HANDLED\n"); break; default: fprintf(stderr, "[fserver.c] unknown VCR command\n"); break; } } } while((rc > 0)); } while (1); return 0; }