Example #1
0
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;
}
Example #2
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;
}