--- server.c 2004-03-28 00:25:34.000000000 +0100 +++ server.c 2004-03-28 00:05:56.000000000 +0100 @@ -427,14 +427,16 @@ char *cmd; char *ptr; char *fileName; - char *targetfileName; + char *targetfileName,*tmpfilename,*tmprarsize; struct stat st; int size1,size2; static char *tempbuf; unsigned long cnt; - int ret=0; + int open_ok,ret=0; + int f_size=0; char *TEMP_PATH; char *TARGET_PATH = main_config->root_dir; + FILE *size_file; *CMD = (char *)malloc(MAX_MSG_LENGTH); memset(*CMD,0x0,MAX_MSG_LENGTH); @@ -487,7 +489,40 @@ /* to open the requested file. Otherwise processing should continue */ if (!strstr(fileName,"/../")) { - if (!(*file = fopen(targetfileName,"r"))) + tmpfilename=strrchr(targetfileName,'.'); + if (tmpfilename==NULL) { + sprintf(*CMD,"%-32d",-1); + free(fileName); + free(targetfileName); + ret=1; + } + if (!strcasecmp(tmpfilename,".rar")) { + tmpfilename=(char *)malloc(4096); + sprintf(tmpfilename,"/usr/bin/rar p -inul \"%s\" \"*.mpg\" \"*.avi\" \"*.img\" \"*.bin\"",targetfileName); + d_log("open file: %s\n",tmpfilename); + open_ok=(int)(*file = popen(tmpfilename,"r")); + if (open_ok) { + //this is ugly, but it seems lie xns protkoll really needs a "valid" size for the file, + //and since rars are mostyl splited lets use some bash stuff to get the actual size + tmprarsize=(char *)malloc(4096); + sprintf(tmprarsize,"/usr/bin/rar lt \"%s\" | egrep -Ei \"\\.mpg |\\.avi |\\.img |\\.bin \" | gawk '{ print $2 }'" ,targetfileName); + d_log("filesize: %s\n",tmprarsize); + if ((size_file = popen(tmprarsize,"r"))) { + bzero(tmpfilename,4096); + fread(tmpfilename,1,4096,size_file); + pclose(size_file); + d_log("filesize: %s\n",tmpfilename); + f_size=atol(tmpfilename); + } + free(tmprarsize); + } + free(tmpfilename); + } else { + open_ok=(int)(*file = fopen(targetfileName,"r")); + stat(targetfileName,&st); + f_size=(int)st.st_size; + } + if (!open_ok) { if (main_config->debug_lvl >= 1) { d_log("Cannot open file: %s\n",targetfileName); @@ -499,10 +534,9 @@ } else { - fstat(fileno(*file),&st); /* set it to 32 char, so player understands it.*/ - sprintf(*CMD,"%-32d",(int)st.st_size); - + sprintf(*CMD,"%-32i",(int)f_size); + d_log("ok file is running!\n"); free(fileName); free(targetfileName); ret = 1;