All pastes #1500426 Raw Edit

phh

public text v1 · immutable
#1500426 ·published 2009-07-19 20:54 UTC
rendered paste body
#define _GNU_SOURCE#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <netinet/in.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>#include <string.h>#include <ctype.h>void write2(int fd, const char *str) {	write(fd, str, strlen(str));}#define BUF_SZ 256*1024 //32*1024	//arguments/return value are just guesses...	int YZR_GetMaxVol();	int YZR_GetMinVol();	int YZR_GetCurrVol();	void YZR_SetVol(int);	void YZR_SetDefaultVol(int);	int YZR_GetDefaultVol(void);void read_file(char *fileid, char *songid);void read_track(char *songid);int fd;char **playlist;extern char **args_w_opt,**opts,**args;extern int args_ln,arg_w_opt_ln;extern void parse_args( char **envp);int main(int argc, char **argv, char **envp) {        printf("Content-type: audio/ogg\r\n\r\n");	fflush(stdout);	parse_args(envp);	playlist=NULL;	fd=socket(AF_INET, SOCK_STREAM, 0);	struct sockaddr_in addr;	addr.sin_family=AF_INET;	addr.sin_port=htons(1234);	addr.sin_addr.s_addr=htonl(INADDR_LOOPBACK);	connect(fd, (struct sockaddr*)&addr, sizeof(addr));	close(fd);	{ 		char *host="localhost";		char *port="1234";		int i;		for(i=0;i<arg_w_opt_ln;i++) {			if(strcmp(args_w_opt[i], "host")==0)				host=args[i];			if(strcmp(args_w_opt[i], "port")==0)				port=args[i];		}		int err;		struct addrinfo hints, *res0, *res;		//hints is a structure like the result, but with some undefined values,		//defined ones wouldn't be remplaced		memset(&hints, 0, sizeof(hints));		hints.ai_family = PF_UNSPEC;  		hints.ai_socktype = SOCK_STREAM;		/* Obtain AAAA and A record using getaddrinfo*/		err = getaddrinfo(host, port, &hints, &res0);		if (err) {			fprintf(stderr, "error : %s", gai_strerror(err));			freeaddrinfo(res0);			exit(1);		}		/* Use the result of getaddrinf, and try until connection is established */		for (res = res0; res; res = res->ai_next) {  			fd = socket (res->ai_family, res->ai_socktype, res->ai_protocol);  			if (fd < 0)  				continue;  			if (connect(fd, res->ai_addr, res->ai_addrlen) < 0) {  				close (fd);  				continue;			}			break;		}		freeaddrinfo(res0);	}	char *buffer=malloc(BUF_SZ);	char *cmd=NULL;	write(fd, "login phhusson sekhestunboulet\n", 24);	bzero(buffer, BUF_SZ);	read(fd, buffer, BUF_SZ);	char *pl_id="88f946d29cdcc40e6603984fc2cd635702";	int i;	for(i=0;i<arg_w_opt_ln;i++)		if(strcmp(args_w_opt[i], "playlist")==0)			pl_id=args[i];	if(strlen(pl_id)!=34) {		fprintf(stderr, "playlist have to be 34letters long\n");		return -2;	}		int tot,tot2,ret;	asprintf(&cmd, "playlist %s\n", pl_id);	write2(fd, cmd);	bzero(buffer, BUF_SZ);	read(fd, buffer, BUF_SZ);	sscanf(buffer, "%d %d", &ret, &tot2);	tot=0;	while(tot<tot2) {		ret=read(fd, buffer+tot, BUF_SZ);		tot+=ret;	}	int ln=0;	playlist=malloc(sizeof(char*));	playlist[0]=NULL;	char *buf2=strstr(buffer, "<items>");	char *tmp;	if(buf2==NULL) {		fprintf(stderr, "No items found\n");		return -1;	}	buf2+=7;	++buf2;	while(buf2[0]!='<') {		while(!isxdigit(buf2[0]))			buf2++;		++ln;		playlist=realloc(playlist, sizeof(char*)*(ln+1));		playlist[ln-1]=strndup(buf2, 33);		playlist[ln-1][32]=0;		playlist[ln]=NULL;		tmp=index(buf2, ',');		if(tmp && tmp <=index(buf2, '<')) {			buf2=tmp;			buf2[0]=0;			buf2++;		} else 			break;	}	free(cmd);cmd=NULL;	free(buffer);#if 0	unsigned int r=0;	//time(&r);	while(1) {		//rand_r(&r);		char *songid=playlist[(r%ln)];		printf("%s\n", songid);		read_track(songid);		++r;	}#endif	int sg_id=42;	for(i=0;i<arg_w_opt_ln;i++)		if(strcmp(args_w_opt[i], "song")==0)			sg_id=args[i];	read_track(playlist[(sg_id)%ln]);	return 0;}void read_track(char *songid) {	char *cmd,*tmp;	char *buffer=malloc(BUF_SZ);	int ret,tot,tot2;	asprintf(&cmd, "browsetrack %s\n", songid);	write2(fd, cmd);	bzero(buffer, BUF_SZ);	read(fd, buffer, BUF_SZ);	sscanf(buffer, "%d %d", &ret, &tot2);	tot=0;	while(tot<tot2) {		ret=read(fd, buffer+tot, BUF_SZ);		tot+=ret;	}	tmp=strstr(buffer, "<file id=");	tmp+=strlen("<file id=\"");	if(!isxdigit(*tmp)) {		fprintf(stderr, "File id is not an hexadecimal digit *ouch*!\n");		return -2;	}	char *fileid=strndup(tmp, 41);	fileid[40]=0;	free(buffer);	read_file(fileid, songid);	return 0;}void read_file(char *fileid, char *songid) {	char *buffer=malloc(BUF_SZ);	char *cmd;	int ret,tot2,tot;	char key[33];	asprintf(&cmd, "key %s %s\n", fileid, songid);	write2(fd, cmd);	free(cmd);cmd=NULL;	bzero(buffer, BUF_SZ);	read(fd, buffer, BUF_SZ);	sscanf(buffer, "%d %d", &ret, &tot2);	if(ret!=200) {		fprintf(stderr, "FAILED:%s\n", buffer);		return;	}	tot=0;	while(1) {		bzero(buffer, BUF_SZ);		ret=read(fd, buffer, BUF_SZ);		strncpy(key, buffer+158, 32);		key[32]=0;		tot+=ret;		if(tot>=tot2)			break;	}	int i=0,j=0;	int fd2;#ifdef TACT	//YZR_SetVol(5);	//YZR_SetDefaultVol(100);	//printf("%d:%d\n", YZR_GetCurrVol(), YZR_GetDefaultVol());	system("killall -9 igg123 ; /mnt/fat/igg123 -d oss -b 2048 /mnt/jffs2/out.ogg &");	//unlink("out.ogg");	fd2=open("/mnt/jffs2/out.ogg", O_WRONLY);#else#if 0	static int Z=0;	char *out_file;	asprintf(&out_file, "out%04d.ogg", Z);	++Z;	int fd2=open(out_file, O_WRONLY|O_CREAT);	free(out_file);	out_file=NULL;#endif	fd2=1;#endif	while(1) {		tot=0;		asprintf(&cmd, "substream %s %d %d %s\n", fileid, i*BUF_SZ, BUF_SZ, key);		write2(fd, cmd);		bzero(buffer, BUF_SZ);		for(j=0;;j++) {			read(fd, buffer+j, 1);			if(buffer[j]=='\n')				break;		}		sscanf(buffer, "%d %d", &ret, &tot2);		if(ret!=200) {			fprintf(stderr, "FAILED:%s\n", buffer);			return;		}			bzero(buffer, BUF_SZ);		if(i==0) {			ret=read(fd, buffer, BUF_SZ);			j=0;			for(j=1;j<ret-8;j++) {				if(buffer[j]=='O' && buffer[j+1]=='g' && buffer[j+2]=='g' && buffer[j+3]=='S') {					write(fd2, buffer+j, ret-j);					break;				}			}				//write(fd2, buf2+0xE1, ret);				//write(fd2, buf2, ret);				tot+=ret;		}		while(1) {			bzero(buffer, BUF_SZ);			ret=read(fd, buffer, BUF_SZ);			write(fd2, buffer, ret);			tot+=ret;			if(tot>=tot2)				break;		}		i++;		free(cmd);		cmd=NULL;		if(tot2<BUF_SZ)			break;	}			close(fd2);	free(buffer);}