|
|
1.1 root 1: /* install.c */
2:
3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
4:
5: /* Synchronet BBS Installation program */
6:
7: unsigned int _stklen=0x8000;
8:
9: #include <io.h>
10: #include <dir.h>
11: #include <fcntl.h>
12: #include <sys/stat.h>
13: #include <process.h>
14: #include <errno.h>
15: #include "uifc.h"
16:
17: /* OS Specific */
18: #if defined(__FLAT__) // 32-bit
19: #define FAR16
20: #define HUGE16
21: #define lread(f,b,l) read(f,b,l)
22: #define lfread(b,l,f) fread(b,l,f)
23: #define lwrite(f,b,l) write(f,b,l)
24: #define lfwrite(b,l,f) fwrite(b,l,f)
25: #else // 16-bit
26: #define FAR16 far
27: #define HUGE16 huge
28: #endif
29:
30: void bail(int code);
31:
32: char **opt;
33:
34: #define EXEC (1<<1)
35: #define CFGS (1<<2)
36: #define TEXT (1<<3)
37: #define DOCS (1<<4)
38:
39: #define DISK1 (EXEC|CFGS|TEXT|DOCS)
40:
41: #define UTIL (1<<10)
42: #define XTRN (1<<11)
43: #define XSDK (1<<12)
44:
45: #define DISK2 (UTIL|XTRN|XSDK)
46:
47: #define UPGRADE (1<<13)
48:
49: #define LOOP_NOPEN 100
50:
51: int mode=(DISK1|DISK2);
52:
53: enum { /* Upgrade FROM version */
54: NONE
55: ,SBBS20
56: ,SBBS21
57: ,SBBS22
58: ,SBBS23
59: };
60:
61: char tmp[256];
62: char install_to[129],install_from[256];
63:
64: /****************************************************************************/
65: /* Puts a backslash on path strings */
66: /****************************************************************************/
67: void backslash(char *str)
68: {
69: int i;
70:
71: i=strlen(str);
72: if(i && str[i-1]!='\\') {
73: str[i]='\\'; str[i+1]=0; }
74: }
75:
76:
77: /****************************************************************************/
78: /* If the directory 'path' doesn't exist, create it. */
79: /* returns 1 if successful, 0 otherwise */
80: /****************************************************************************/
81: int md(char *path)
82: {
83: char str[128];
84: struct ffblk ff;
85:
86: if(strlen(path)<2) {
87: umsg("Invalid path");
88: return(0); }
89: strcpy(str,path);
90: if(strcmp(str+1,":\\") && str[strlen(str)-1]=='\\')
91: str[strlen(str)-1]=0; /* Chop of \ if not root directory */
92: if(findfirst(str,&ff,FA_DIREC)) {
93: if(mkdir(str)) {
94: sprintf(str,"Unable to Create Directory '%s'",path);
95: umsg(str);
96: return(0); } }
97: return(1);
98: }
99:
100: long fdate_dir(char *filespec)
101: {
102: struct ffblk f;
103: struct date fd;
104: struct time ft;
105:
106: if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==0) {
107: fd.da_day=f.ff_fdate&0x1f;
108: fd.da_mon=(f.ff_fdate>>5)&0xf;
109: fd.da_year=1980+((f.ff_fdate>>9)&0x7f);
110: ft.ti_hour=0;
111: ft.ti_min=0;
112: ft.ti_sec=0;
113: return(dostounix(&fd,&ft)); }
114: else return(0);
115: }
116:
117: /****************************************************************************/
118: /* Returns the length of the file in 'filespec' */
119: /****************************************************************************/
120: long flength(char *filespec)
121: {
122: struct ffblk f;
123:
124: if(findfirst(filespec,&f,0)==0)
125: return(f.ff_fsize);
126: return(-1L);
127: }
128:
129: /****************************************************************************/
130: /* Checks the disk drive for the existence of a file. Returns 1 if it */
131: /* exists, 0 if it doesn't. */
132: /****************************************************************************/
133: char fexist(char *filespec)
134: {
135: struct ffblk f;
136:
137: if(findfirst(filespec,&f,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_DIREC)==0)
138: return(1);
139: return(0);
140: }
141:
142: #ifndef __OS2__
143: /****************************************************************************/
144: /* This function reads files that are potentially larger than 32k. */
145: /* Up to one megabyte of data can be read with each call. */
146: /****************************************************************************/
147: long lread(int file, char huge *buf,long bytes)
148: {
149: long count;
150:
151: for(count=bytes;count>32767;count-=32767,buf+=32767)
152: if(read(file,(char *)buf,32767)!=32767)
153: return(-1L);
154: if(read(file,(char *)buf,(int)count)!=count)
155: return(-1L);
156: return(bytes);
157: }
158:
159: /****************************************************************************/
160: /* This function writes files that are potentially larger than 32767 bytes */
161: /* Up to one megabytes of data can be written with each call. */
162: /****************************************************************************/
163: long lwrite(int file, char huge *buf, long bytes)
164: {
165:
166: long count;
167:
168: for(count=bytes;count>32767;count-=32767,buf+=32767)
169: if(write(file,(char *)buf,32767)!=32767)
170: return(-1L);
171: if(write(file,(char *)buf,(int)count)!=count)
172: return(-1L);
173: return(bytes);
174: }
175: #endif
176:
177: /****************************************************************************/
178: /* Network open function. Opens all files DENYALL and retries LOOP_NOPEN */
179: /* number of times if the attempted file is already open or denying access */
180: /* for some other reason. All files are opened in BINARY mode. */
181: /****************************************************************************/
182: int nopen(char *str, int access)
183: {
184: char logstr[256];
185: int file,share,count=0;
186:
187: if(access==O_RDONLY) share=O_DENYWRITE;
188: else share=O_DENYALL;
189: while(((file=open(str,O_BINARY|share|access,S_IWRITE))==-1)
190: && errno==EACCES && count++<LOOP_NOPEN);
191: if(file==-1 && errno==EACCES)
192: cputs("\7\r\nNOPEN: ACCESS DENIED\r\n\7");
193: return(file);
194: }
195:
196: int copy(char *src, char *dest)
197: {
198: char c,HUGE16 *buf,str[256],str2[128],*scrnsave;
199: int in,out;
200: long length,chunk,l;
201: struct ftime ftime;
202:
203: if(!strcmp(src,dest)) /* copy from and to are same, so return */
204: return(0);
205:
206: if((scrnsave=MALLOC(scrn_len*80*2))==NULL)
207: return(-1);
208: hidemouse();
209: gettext(1,1,80,scrn_len,scrnsave);
210:
211: #define width 72
212: #define top 10
213: #define left 0
214:
215: sprintf(str2,"Copying %s to %s...",src,dest);
216: sprintf(str," %-64.64s",str2); /* Make sure it's no more than 60 */
217:
218: gotoxy(SCRN_LEFT+left,SCRN_TOP+top);
219: textattr(hclr|(bclr<<4));
220: putch('�');
221: for(c=1;c<width-1;c++)
222: putch('�');
223: putch('�');
224: gotoxy(SCRN_LEFT+left,SCRN_TOP+top+1);
225: putch('�');
226: textattr(lclr|(bclr<<4));
227: cprintf("%-*.*s",width-2,width-2,str);
228: gotoxy(SCRN_LEFT+left+(width-1),SCRN_TOP+top+1);
229: textattr(hclr|(bclr<<4));
230: putch('�');
231: gotoxy(SCRN_LEFT+left,SCRN_TOP+top+2);
232: putch('�');
233: for(c=1;c<width-1;c++)
234: putch('�');
235: putch('�');
236: gotoxy(SCRN_LEFT+left+(width-5),SCRN_TOP+top+1);
237: textattr(lclr|(bclr<<4));
238:
239: if((in=nopen(src,O_RDONLY))==-1) {
240: cprintf("\r\nERR_OPEN %s",src);
241: getch();
242: puttext(1,1,80,scrn_len,scrnsave);
243: FREE(scrnsave);
244: showmouse();
245: return(-1); }
246: if((out=nopen(dest,O_WRONLY|O_CREAT|O_TRUNC))==-1) {
247: close(in);
248: sprintf(str,"ERROR OPENING %s",dest);
249: umsg(str);
250: puttext(1,1,80,scrn_len,scrnsave);
251: FREE(scrnsave);
252: showmouse();
253: return(-1); }
254: length=filelength(in);
255: if(!length) {
256: close(in);
257: close(out);
258: sprintf(str,"ZERO LENGTH %s",src);
259: umsg(str);
260: puttext(1,1,80,scrn_len,scrnsave);
261: showmouse();
262: FREE(scrnsave);
263: return(-1); }
264: #if __OS2__
265: chunk=1000000;
266: #else
267: chunk=0x8000; /* use 32k chunks */
268: #endif
269: if(chunk>length) /* leave space for stack expansion */
270: chunk=length;
271: if((buf=MALLOC(chunk))==NULL) {
272: close(in);
273: close(out);
274: sprintf(str,"ERROR ALLOC %s %lu",src,chunk);
275: umsg(str);
276: puttext(1,1,80,scrn_len,scrnsave);
277: FREE(scrnsave);
278: showmouse();
279: return(-1); }
280: l=0L;
281: while(l<length) {
282: cprintf("%2lu%%",l ? (long)(100.0/((float)length/l)) : 0L);
283: if(l+chunk>length)
284: chunk=length-l;
285: lread(in,buf,chunk);
286: lwrite(out,buf,chunk);
287: l+=chunk;
288: cputs("\b\b\b");
289: }
290: // cputs(" \b\b\b"); /* erase it */
291: FREE((char *)buf);
292: getftime(in,&ftime);
293: setftime(out,&ftime);
294: close(in);
295: close(out);
296: puttext(1,1,80,scrn_len,scrnsave);
297: FREE(scrnsave);
298: showmouse();
299: return(0);
300: }
301:
302: int unarc(int timestamp, char *src, char *dir, char *arg)
303: {
304: int i,atr;
305: char str[128],cmd[128],*scrnsave;
306:
307: if((scrnsave=MALLOC((scrn_len+1)*80*2))==NULL)
308: return(-1);
309: hidemouse();
310: gettext(1,1,80,scrn_len+1,scrnsave);
311: //lclini(scrn_len+1);
312: textattr(LIGHTGRAY);
313: clrscr();
314: sprintf(cmd,"%sLHA.EXE",install_from);
315: sprintf(str,"/c%d",timestamp);
316: i=spawnlp(P_WAIT,cmd,cmd,"x",str,"/s","/m1",src,dir,arg,NULL);
317: if(i==-1) {
318: printf("\r\nCannot execute %s. Hit any key to continue.",cmd);
319: getch(); }
320: else if(i) {
321: printf("\r\n%s returned error level %d. Hit any key to continue.",cmd,i);
322: getch(); }
323: clrscr();
324: puttext(1,1,80,scrn_len+1,scrnsave);
325: showmouse();
326: FREE(scrnsave);
327: //lclini(scrn_len);
328: //textattr(atr);
329: return(i);
330: }
331:
332:
333: void main(int argc, char **argv)
334: {
335: int i,j,k,ver;
336: long l;
337: char str[128],*p;
338: char text_dir[64],docs_dir[64],exec_dir[64],ctrl_dir[64];
339: struct text_info txt;
340: struct ffblk ff;
341:
342: timezone=0;
343: daylight=0;
344: uifcini();
345: if(argc>1) { /* user specified install path */
346: sprintf(install_to,"%.20s",argv[1]);
347: strupr(install_to);
348: if(strlen(install_to)==1) {
349: if(!isalpha(install_to[0])) {
350: cprintf("\7\r\nInvalid install path - '%s'\r\n",install_to);
351: bail(1); }
352: strcat(install_to,":"); }
353: backslash(install_to);
354: if(strlen(install_to)<4) /* user says C, C:, or C:\, make C:\SBBS */
355: strcat(install_to,"SBBS\\"); }
356: else
357: strcpy(install_to,"C:\\SBBS\\");
358:
359: strcpy(install_from,argv[0]);
360: strupr(install_from);
361: p=strrchr(install_from,'\\');
362: if(p)
363: *(p+1)=0;
364: else { /* incase of A:INSTALL */
365: p=strchr(install_from,':');
366: if(p)
367: *(p+1)=0; }
368:
369: if((opt=(char **)MALLOC(sizeof(char *)*MAX_OPTS))==NULL) {
370: cputs("memory allocation error\r\n");
371: bail(1); }
372: for(i=0;i<MAX_OPTS;i++)
373: if((opt[i]=(char *)MALLOC(MAX_OPLN))==NULL) {
374: cputs("memory allocation error\r\n");
375: bail(1); }
376:
377: /***
378: if(findfirst("MENU.ZIP",&ff,0)) {
379: cprintf("\7\r\nCan't find MENU.ZIP\r\n");
380: bail(1); }
381: if(findfirst("TEXT.ZIP",&ff,0)) {
382: cprintf("\7\r\nCan't find TEXT.ZIP\r\n");
383: bail(1); }
384: if(findfirst("DOCS.ZIP",&ff,0)) {
385: cprintf("\7\r\nCan't find DOCS.ZIP\r\n");
386: bail(1); }
387: if(findfirst("EXEC.ZIP",&ff,0)) {
388: cprintf("\7\r\nCan't find EXEC.ZIP\r\n");
389: bail(1); }
390: if(findfirst("PKUNZIP.EXE",&ff,0)) {
391: cprintf("\7\r\nCan't find PKUNZIP.EXE\r\n");
392: bail(1); }
393: ***/
394: uscrn("Synchronet Installation Utility Version 2.3");
395:
396: i=0;
397: while(1) {
398:
399: helpbuf=
400: " Synchronet Installation \r\n\r\n"
401: "If you are installing Synchronet for evaluation or demonstration\r\n"
402: "purposes, be sure to set &Install Registration Key& to &No&.\r\n\r\n"
403: "If do not have the &Synchronet Utilities Disk& (Distribution Disk 2), be\r\n"
404: "sure to set &Install Distribution Disk 2& to &None&.\r\n\r\n"
405: "When you are happy with the installation settings and the destination\r\n"
406: "path, select &Start Installation& to continue or hit ESC to abort.";
407:
408: j=0;
409: str[0]=0;
410: if((mode&DISK1)==DISK1)
411: strcpy(str,"All");
412: else {
413: if(!(mode&DISK1))
414: strcpy(str,"None");
415: else {
416: strcat(str,"Selected: ");
417: if(mode&EXEC)
418: strcat(str,"EXEC ");
419: if(mode&CFGS)
420: strcat(str,"CFGS ");
421: if(mode&TEXT)
422: strcat(str,"TEXT ");
423: if(mode&DOCS)
424: strcat(str,"DOCS "); } }
425: sprintf(opt[j++],"%-30.30s%s","Install Distribution Disk 1",str);
426: str[0]=0;
427: if((mode&DISK2)==DISK2)
428: strcpy(str,"All");
429: else {
430: if(!(mode&DISK2))
431: strcpy(str,"None");
432: else {
433: strcat(str,"Selected: ");
434: if(mode&UTIL)
435: strcat(str,"UTIL ");
436: if(mode&XTRN)
437: strcat(str,"XTRN ");
438: if(mode&XSDK)
439: strcat(str,"XSDK "); } }
440: sprintf(opt[j++],"%-30.30s%s","Install Distribution Disk 2",str);
441: sprintf(opt[j++],"%-30.30s%s","Source Path",install_from);
442: sprintf(opt[j++],"%-30.30s%s","Target Path",install_to);
443: strcpy(opt[j++],"Start Installation");
444: opt[j][0]=0;
445: switch(ulist(WIN_ORG|WIN_MID|WIN_ACT|WIN_ESC,0,0,60,&i,0
446: ,"Synchronet Multinode BBS Installation",opt)) {
447: case 0:
448: j=0;
449: while(1) {
450: k=0;
451: sprintf(opt[k++],"%-30.30s%3s","Main Executables"
452: ,mode&EXEC ? "Yes":"No");
453: sprintf(opt[k++],"%-30.30s%3s","Default Configuration"
454: ,mode&CFGS ? "Yes":"No");
455: sprintf(opt[k++],"%-30.30s%3s","Text and Menus"
456: ,mode&TEXT ? "Yes":"No");
457: sprintf(opt[k++],"%-30.30s%3s","Documentation"
458: ,mode&DOCS ? "Yes":"No");
459: strcpy(opt[k++],"All");
460: strcpy(opt[k++],"None");
461: opt[k][0]=0;
462: helpbuf=
463: " Distribution Disk 1 \r\n\r\n"
464: "If you are a installing Synchronet for the first time, it is suggested\r\n"
465: "that you install &All& of Disk 1.\r\n\r\n"
466: "If for some reason, you wish to partially install Synchronet or update\r\n"
467: "a previously installed version, you can toggle the installation of the\r\n"
468: "following file sets:\r\n\r\n"
469: "&EXEC&: Main executable files necessary for Synchronet to run\r\n\r\n"
470: "&CFGS&: Default configuration files\r\n\r\n"
471: "&TEXT&: Text and menu files\r\n\r\n"
472: "&DOCS&: Online ASCII documentation for the system operator";
473: j=ulist(0,0,0,0,&j,0,"Distribution Disk 1",opt);
474: if(j==-1)
475: break;
476: switch(j) {
477: case 0:
478: mode^=EXEC;
479: break;
480: case 1:
481: mode^=CFGS;
482: break;
483: case 2:
484: mode^=TEXT;
485: break;
486: case 3:
487: mode^=DOCS;
488: break;
489: case 4:
490: mode|=DISK1;
491: break;
492: case 5:
493: mode&=~DISK1;
494: break; } }
495: break;
496: case 1:
497: j=0;
498: while(1) {
499: k=0;
500: sprintf(opt[k++],"%-30.30s%3s","Utilities"
501: ,mode&UTIL ? "Yes":"No");
502: sprintf(opt[k++],"%-30.30s%3s","Online External Programs"
503: ,mode&XTRN ? "Yes":"No");
504: sprintf(opt[k++],"%-30.30s%3s","External Program SDK"
505: ,mode&XSDK ? "Yes":"No");
506: strcpy(opt[k++],"All");
507: strcpy(opt[k++],"None");
508: opt[k][0]=0;
509: helpbuf=
510: " Distribution Disk 2 \r\n\r\n"
511: "This disk is optional for the execution of Synchronet. This disk is\r\n"
512: "also referred to as the &Synchronet Utilities Disk&.\r\n\r\n"
513: "If for some reason, you wish to partially install Synchronet or update\r\n"
514: "a previously installed version, you can toggle the installation of the\r\n"
515: "following file sets:\r\n\r\n"
516: "&UTIL&: Utilities to enhance the operation of Synchronet\r\n\r\n"
517: "&XTRN&: Online External Program Samples\r\n\r\n"
518: "&XSDK&: External Program Software Development Kit (for programmers)";
519: j=ulist(WIN_RHT,0,0,0,&j,0,"Distribution Disk 2",opt);
520: if(j==-1)
521: break;
522: switch(j) {
523: case 0:
524: mode^=UTIL;
525: break;
526: case 1:
527: mode^=XTRN;
528: break;
529: case 2:
530: mode^=XSDK;
531: break;
532: case 3:
533: mode|=DISK2;
534: break;
535: case 4:
536: mode&=~DISK2;
537: break; } }
538: break;
539: case 2:
540: helpbuf=
541: " Source Path \r\n\r\n"
542: "This is the complete path (drive and directory) to install Synchronet\r\n"
543: "from. The suggested path is &A:\\&, but any valid DOS drive and\r\n"
544: "directory may be used.";
545: uinput(WIN_L2R,0,0,"Source Path",install_from
546: ,30,K_EDIT|K_UPPER);
547: backslash(install_from);
548: break;
549: case 3:
550: helpbuf=
551: " Target Path \r\n\r\n"
552: "This is the complete path (drive and directory) to install Synchronet\r\n"
553: "to. The suggested path is &C:\\SBBS\\&, but any valid DOS drive and\r\n"
554: "directory may be used.";
555: uinput(WIN_L2R|WIN_BOT,0,0,"Target Path",install_to
556: ,20,K_EDIT|K_UPPER);
557: backslash(install_to);
558: break;
559: case 4:
560: strcpy(opt[0],"Yes");
561: strcpy(opt[1],"No");
562: opt[2][0]=0;
563: j=1;
564: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
565: ,"Are you upgrading from an older version (already installed)"
566: ,opt);
567: if(j==-1)
568: break;
569: if(j==0) {
570: helpbuf=
571: " Upgrade Back-up \r\n"
572: "\r\n"
573: "&INSTALL& will take care to only overwrite files that have been changed\r\n"
574: "in this new version, but it is always a good idea to do a complete\r\n"
575: "system back-up before upgrading, just to be safe.\r\n"
576: "\r\n"
577: "If you have customized (with an editor) any of the following files, you\r\n"
578: "will want to &back them up& (copy to another disk or directory) before\r\n"
579: "you begin the upgrade procedure:\r\n"
580: "\r\n"
581: "&TEXT.DAT& (CTRL\\TEXT.DAT)\r\n"
582: "&Command Shells and Loadable Modules& (EXEC\\*.SRC)\r\n"
583: "&Menus& (TEXT\\MENU\\*.ASC)\r\n"
584: "&Match Maker Questionnaires& (XTRN\\SMM\\*.QUE)\r\n"
585: "&External Program Menus& (XTRN\\SMM\\*.ASC, XTRN\\SCB\\*.ASC, etc)\r\n";
586: help();
587: strcpy(opt[0],"Yes");
588: strcpy(opt[1],"No");
589: opt[2][0]=0;
590: j=0;
591: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
592: ,"Continue with upgrade"
593: ,opt);
594: if(j)
595: break;
596: mode|=UPGRADE;
597: mode&=~CFGS; }
598: else
599: mode&=~UPGRADE;
600: strcpy(str,install_to);
601: if(str[1]==':') /* drive letter specified */
602: setdisk(toupper(str[0])-'A');
603: if(!md(str))
604: break;
605: sprintf(exec_dir,"%sEXEC\\",install_to);
606: if(mode&UPGRADE)
607: if(uinput(WIN_L2R|WIN_SAV,0,0,"EXEC Directory",exec_dir
608: ,30,K_EDIT|K_UPPER)<1)
609: break;
610: backslash(exec_dir);
611: if(!md(exec_dir))
612: break;
613: if(mode&UPGRADE) {
614: sprintf(str,"%sSBBS.EXE",exec_dir);
615: l=fdate_dir(str);
616: ver=NONE;
617: switch(l) {
618: case 0x3044fb80: /* 08/31/95 v2.20a */
619: ver=SBBS22;
620: break;
621: case 0x2f6a2280: /* 03/18/95 v2.11a */
622: case 0x2f43e700: /* 02/17/95 v2.10a */
623: ver=SBBS21;
624: break;
625: case 0x2e6fa580: /* 09/09/94 v2.00g */
626: case 0x2e627680: /* 08/30/94 v2.00f */
627: case 0x2e5a8d80: /* 08/24/94 v2.00e */
628: case 0x2e569900: /* 08/21/94 v2.00d */
629: case 0x2e554780: /* 08/20/94 v2.00c */
630: case 0x2e0b7380: /* 06/25/94 v2.00b */
631: case 0x2ded2100: /* 06/02/94 v2.00a */
632: ver=SBBS20;
633: break; }
634: if(ver==NONE && flength(str)==642448UL)
635: ver=SBBS22; /* v2.20b - possibly patched */
636: if(ver==NONE) {
637: strcpy(opt[0],"Version 1");
638: strcpy(opt[1],"Version 2.0");
639: strcpy(opt[2],"Version 2.1");
640: strcpy(opt[3],"Version 2.2");
641: strcpy(opt[4],"Version 2.3 beta");
642: opt[5][0]=0;
643: j=0;
644: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
645: ,"Which version are you upgrading from?"
646: ,opt);
647: if(j<0)
648: break;
649: ver=j;
650: if(ver==NONE) { // Version 1
651: umsg("INSTALL can only upgrade from Version 2.0 or later");
652: umsg("See the file UPGRADE.DOC for UPGRADE instructions");
653: break; } } }
654:
655: if(mode&EXEC) {
656: strcpy(opt[0],"Skip This Disk");
657: strcpy(opt[1],"Okay, Try Again");
658: strcpy(opt[2],"Change Source Path...");
659: opt[3][0]=0;
660: j=1;
661: while(1) {
662: sprintf(str,"%sEXEC.LZH",install_from);
663: if(!findfirst(str,&ff,0))
664: break;
665: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
666: ,"Insert Distribution Disk 1",opt);
667: if(j==-1)
668: break;
669: if(j==0) {
670: mode&=~DISK1;
671: break; }
672: if(j==2) {
673: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
674: ,30,K_EDIT|K_UPPER);
675: backslash(install_from); } }
676: if(j==-1)
677: break;
678:
679: /* If they already exist, flag as read/write */
680: if(mode&DISK1) {
681: sprintf(str,"%sSBBS.EXE",exec_dir);
682: chmod(str,S_IREAD|S_IWRITE);
683: sprintf(str,"%sSCFG.EXE",exec_dir);
684: chmod(str,S_IREAD|S_IWRITE);
685:
686: sprintf(str,"%sEXEC.LZH",install_from);
687: sprintf(tmp,"%sEXEC.LZH",exec_dir);
688: if(copy(str,tmp))
689: break;
690: if(mode&UPGRADE) {
691: sprintf(str,"@%sEXEC.UPG",install_from);
692: if(fexist(str+1))
693: if(unarc(1,tmp,exec_dir,str)) {
694: remove(tmp);
695: break; }
696: if(unarc(0,tmp,exec_dir,NULL)) {
697: remove(tmp);
698: break; } }
699: else
700: if(unarc(1,tmp,exec_dir,NULL)) {
701: remove(tmp);
702: break; }
703: remove(tmp);
704:
705: /* now set to READ ONLY */
706: sprintf(str,"%sSBBS.EXE",exec_dir);
707: if(chmod(str,S_IREAD))
708: umsg("Error setting SBBS.EXE to READ ONLY");
709: sprintf(str,"%sSCFG.EXE",exec_dir);
710: if(chmod(str,S_IREAD))
711: umsg("Error setting SCFG.EXE to READ ONLY"); } }
712:
713: if(mode&CFGS) {
714: sprintf(str,"%sCTRL",install_to);
715: if(!md(str))
716: break;
717: strcpy(opt[0],"Skip This Disk");
718: strcpy(opt[1],"Okay, Try Again");
719: strcpy(opt[2],"Change Source Path...");
720: opt[3][0]=0;
721: j=1;
722: while(1) {
723: sprintf(str,"%sCFGS.LZH",install_from);
724: if(!findfirst(str,&ff,0))
725: break;
726: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
727: ,"Insert Distribution Disk 1",opt);
728: if(j==-1)
729: break;
730: if(j==0) {
731: mode&=~DISK1;
732: break; }
733: if(j==2) {
734: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
735: ,30,K_EDIT|K_UPPER);
736: backslash(install_from); } }
737: if(j==-1)
738: break;
739: if(mode&DISK1) { /* not skip */
740: sprintf(str,"%sCFGS.LZH",install_from);
741: sprintf(tmp,"%sCFGS.LZH",install_to);
742: if(copy(str,tmp))
743: break;
744: sprintf(str,"%sCTRL",install_to);
745: if(unarc(1,tmp,install_to,NULL)) {
746: remove(tmp);
747: break; }
748: remove(tmp); } }
749:
750: if(mode&TEXT) {
751: sprintf(ctrl_dir,"%sCTRL\\",install_to);
752: if(!md(ctrl_dir))
753: break;
754: sprintf(text_dir,"%sTEXT\\",install_to);
755: if(!md(text_dir))
756: break;
757: strcpy(opt[0],"Skip This Disk");
758: strcpy(opt[1],"Okay, Try Again");
759: strcpy(opt[2],"Change Source Path...");
760: opt[3][0]=0;
761: j=1;
762: while(1) {
763: sprintf(str,"%sTEXT.LZH",install_from);
764: if(!findfirst(str,&ff,0))
765: break;
766: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
767: ,"Insert Distribution Disk 1",opt);
768: if(j==-1)
769: break;
770: if(j==0) {
771: mode&=~DISK1;
772: break; }
773: if(j==2) {
774: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
775: ,30,K_EDIT|K_UPPER);
776: backslash(install_from); } }
777: if(j==-1)
778: break;
779: if(mode&DISK1) {
780: sprintf(str,"%sTEXT.LZH",install_from);
781: sprintf(tmp,"%sTEXT.LZH",install_to);
782: if(copy(str,tmp))
783: break;
784: if(mode&UPGRADE) {
785: sprintf(str,"@%sTEXT.UPG",install_from);
786: if(fexist(str+1))
787: if(unarc(1,tmp,install_to,str)) {
788: remove(tmp);
789: break; }
790: if(unarc(0,tmp,install_to,NULL)) {
791: remove(tmp);
792: break; } }
793: else
794: if(unarc(1,tmp,install_to,NULL)) {
795: remove(tmp);
796: break; }
797: remove(tmp); } }
798:
799: if(mode&DOCS) {
800: sprintf(docs_dir,"%sDOCS\\",install_to);
801: if(mode&UPGRADE)
802: if(uinput(WIN_L2R|WIN_SAV,0,0,"DOCS Directory",docs_dir
803: ,30,K_EDIT|K_UPPER)<1)
804: break;
805: backslash(docs_dir);
806: if(!md(docs_dir))
807: break;
808: strcpy(opt[0],"Skip This Disk");
809: strcpy(opt[1],"Okay, Try Again");
810: strcpy(opt[2],"Change Source Path...");
811: opt[3][0]=0;
812: j=1;
813: while(1) {
814: sprintf(str,"%sDOCS.LZH",install_from);
815: if(!findfirst(str,&ff,0))
816: break;
817: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
818: ,"Insert Distribution Disk 1",opt);
819: if(j==-1)
820: break;
821: if(j==0) {
822: mode&=~DISK1;
823: break; }
824: if(j==2) {
825: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
826: ,30,K_EDIT|K_UPPER);
827: backslash(install_from); } }
828: if(j==-1)
829: break;
830: if(mode&DISK1) {
831: sprintf(str,"%sDOCS.LZH",install_from);
832: sprintf(tmp,"%sDOCS.LZH",install_to);
833: if(copy(str,tmp))
834: break;
835: if(unarc(1,tmp,docs_dir,NULL)) {
836: remove(tmp);
837: break; }
838: remove(tmp); } }
839:
840: if(mode&UTIL) {
841: strcpy(opt[0],"Skip This Disk");
842: strcpy(opt[1],"Okay, Try Again");
843: strcpy(opt[2],"Change Source Path...");
844: opt[3][0]=0;
845: j=1;
846: while(1) {
847: sprintf(str,"%sUTIL.LZH",install_from);
848: if(!findfirst(str,&ff,0))
849: break;
850: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
851: ,"Insert Distribution Disk 2 (Utilities Disk)",opt);
852: if(j==-1)
853: break;
854: if(j==0) {
855: mode&=~DISK2;
856: break; }
857: if(j==2) {
858: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
859: ,30,K_EDIT|K_UPPER);
860: backslash(install_from); } }
861: if(j==-1)
862: break;
863:
864: if(mode&DISK2) {
865: sprintf(str,"%sUTIL.LZH",install_from);
866: sprintf(tmp,"%sUTIL.LZH",exec_dir);
867: if(copy(str,tmp))
868: break;
869: if(mode&UPGRADE) {
870: sprintf(str,"@%sUTIL.UPG",install_from);
871: if(fexist(str+1))
872: if(unarc(1,tmp,exec_dir,str)) {
873: remove(tmp);
874: break; }
875: if(unarc(0,tmp,exec_dir,NULL)) {
876: remove(tmp);
877: break; } }
878: else
879: if(unarc(1,tmp,exec_dir,NULL)) {
880: remove(tmp);
881: break; }
882: remove(tmp); } }
883:
884: if(mode&XTRN) {
885: sprintf(str,"%sXTRN",install_to);
886: if(!md(str))
887: break;
888: strcpy(opt[0],"Skip This Disk");
889: strcpy(opt[1],"Okay, Try Again");
890: strcpy(opt[2],"Change Source Path...");
891: opt[3][0]=0;
892: j=1;
893: while(1) {
894: sprintf(str,"%sXTRN.LZH",install_from);
895: if(!findfirst(str,&ff,0))
896: break;
897: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
898: ,"Insert Distribution Disk 2 (Utilities Disk)",opt);
899: if(j==-1)
900: break;
901: if(j==0) {
902: mode&=~DISK2;
903: break; }
904: if(j==2) {
905: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
906: ,30,K_EDIT|K_UPPER);
907: backslash(install_from); } }
908: if(j==-1)
909: break;
910:
911: if(mode&DISK2) {
912: sprintf(str,"%sXTRN.LZH",install_from);
913: sprintf(tmp,"%sXTRN.LZH",install_to);
914: if(copy(str,tmp))
915: break;
916: if(mode&UPGRADE) {
917: sprintf(str,"@%sXTRN.UPG",install_from);
918: if(fexist(str+1))
919: if(unarc(1,tmp,install_to,str)) {
920: remove(tmp);
921: break; }
922: if(unarc(0,tmp,install_to,NULL)) {
923: remove(tmp);
924: break; } }
925: else
926: if(unarc(1,tmp,install_to,NULL)) {
927: remove(tmp);
928: break; }
929: remove(tmp); } }
930:
931: if(mode&XSDK) {
932: sprintf(str,"%sXTRN",install_to);
933: if(!md(str))
934: break;
935: sprintf(str,"%sXTRN\\SDK",install_to);
936: if(!md(str))
937: break;
938: strcpy(opt[0],"Skip This Disk");
939: strcpy(opt[1],"Okay, Try Again");
940: strcpy(opt[2],"Change Source Path...");
941: opt[3][0]=0;
942: j=1;
943: while(1) {
944: sprintf(str,"%sXSDK.LZH",install_from);
945: if(!findfirst(str,&ff,0))
946: break;
947: j=ulist(WIN_MID|WIN_SAV,0,0,0,&j,0
948: ,"Insert Distribution Disk 2 (Utilities Disk)",opt);
949: if(j==-1)
950: break;
951: if(j==0) {
952: mode&=~DISK2;
953: break; }
954: if(j==2) {
955: uinput(WIN_L2R|WIN_SAV,0,0,"Source Path",install_from
956: ,30,K_EDIT|K_UPPER);
957: backslash(install_from); } }
958: if(j==-1)
959: break;
960:
961: if(mode&DISK2) {
962: sprintf(str,"%sXSDK.LZH",install_from);
963: sprintf(tmp,"%sXTRN\\XSDK.LZH",install_to);
964: if(copy(str,tmp))
965: break;
966: sprintf(str,"%sXTRN\\SDK\\",install_to);
967: if(unarc(1,tmp,str,NULL)) {
968: remove(tmp);
969: break; }
970: remove(tmp); } }
971: sprintf(str,"%sNODE1",install_to);
972: chdir(str);
973: if(mode&UPGRADE) {
974: helpbuf=
975: " Additional Upgrade Instructions \r\n"
976: "\r\n"
977: "If you were previously running version 1.1 of &SyncEdit&, you'll need to\r\n"
978: "change your command lines and toggle options in SCFG for this new\r\n"
979: "version (2.0). See &DOCS\\SYNCEDIT.DOC& for details.\r\n"
980: "\r\n"
981: "Make sure you have &SCFG->System->Loadable Modules->Login& set to &LOGIN&\r\n"
982: "and &SCFG->System->Loadable Modules->Logon& set to &LOGON&.\r\n"
983: "\r\n"
984: "If you want your users to be able to use &WIP& compatible terminals with\r\n"
985: "your BBS, add &WIPSHELL& to &SCFG->Command Shells& with an Access\r\n"
986: "Requirement String of \"&WIP&\".";
987: help(); }
988: uifcbail();
989: if(mode&UPGRADE) {
990: cprintf("Synchronet Upgrade Complete.\r\n");
991: exit(0); }
992: if(mode&CFGS)
993: p="/F";
994: else
995: p=NULL;
996: spawnl(P_WAIT,"..\\EXEC\\SCFG.EXE"
997: ,"..\\EXEC\\SCFG","..\\CTRL",p,NULL);
998: textattr(LIGHTGRAY);
999: cprintf(
1000: "Synchronet BBS and its utilities use file and record locking to maintain\r\n"
1001: "data integrity in a multinode environment. File and record locking under DOS\r\n"
1002: "requires the use of SHARE.\r\n"
1003: "\r\n"
1004: );
1005: cprintf(
1006: "SHARE is a program that is distributed with MS-DOS and PC-DOS v3.0 and higher\r\n"
1007: "and must be executed prior to running SBBS. SHARE.EXE should be located in the\r\n"
1008: "DOS directory of your hard disk.\r\n"
1009: "\r\n"
1010: );
1011: cprintf(
1012: "If you are running Microsoft Windows, you must exit Windows and load SHARE\r\n"
1013: "before reloading Windows.\r\n"
1014: "\r\n"
1015: );
1016: cprintf(
1017: "It is not necessary to run SHARE if using a single node on a Novell NetWare\r\n"
1018: "workstation or in an OS/2 DOS window.\r\n"
1019: "\r\n"
1020: );
1021: cprintf(
1022: "SHARE.EXE can be automatically loaded in your AUTOEXEC.BAT or CONFIG.SYS.\r\n"
1023: "\r\n"
1024: );
1025: textattr(WHITE);
1026: cprintf(
1027: "After you have loaded SHARE, type SBBS from THIS directory.\r\n"
1028: );
1029: textattr(LIGHTGRAY);
1030: exit(0);
1031: case -1:
1032: j=0;
1033: strcpy(opt[0],"Yes");
1034: strcpy(opt[1],"No");
1035: opt[2][0]=0;
1036: if(!(ulist(WIN_MID,0,0,20,&j,0,"Abort Installation",opt)))
1037: bail(0);
1038: break; } }
1039: }
1040:
1041: void bail(int code)
1042: {
1043:
1044: if(code)
1045: getch();
1046: uifcbail();
1047: exit(code);
1048: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.