diff --git a/src/sbbs3/install/sbbsinst.c b/src/sbbs3/install/sbbsinst.c index ee3ec99cd43b4c0687c88baebdf47b748ecfff25..4f75f2a6c02d8b7e617758e2e3143bfb4d66b06f 100644 --- a/src/sbbs3/install/sbbsinst.c +++ b/src/sbbs3/install/sbbsinst.c @@ -159,7 +159,8 @@ void allocfail(uint size) int main(int argc, char **argv) { - char **mopt; + char** mopt; + char* p; int i=0; int main_dflt=0; char str[129]; @@ -180,8 +181,10 @@ int main(int argc, char **argv) params.cvs=TRUE; SAFECOPY(params.cvstag,"HEAD"); SAFECOPY(params.cvsroot,DEFAULT_CVSROOT); - SAFECOPY(params.sbbsuser,getenv("USER")); - SAFECOPY(params.sbbsgroup,getenv("GROUP")); + if((p=getenv("USER"))!=NULL) + SAFECOPY(params.sbbsuser,p); + if((p=getenv("GROUP"))!=NULL) + SAFECOPY(params.sbbsgroup,p); printf("\r\nSynchronet Installation Utility (%s) v%s Copyright 2003 " "Rob Swindell\r\n",PLATFORM_DESC,VERSION); @@ -319,7 +322,7 @@ int main(int argc, char **argv) if(distlist[dist]->type != LOCAL_FILE) { i=choose_server((char **)distlist[dist]->servers); if(i>=0) - server=0; + server=i; } break; case 2: @@ -426,6 +429,13 @@ int main(int argc, char **argv) } } +/* Little wrapper for system calls */ +int exec(char* cmd) +{ + printf("%s\n",cmd); + return(system(cmd)); +} + /* Some jiggery-pokery here to avoid having to enter the CVS password */ /* fprintf(makefile,"\tif(grep '%s' -q ~/.cvspass) then echo \"%s A\" >> ~/.cvspass; fi\n", * params.cvsroot,params.cvsroot); @@ -440,13 +450,15 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server) { char dstfname[MAX_PATH+1]; char sbbsdir[9+MAX_PATH]; char cvstag[7+MAX_PATH]; - char buf[1024]; + char buf[4096]; char url[MAX_PATH+1]; char path[MAX_PATH+1]; - char sbbsuser[18]; - char sbbsgroup[43]; + char sbbsuser[128]; + char sbbsgroup[128]; int i; int fout,ret1,ret2; + long flen; + long offset; ftp_FILE *remote; if(params.debug) @@ -459,11 +471,14 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server) { sprintf(sbbsdir,"SBBSDIR=%s",params.install_path); putenv(sbbsdir); - - sprintf(sbbsuser,"SBBSUSER=%s",params.sbbsuser); - putenv(sbbsuser); - sprintf(sbbsgroup,"SBBSGROUP=%s",params.sbbsgroup); - putenv(sbbsgroup); + if(params.sbbsuser[0]) { + sprintf(sbbsuser,"SBBSUSER=%s",params.sbbsuser); + putenv(sbbsuser); + } + if(params.sbbsgroup[0]) { + sprintf(sbbsgroup,"SBBSGROUP=%s",params.sbbsgroup); + putenv(sbbsgroup); + } if(params.usebcc) putenv("bcc=1"); @@ -485,12 +500,12 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server) { sprintf(cvstag,"CVSTAG=%s",dist->tag); putenv(cvstag); sprintf(cmd,"cvs -d %s co -r %s install",server->addr,dist->tag); - if(system(cmd)) { + if(exec(cmd)) { printf("Could not checkout install makefile.\n"); exit(EXIT_FAILURE); } sprintf(cmd,"%s %s",params.make_cmdline,dist->make_opts); - if(system(cmd)) { + if(exec(cmd)) { printf(MAKE_ERROR); exit(EXIT_FAILURE); } @@ -523,24 +538,37 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server) { } } } + if((flen=ftpGetSize(remote,fname))<1) { + printf("Cannot get size of distribution file: %s!\n",fname); + close(fout); + unlink(dstfname); + exit(EXIT_FAILURE); + } + printf("Downloading %s ",url); + offset=0; while((ret1=remote->read(remote,buf,sizeof(buf)))>0) { ret2=write(fout,buf,ret1); if(ret2!=ret1) { - printf("Error writing to %s\n",dstfname); + printf("\n!ERROR %d writing to %s\n",errno,dstfname); close(fout); unlink(dstfname); exit(EXIT_FAILURE); } + offset+=ret2; + printf("\b\b\b\b%3lu%%",(long)(((float)offset/(float)flen)*100.0)); + fflush(stdout); } + printf("\n"); + fflush(stdout); if(ret1<0) { - printf("Error downloading %s\n",fname); + printf("!ERROR downloading %s\n",fname); close(fout); unlink(dstfname); exit(EXIT_FAILURE); } close(fout); sprintf(cmd,"gzip -dc %s | tar -xvf -",dstfname); - if(system(cmd)) { + if(exec(cmd)) { printf("Error extracting %s\n",dstfname); unlink(dstfname); exit(EXIT_FAILURE); @@ -548,7 +576,7 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server) { unlink(dstfname); } sprintf(cmd,"%s %s",params.make_cmdline,dist->make_opts); - if(system(cmd)) { + if(exec(cmd)) { printf(MAKE_ERROR); exit(EXIT_FAILURE); } @@ -557,13 +585,13 @@ void install_sbbs(dist_t *dist,struct server_ent_t *server) { case LOCAL_FILE: for(i=0;dist->files[i][0];i++) { sprintf(cmd,"gzip -dc %s/%s | tar -xvf -",path,dist->files[i]); - if(system(cmd)) { + if(exec(cmd)) { printf("Error extracting %s/%s\n",path,dist->files[i]); exit(EXIT_FAILURE); } } sprintf(cmd,"%s %s",params.make_cmdline,dist->make_opts); - if(system(cmd)) { + if(exec(cmd)) { printf(MAKE_ERROR); exit(EXIT_FAILURE); }