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);}