Annotation of sbbs/sbbs2/install/install.c, revision 1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.