Annotation of coherent/d/support/bbsadmin/adminbbs.c, revision 1.1

1.1     ! root        1: #include "contents.h"
        !             2: #include <stdio.h>
        !             3: #include <curses.h>
        !             4: 
        !             5: char selection[15];
        !             6: char filenames [MAXRECORDS][15];
        !             7: char workfile[15];
        !             8: char workstring[80];
        !             9: char getfiles[26][115];
        !            10: char open_mode;
        !            11: int place[MAXRECORDS];
        !            12: int limit, screen_num;
        !            13: 
        !            14: void bubble(); /* this is a bubble sort */
        !            15: void show_files(); /* this should display the filenames on a curses screen */
        !            16: int lite(); /* inverse/normal video display of a filename */
        !            17: int rfile(); /* read records from a given file */
        !            18: void write_win(); /*does the actual work of writing filenames to a window */
        !            19: void display_form(); /* for for displaying selected filename */
        !            20: void display_record(); /* display selected filename */
        !            21: void menu(); /* menu printed at bottom of screen */
        !            22: void del_rec(); /* this will be used to delete records */
        !            23: void add_rec(); /* this will be used to add records */
        !            24: void getstring(); /* this will be called by add_rec to get input */
        !            25: void build_uucp(); /* this will build multiple uucp requests */
        !            26: 
        !            27: struct entry{
        !            28:                char filename [15];
        !            29:                char filesize [10];
        !            30:                char date[7];
        !            31:                char description [78];
        !            32:                char requires [60];
        !            33:                char notes [78];
        !            34:                char pathname [60];
        !            35:                int noparts;
        !            36:            }
        !            37: 
        !            38: 
        !            39: main(argc, argv)
        !            40: int argc;
        !            41: char *argv[];
        !            42: {
        !            43: 
        !            44: int x;
        !            45: 
        !            46: 
        !            47:        if(argc < 2)
        !            48:        {
        !            49:                printf("Usage: mwcbbs [adr] filename\n");
        !            50:                printf("[a] add\n[d] download\n[r] remove\n");
        !            51:                exit(1);
        !            52:        }
        !            53: 
        !            54: 
        !            55:        if(strlen(argv[2]) == 0)
        !            56:        {
        !            57:                printf("filename not specified. Please enter a filename: ");
        !            58:                gets (workfile);
        !            59:        }
        !            60:        else
        !            61: 
        !            62:                strcpy(workfile, argv[2]);
        !            63: 
        !            64:        if(argv[1][0] != 'a')
        !            65:                if(argv[1][0] != 'd')
        !            66:                        if(argv[1][0] != 'r')
        !            67:                                {
        !            68:                                printf("Option %c not recognized!\n",argv[1][0]);
        !            69:                                exit(1);
        !            70:                                }
        !            71: 
        !            72:        open_mode = argv[1][0];
        !            73: 
        !            74:        screen_num = 0;
        !            75: 
        !            76:        x = rfile();
        !            77:        show_files  (x);
        !            78: 
        !            79: }
        !            80: 
        !            81: 
        !            82: 
        !            83: 
        !            84: /*     show_files()
        !            85:  *     This function will display the filenames read to a curses
        !            86:  *     screen.
        !            87: */
        !            88: 
        !            89: 
        !            90: void show_files(EOF_FLAG)
        !            91: int EOF_FLAG;
        !            92: 
        !            93: {
        !            94: char arrow;
        !            95: int prevcol =1;
        !            96: int prevrow =0;                        /* prevcol = column before arrow          */
        !            97: int newrow =0;                 /* prevrow = row before arrow             */
        !            98: int newcol =1;                 /* newrow = row after arrow               */
        !            99: int counter = 0;               /* newcol = column after arrow            */
        !           100:                                
        !           101:                                
        !           102: WINDOW *win1, *win2;           
        !           103:                                
        !           104:        initscr();              
        !           105:        noecho();
        !           106:        raw();
        !           107: 
        !           108:        /* allocate memory for window. print message on failure. */
        !           109: 
        !           110:        if((win1=newwin(20, 79, 0,0)) == NULL)
        !           111:        {
        !           112:                printf("\007Window Memroy allocation for win1 failed!\n");
        !           113:                exit(1);
        !           114:        }
        !           115: 
        !           116:        if((win2=newwin(20, 79, 0,0)) == NULL)
        !           117:        {
        !           118:                printf("\007Window Memroy allocation for win2 failed!\n");
        !           119:                exit(1);
        !           120:        }
        !           121: 
        !           122:        write_win(win1);
        !           123:        menu();
        !           124: 
        !           125: 
        !           126: /*  highlite a filename. This is accomplished by going to a designated
        !           127:  * row and column, as determined by the row and counter nested loops.
        !           128:  * The innermost loop gets the character found, copies the retrieved 
        !           129:  * character into a string and deletes the character from the screen.
        !           130:  * When the filename has been deleted from the screen, it is reprinted
        !           131:  * to the screen with highliting turned on. Padding for spaces must be
        !           132:  * accounted for since deleting chars shifts everything on the line one
        !           133:  * space to the left.
        !           134: */
        !           135: 
        !           136:        /* print the first file in inverse video */
        !           137: 
        !           138:        lite (win1, prevrow, prevcol, 1);
        !           139: 
        !           140:        do
        !           141:        {
        !           142: 
        !           143:        /* now we need to get a key (preferably an arrow) */
        !           144: 
        !           145: 
        !           146: 
        !           147:              arrow = getch();   /* This stupid code should allow to use arrows keys   */
        !           148:              if (arrow == 27)  /* that looks more frendly than hjkl. Vlad 8/15/91    */
        !           149:                {
        !           150:                 getch();
        !           151:                 arrow = getch(); /* When an arrow key is pressed, an escape  */
        !           152:                 if (arrow == 68) /* sequence is returned. The value '27'     */
        !           153:                    arrow = 'h';  /* begins the sequence and the relevant     */
        !           154:                 if (arrow == 67) /* values needed end the sequence. The      */
        !           155:                    arrow = 'l';  /* middle value is not needed, so it is     */
        !           156:                 if (arrow == 66) /* skipped over with a getch() statement    */
        !           157:                   arrow = 'j';
        !           158:                 if (arrow == 65)
        !           159:                    arrow = 'k';                
        !           160:                 }
        !           161: 
        !           162: 
        !           163: /* each movement case in the following switch...case will test to see if the
        !           164:  * new position returns a space. If a space is returned, then we will hit
        !           165:  * an empty field, which we don't want to do. If we hit an empty space,
        !           166:  * then don't move the cursor.
        !           167: */
        !           168: 
        !           169:                switch(arrow)
        !           170:                {
        !           171:                        case 'h':       /* move left */
        !           172:                                newcol = prevcol - 15;
        !           173:                                if (newcol < 1)
        !           174:                                        newcol = 61;
        !           175:                                if (' ' == mvwinch(win1,newrow,newcol))
        !           176:                                        newcol = 1;
        !           177:                                break;
        !           178: 
        !           179: 
        !           180:                        case 'l':       /* move right */
        !           181:                                newcol = prevcol + 15;
        !           182:                                if (newcol > 61)
        !           183:                                        newcol = 1;
        !           184:                                if (' ' == mvwinch(win1,newrow,newcol))
        !           185:                                        newcol = 1;
        !           186:                                break;
        !           187: 
        !           188: 
        !           189:                        case 'j':       /* move down */
        !           190:                                newrow = prevrow + 1;
        !           191:                                if (newrow == 20)
        !           192:                                        newrow = 0;
        !           193:                                if (' ' == mvwinch(win1,newrow,newcol))
        !           194:                                        newrow = 0;
        !           195:                                break;
        !           196: 
        !           197: 
        !           198:                        case 'k':       /* move up */
        !           199:                                newrow = prevrow -1;
        !           200:                                if (newrow == -1)
        !           201:                                        newrow = 19;
        !           202:                                if (' ' == mvwinch(win1,newrow,newcol))
        !           203:                                        newrow = 0;
        !           204:                                break;
        !           205: 
        !           206: 
        !           207:                        case 'p':       
        !           208:                                screen_num --;
        !           209:                                newrow = 0;
        !           210:                                newcol = 1;
        !           211:                                if (screen_num < 0)
        !           212:                                        screen_num = 0;
        !           213:                                else
        !           214:                                {
        !           215:                                        EOF_FLAG = rfile();
        !           216:                                        write_win(win1);
        !           217:                                }
        !           218:                                break;
        !           219:        
        !           220: 
        !           221:                        case 'n':       
        !           222:                                newrow = 0;
        !           223:                                newcol = 1;
        !           224:                                if (EOF_FLAG == -1)
        !           225:                                        break;
        !           226:                                else
        !           227:                                {
        !           228:                                        screen_num ++;
        !           229:                                        EOF_FLAG = rfile();
        !           230:                                        write_win(win1);
        !           231:                                }
        !           232:                                break;  
        !           233: 
        !           234: 
        !           235:                        case 'q':
        !           236:                                break;
        !           237: 
        !           238:                        case 'Q':
        !           239:                                break;
        !           240: 
        !           241:                        case 'S':
        !           242:                        case 's':
        !           243:                                wclear(win1);
        !           244:                                wrefresh(win1);
        !           245:                                wclear(win2);
        !           246:                                display_form(win2);
        !           247:                                if (open_mode == 'a')
        !           248:                                        add_rec(win2, prevrow, prevcol, screen_num);
        !           249:                                else
        !           250:                                        display_record(win2,prevrow, prevcol, screen_num);
        !           251:                                clear();
        !           252:                                menu();
        !           253:                                if( open_mode == 'a' || open_mode == 'r')
        !           254:                                        {
        !           255:                                        wmove (win2,0,0);
        !           256:                                        waddstr(win2,"Reading file. Please wait...");
        !           257:                                        wrefresh(win2); 
        !           258:                                        rfile();
        !           259:                                        }
        !           260:                                write_win(win1);
        !           261:                                wclear(win2);
        !           262:                                wrefresh(win2);
        !           263:                                refresh();
        !           264:                                wrefresh(win1);
        !           265:                                break;
        !           266: 
        !           267:                        default:
        !           268:                                newcol = prevcol;
        !           269:                                newrow = prevrow;
        !           270:                                break;
        !           271: 
        !           272:                }
        !           273: 
        !           274:        /* print previous file highlited in normal video */
        !           275:        lite (win1, prevrow, prevcol, 0);       
        !           276: 
        !           277:        /* print new filename selection in inverse video */
        !           278: 
        !           279:        lite (win1, newrow, newcol, 1);
        !           280: 
        !           281:        /* set our previous coordinates so that we can go back
        !           282:         * and unlite a field when the next directin is given.
        !           283:        */
        !           284: 
        !           285:                prevrow = newrow;
        !           286:                prevcol = newcol;
        !           287: 
        !           288:        
        !           289:        }
        !           290:        while (arrow != 'q');
        !           291: 
        !           292:        echo();
        !           293:        noraw();
        !           294:        endwin();
        !           295: }
        !           296:                
        !           297: 
        !           298:                
        !           299: 
        !           300: /* this routine will take a pointer to a window and row/col
        !           301:  * coordinates and print a filename found at the coordinates
        !           302:  * in INVERSE video.
        !           303: */
        !           304: 
        !           305: int lite(win1, row, col, liteflag)
        !           306: 
        !           307: WINDOW *win1;
        !           308: int row, col, liteflag;
        !           309: 
        !           310: {
        !           311: 
        !           312: int x,y;
        !           313: char litestring[15];
        !           314: 
        !           315:        wmove(win1, row,col);
        !           316: 
        !           317:        /* get existing filename char by char, deleting each
        !           318:         * char as it is read into a string variable.
        !           319:        */
        !           320:        
        !           321:        for(x=0; x<15; x++)
        !           322:        {
        !           323:                litestring[x] = winch(win1);
        !           324:        /* if we hit a space, we've hit the end of the filename */
        !           325:                if(litestring[x] == ' ')
        !           326:                        break;
        !           327:                wdelch(win1);
        !           328:        }
        !           329: 
        !           330:        litestring[x] = '\0';
        !           331: 
        !           332: 
        !           333:        /* repad the spaces to keep the remaning filenames
        !           334:         * on this row in their proper columns.
        !           335:        */
        !           336: 
        !           337:        for(y=0;y<x;y++)
        !           338:                winsch(win1,' ');
        !           339: 
        !           340:        if (liteflag == 1)
        !           341:                wstandout(win1);
        !           342: 
        !           343:        waddstr(win1, litestring);
        !           344:        wmove(win1, row, col);
        !           345: 
        !           346:        if (liteflag == 1)
        !           347:                wstandend(win1);
        !           348: 
        !           349: 
        !           350:        /* copy filename to a string to be displayed on stdscr.
        !           351:         * as a filename is highlited, it is also displayed on
        !           352:         * stdscr. 'selection' will be used in case the user
        !           353:         * hits return to locate the filename's entry in the
        !           354:         * Contents file.
        !           355:        */
        !           356: 
        !           357:        strcpy(selection, litestring);
        !           358:        move (23,0);
        !           359:        printw("Selected filename is: %14s", selection);
        !           360: 
        !           361:        refresh();
        !           362:        wrefresh(win1);
        !           363: 
        !           364:        return(0);
        !           365: 
        !           366: }
        !           367:                
        !           368: 
        !           369:                
        !           370: 
        !           371: 
        !           372: int rfile()
        !           373: 
        !           374: {
        !           375: struct entry record;
        !           376: FILE *infp;
        !           377: int EOF_FLAG;
        !           378: 
        !           379:        /* open file, abort on error */
        !           380: 
        !           381:        if ((infp = fopen(workfile,"r")) == NULL)
        !           382:                {
        !           383:                printf("\007ERROR opening file for input!\n");
        !           384:                exit(1);
        !           385:                }
        !           386: 
        !           387:        /* open a file then go to a an offset calculated by a 
        !           388:         * value passed from the calling program. Once we hit
        !           389:         * the max number of records that can be held by a screen,
        !           390:         * terminate the read and set a flag to show that we did
        !           391:         * not hit EOF. If we did hit EOF, terminate the loop
        !           392:         * and set a flag to show that we did hit EOF.
        !           393:        */
        !           394: 
        !           395:        /* start reading from a specified point in the file */
        !           396:        fseek(infp, (sizeof (struct entry) * (screen_num * 100)), 0l);
        !           397: 
        !           398:        limit = 0;
        !           399:        while((fread(&record, sizeof(struct entry),1, infp)) != 0)
        !           400:                {
        !           401:                strcpy(filenames[limit], record.filename);
        !           402:                place[limit] = limit;
        !           403:                limit++;
        !           404:                if (limit == 100)
        !           405:                        break;
        !           406:                }
        !           407: 
        !           408:        /* if x made it to 100, then we did NOT hit EOF */
        !           409: 
        !           410: if ( (limit == 100) && (fread (&record,sizeof(struct entry),1,infp)) !=  0)
        !           411:                EOF_FLAG = 0;
        !           412:        else
        !           413:                EOF_FLAG = -1;
        !           414: 
        !           415:        fclose(infp);
        !           416:        return (EOF_FLAG);
        !           417: 
        !           418: }
        !           419: 
        !           420: 
        !           421: 
        !           422: /*
        !           423:  * writewin();
        !           424:  * this routine does the actual work of writing filenames to a window
        !           425: */
        !           426: 
        !           427: void write_win(win1)
        !           428: 
        !           429: WINDOW *win1;
        !           430: 
        !           431: {
        !           432: 
        !           433: int r,c;       /* these are our rows and columns */
        !           434: int counter = 0;       /* this counts the number of files written */
        !           435: 
        !           436: 
        !           437: 
        !           438:        /* clear the window */
        !           439:        wclear(win1);
        !           440: 
        !           441:        /* the following loop will write the filenames to the window.
        !           442:         * 15 characters per screen field are allowed, since a filename 
        !           443:         * can only be 14 chars in length. This will leave at least one 
        !           444:         * space between filenames.
        !           445:        */
        !           446: 
        !           447:                for (r = 0; r < 20; r++)
        !           448:                {
        !           449:        
        !           450:                        /* if we've run out of files, terminate loop */
        !           451: 
        !           452:                        if (counter == limit)
        !           453:                                break;
        !           454: 
        !           455:                        /* increment column by 15 positions. This
        !           456:                         * will cause the filenames to line up
        !           457:                         * on the window.
        !           458:                        */
        !           459:        
        !           460:                        for (c = 1; c < 75; c+= 15)
        !           461:                        {
        !           462:                        wmove(win1, r, c);
        !           463:                        waddstr(win1, filenames[counter]);
        !           464: 
        !           465:                /* increment counter. When it equals the number of
        !           466:                 * records, passed as 'limit', the loop should
        !           467:                 * terminate.
        !           468:                */
        !           469: 
        !           470:                        counter ++;
        !           471:                        if (counter == limit)
        !           472:                                break;
        !           473:                        }
        !           474:                }
        !           475: 
        !           476: 
        !           477: }
        !           478: 
        !           479: /* this function will draw a template for the selected record */
        !           480: 
        !           481: void display_form(win2)
        !           482: WINDOW *win2;
        !           483: 
        !           484: 
        !           485: {
        !           486: int x;
        !           487: 
        !           488:        clear();
        !           489:        wclear(win2);
        !           490: 
        !           491:        /* print field labels */
        !           492: 
        !           493:        wmove (win2, NAMELOCATE );
        !           494:        waddstr (win2,"Filename:");
        !           495: 
        !           496:        wmove (win2, DESCLOCATE);
        !           497:        waddstr(win2,"Description:");
        !           498: 
        !           499:        wmove(win2, DATELOCATE );
        !           500:        waddstr(win2,"Date added/modified:");
        !           501: 
        !           502:        wmove(win2, SIZELOCATE);
        !           503:        waddstr(win2,"File size:");
        !           504: 
        !           505:        if(open_mode != 'd')
        !           506:                {
        !           507:                wmove(win2, PARTLOCATE);;
        !           508:                waddstr(win2,"Number of parts to download:");
        !           509:                }
        !           510: 
        !           511:        wmove(win2, REQLOCATE );
        !           512:        waddstr(win2,"Requires these other files:");
        !           513: 
        !           514:        wmove(win2, NOTELOCATE);
        !           515:        waddstr(win2,"Other notes:");
        !           516: 
        !           517:        if(open_mode != 'd')
        !           518:                {
        !           519:                wmove(win2, PATHLOCATE);
        !           520:                waddstr(win2, "Path to download file... Must give complete path including filename.");
        !           521:                wmove (win2, PATHLOCATE2);
        !           522:                waddstr(win2,"If a file is split into several parts, enter the first filename part");
        !           523:                wmove (win2, PATHLOCATE3);
        !           524:                waddstr(win2,"leaving the LAST character off of the filename:");
        !           525:                }
        !           526: 
        !           527: 
        !           528: /* highlite available fields */
        !           529: 
        !           530:        wstandout(win2);
        !           531: 
        !           532:        wmove (win2, NAMEHI);
        !           533:        waddstr(win2,"              ");
        !           534: 
        !           535:        wmove (win2,DESCHI);
        !           536:        for (x=1;x<79;x++)
        !           537:                waddstr(win2," ");
        !           538: 
        !           539:        wmove(win2, DATEHI);
        !           540:        waddstr(win2,"      ");
        !           541: 
        !           542:        wmove(win2, SIZEHI);
        !           543:        waddstr(win2,"          ");
        !           544: 
        !           545:        if (open_mode != 'd')
        !           546:                {
        !           547:                wmove(win2,PARTHI);
        !           548:                waddstr(win2,"  ");
        !           549:                }
        !           550: 
        !           551:        wmove (win2,REQHI);
        !           552:        for (x=1;x<61;x++)
        !           553:                waddstr(win2," ");
        !           554: 
        !           555:        wmove (win2,NOTEHI);
        !           556:        for (x=1;x<69;x++)
        !           557:                waddstr(win2," ");
        !           558: 
        !           559:        if(open_mode != 'd')
        !           560:                {
        !           561:                wmove (win2, PATHHI);
        !           562:                waddstr(win2,PATHNAME);
        !           563:                        for (x=23;x<61;x++)
        !           564:                                waddstr(win2," ");
        !           565:                }
        !           566: 
        !           567:        wstandend(win2);
        !           568:        refresh();
        !           569:        wrefresh(win2);
        !           570: 
        !           571: 
        !           572: 
        !           573: }
        !           574: 
        !           575: /* following function prints the menu at the bottom of stdscr */
        !           576: 
        !           577: void menu()
        !           578: 
        !           579: {
        !           580: /* print a menu of options to stdscr. They will appear at the bottom of
        !           581:  * the screen with the first letter highlited as an indication to
        !           582:  * the user that pressing the highlited key will result in the indicated
        !           583:  * action.
        !           584: */
        !           585: 
        !           586:        if(open_mode =='r')
        !           587:                {
        !           588:                move (21,0);
        !           589:                printw("Select file to delete");
        !           590:                refresh();
        !           591:                }
        !           592: 
        !           593:        if(open_mode == 'a')
        !           594:                {
        !           595:                move (21,0);
        !           596:                printw("select file that will FOLLOW");
        !           597:                move (22,0);
        !           598:                printw("the file to be added.");
        !           599:                refresh();
        !           600:                }
        !           601: 
        !           602:        if(open_mode == 'd')
        !           603:                {
        !           604:                move (21,0);
        !           605:                printw("Select file to download.");
        !           606:                refresh();
        !           607:                }
        !           608: 
        !           609:        move(21, 50);
        !           610:        standout();
        !           611:        printw("Options:");
        !           612:        move(22,46);
        !           613:        printw("n");
        !           614:        move(23,46);
        !           615:        printw("p");
        !           616:        move(22,60);
        !           617:        printw("q");
        !           618:        move(23,60);
        !           619:        printw("s");
        !           620:        standend();
        !           621:        move(22,47);
        !           622:        addstr("ext page");
        !           623:        move(23,47);
        !           624:        addstr("rev. page");
        !           625:        move(22,61);
        !           626:        addstr("uit");
        !           627:        move(23,61);
        !           628:        addstr("elect file");
        !           629: 
        !           630: 
        !           631: }
        !           632: 
        !           633: 
        !           634: /* this function will open the file and read the appropriate record,
        !           635:  * then display it on the window in the approp. positions.
        !           636: */
        !           637: 
        !           638: void display_record (win2, row, col, screen_num)
        !           639: WINDOW *win2;
        !           640: int row, col, screen_num;
        !           641: 
        !           642: {
        !           643: WINDOW *win3;
        !           644: struct entry record;
        !           645: char choice;
        !           646: FILE *infp;
        !           647: int x;
        !           648: 
        !           649:        if ((infp = fopen(workfile,"r")) == NULL)
        !           650:        {
        !           651:                printf("\007ERROR opening file for input!\n");
        !           652:                exit(1);
        !           653:        }
        !           654: 
        !           655:        fseek(infp,REC_FORMULA, 0l);
        !           656:        fread(&record, sizeof (struct entry),1,infp);
        !           657:        fclose (infp);
        !           658: 
        !           659:        wstandout(win2);
        !           660: 
        !           661:        wmove(win2,NAMEHI);
        !           662:        waddstr(win2,record.filename);
        !           663: 
        !           664:        wmove(win2,DESCHI);
        !           665:        waddstr(win2,record.description);
        !           666: 
        !           667:        wmove(win2,DATEHI);
        !           668:        wprintw(win2,"%.6s",record.date);
        !           669: 
        !           670:        wmove(win2,SIZEHI);
        !           671:        waddstr(win2,record.filesize);
        !           672: 
        !           673:        if(open_mode != 'd')
        !           674:                {
        !           675:                wmove(win2,PARTHI);
        !           676:                wprintw(win2,"%.2d",record.noparts);
        !           677:                }
        !           678: 
        !           679:        wmove(win2,REQHI);
        !           680:        waddstr(win2,record.requires);
        !           681: 
        !           682:        wmove(win2,NOTEHI);
        !           683:        waddstr(win2,record.notes);
        !           684: 
        !           685:        if(open_mode != 'd')
        !           686:                {
        !           687:                wmove(win2,PATHHI);
        !           688:                waddstr(win2,record.pathname);
        !           689:                }
        !           690: 
        !           691:        wrefresh(win2);
        !           692:        wstandend(win2);
        !           693: 
        !           694: 
        !           695: /* allocate another window as a message area */
        !           696: 
        !           697:        if ( (win3=newwin(2,40,20,0)) == NULL)
        !           698:                {
        !           699:                printf("Memory allocation for win3 failed!\n");
        !           700:                exit(1);
        !           701:                }
        !           702: 
        !           703: /* the following tests for 'd' for delete from command line. If the user
        !           704:  * used a 'd' on the command line, make sure that he/she really wants to
        !           705:  * delete the record, then call the del_reocrd function.
        !           706: */
        !           707:        if(open_mode == 'r')
        !           708:                {
        !           709:                wmove (win3,0,0);
        !           710:                waddstr(win3,"Do you wish to delete this record?");
        !           711:                wmove(win3,1,0);
        !           712:                waddstr(win3, "[y] yes; any other key to abort.");
        !           713:                wrefresh(win3);
        !           714: 
        !           715:                choice = '\0';
        !           716:                while (choice == '\0')
        !           717:                        choice = wgetch(win3);
        !           718: 
        !           719:                if ((choice == 'y') || (choice == 'Y'))
        !           720:                        {
        !           721:                        wclear(win3);
        !           722:                        wmove(win3,0,0);
        !           723:                        waddstr(win3,"working... please wait");
        !           724:                        wrefresh(win3);
        !           725:                        del_rec(win3, row, col, screen_num);
        !           726:                        }
        !           727:                
        !           728:                wclear(win3);
        !           729:                wmove(win3,0,0);
        !           730:                waddstr(win3,"Press RETURN to continue...");
        !           731:                wrefresh(win3);
        !           732:                while(13 != wgetch(win3))
        !           733:                        ;
        !           734:                wclear(win3);
        !           735:                wrefresh(win3);
        !           736:                delwin(win3);
        !           737:                }
        !           738: 
        !           739:        /* we are in download mode, so prompt for the next data screen */
        !           740:        else
        !           741:                {
        !           742:                wclear(win3);
        !           743:                wmove(win3,0,0);
        !           744:                waddstr(win3,"Press <RETURN> for next screen.");
        !           745:                wrefresh(win3); 
        !           746:                while(13 != wgetch(win3))
        !           747:                        ;
        !           748:                wclear(win2);
        !           749:                wmove(win2,1,0);
        !           750:                waddstr(win2,"Size of file is: ");
        !           751:                wmove(win2,1,40);
        !           752:                waddstr(win2,"Number of parts to download: ");
        !           753:                wstandout(win2);
        !           754:                wmove(win2,1,18);
        !           755:                waddstr(win2,record.filesize);
        !           756:                wmove(win2,1,69);
        !           757:                record.noparts = (record.noparts == 0) ? 1 : record.noparts;
        !           758:                wprintw(win2,"%d",record.noparts);
        !           759:                wstandend(win2);
        !           760:                wmove(win2,3,5);
        !           761:                wprintw(win2,"The following commands will be needed to download ");
        !           762:                wstandout(win2);
        !           763:                waddstr(win2,record.filename);
        !           764:                wstandend(win2);
        !           765: 
        !           766:        /* if there is more than one part to download, call a function to generate
        !           767:         * the multiple uucp requests necessary to grab each piece from mwcbbs.
        !           768:        */
        !           769: 
        !           770:                if (record.noparts >1)
        !           771:                        {
        !           772:                        build_uucp(record);
        !           773:                        for (x=0;x<record.noparts;x++)
        !           774:                                {
        !           775: 
        !           776:        /* limit ourselves to 10 displayed commands */
        !           777:                                if (x==10)
        !           778:                                        {
        !           779:                                        wmove(win2,16,0);
        !           780:                                        wprintw(win2,"There are %d more parts to download which do not appear on ths screen.", (record.noparts - x));
        !           781:                                        break;
        !           782:                                        }
        !           783: 
        !           784:                                wmove(win2,5+x,0);
        !           785:                                waddstr(win2,getfiles[x]);
        !           786:                                }
        !           787:                        }
        !           788:                else
        !           789:                        {
        !           790:                        strcpy(getfiles[0],HOST);
        !           791:                        strcat(getfiles[0],record.pathname);
        !           792:                        strcat(getfiles[0],RECEIVER);
        !           793:                        wmove(win2,5,0);
        !           794:                        waddstr(win2,getfiles);
        !           795:                        wrefresh(win2);
        !           796:                        }
        !           797: 
        !           798:                wclear(win3);
        !           799:                wmove(win3,0,0);
        !           800:                waddstr(win3,"Do you wish to download this file?");
        !           801:                wmove(win3,1,0);
        !           802:                waddstr(win3,"[y] yes or any other key to abort.");
        !           803:                wrefresh(win2);
        !           804:                wrefresh(win3);
        !           805:                choice = '\0';
        !           806:                while(choice == '\0')
        !           807:                        choice = wgetch(win3);
        !           808: 
        !           809:                if(choice == 'y' || choice == 'Y')
        !           810:                        {       
        !           811:                        wclear(win3);
        !           812:                        wmove(win3,0,0);
        !           813:                        waddstr(win3,"Processing requests...");
        !           814:                        wrefresh(win3);
        !           815:                        for(x = 0; x < record.noparts; x++)
        !           816:                                system(getfiles[x]);
        !           817:                        wclear(win3);
        !           818:                        wmove(win3,0,0);
        !           819:                        waddstr(win3,"Press <RETURN> to continue.");
        !           820:                        wrefresh(win3);
        !           821:                        while(13 != wgetch(win3))
        !           822:                                ;
        !           823:                        }
        !           824:                }
        !           825: }
        !           826: 
        !           827: 
        !           828: void del_rec(win3,row,col,screen_num,rec_add)
        !           829: WINDOW *win3;
        !           830: int row,col,screen_num;
        !           831: struct entry *rec_add;
        !           832: 
        !           833: {
        !           834: int x;
        !           835: struct entry record;
        !           836: FILE *infp,*outfp;
        !           837: int rec_mark = POS_FORMULA;
        !           838: 
        !           839:        if ( (infp=fopen(workfile,"r"))==NULL)
        !           840:                {
        !           841:                printf("Error opening file %s for input!\n",workfile);
        !           842:                exit(1);
        !           843:                }
        !           844: 
        !           845:        /* delete any previous temporary file that may be here */
        !           846: 
        !           847:        if (unlink(TEMPFILE)==-1);      
        !           848: 
        !           849:        if ( (outfp=fopen(TEMPFILE,"a"))==NULL)
        !           850:                {
        !           851:                printf("Error opening \"/tmp/mwcbbs.tmp\" for output!\n");
        !           852:                exit(1);
        !           853:                }
        !           854: 
        !           855: 
        !           856:        /* we will now read each record until we hit the record number
        !           857:         * calculated by rec_mark. to delete, we will simply exit the
        !           858:         * loop when we hit the correct record, skip the record with a 
        !           859:         * read, then follow that with another read/write loop to finish
        !           860:         * off the file.
        !           861:        */
        !           862: 
        !           863: 
        !           864:        for(x=0;x<rec_mark;x++)
        !           865:                {
        !           866:                fread(&record, sizeof(struct entry),1,infp);
        !           867:                wmove(win3,1,0);
        !           868:                wprintw(win3,"Reading:");
        !           869:                wrefresh(win3);
        !           870:                fwrite(&record, sizeof(struct entry),1,outfp);
        !           871:                wmove(win3,1,0);
        !           872:                wprintw(win3,"Writing:");
        !           873:                wrefresh(win3);
        !           874:                }
        !           875: 
        !           876:        /* this will delete the record by using a dummy record to skip it */
        !           877: 
        !           878:        if(open_mode == 'r')
        !           879:                fread(&record, sizeof(struct entry),1,infp);
        !           880: 
        !           881: 
        !           882:        /* this will write in a new record, if invoked in 'add' mode */
        !           883:        if(open_mode == 'a')
        !           884:                fwrite(&rec_add, sizeof(struct entry),1,outfp);
        !           885: 
        !           886:        /* this will finish off the file. */
        !           887: 
        !           888:        while((fread(&record, sizeof(struct entry),1,infp)) != 0)
        !           889:                {
        !           890: 
        !           891:                wmove(win3,1,0);
        !           892:                wprintw(win3,"Reading");
        !           893:                wrefresh(win3);
        !           894:                fwrite(&record, sizeof(struct entry),1,outfp);
        !           895:                wmove(win3,1,0);
        !           896:                wprintw(win3,"Writing:");
        !           897:                wrefresh(win3);
        !           898:                }
        !           899: 
        !           900: /* close the files and move around as appropriate (delete the old then
        !           901:  * move the new to old
        !           902: */
        !           903: 
        !           904:        fclose(infp);
        !           905:        fclose(outfp);
        !           906:        if(unlink(workfile) == -1)
        !           907:                {
        !           908:                endwin();
        !           909:                printf("Could not remove old file!\n");
        !           910:                printf("Updated file could be found as %s\n",TEMPFILE);
        !           911:                exit(1);
        !           912:                }
        !           913: 
        !           914:        if( link(TEMPFILE,workfile) == -1)
        !           915:                {
        !           916:                endwin();
        !           917:                printf("Could not link new file!\n");
        !           918:                exit(1);
        !           919:                }
        !           920: 
        !           921:        if( unlink(TEMPFILE) == -1)
        !           922:                {
        !           923:                endwin();
        !           924:                printf("Could not remove temporary file!\n");
        !           925:                exit(1);
        !           926:                }
        !           927: 
        !           928: }
        !           929: 
        !           930: /* this function will get the input and write it to a file */
        !           931: 
        !           932: void add_rec(win2, row, col, screen_num)
        !           933: WINDOW *win2;
        !           934: 
        !           935: {
        !           936: struct entry new_record;       
        !           937: 
        !           938: FILE *infp;
        !           939: WINDOW *win3;
        !           940: int x;
        !           941: char choice;
        !           942: 
        !           943: 
        !           944:        wrefresh(win2);
        !           945: 
        !           946:        if( (win3=newwin(4,79,20,0)) == NULL )
        !           947:        {
        !           948:                wclear(win2);
        !           949:                wmove(win2,0,0);
        !           950:                wstandout(win2);
        !           951:                waddstr(win2,"\007Error allocating memory for win3. Press <RETURN>");
        !           952:                wrefresh(win2);
        !           953:                while('\n' != getch())
        !           954:                        ;
        !           955:                exit(1);
        !           956:        }
        !           957: 
        !           958:        wclear(win3);
        !           959:        wmove(win3,1,1);
        !           960:        waddstr(win3,"Enter filename or <RETURN> to exit.");
        !           961:        wrefresh(win3);
        !           962:        getstring(win2, NAMEHI);
        !           963:        strcpy(new_record.filename, workstring);
        !           964:        if(strlen(new_record.filename) == 0)
        !           965:                return;
        !           966: 
        !           967:        for(x=strlen(workstring);x < sizeof (new_record.filename) ; x++)
        !           968:                new_record.filename[x] = '\0';
        !           969: 
        !           970: 
        !           971:        wclear(win3);
        !           972:        wmove(win3,1,1);
        !           973:        waddstr(win3,"Describe the uses of this package");
        !           974:        wrefresh(win3);
        !           975: 
        !           976:        getstring(win2, DESCHI);
        !           977:        strcpy(new_record.description, workstring);
        !           978: 
        !           979:        for(x=strlen(workstring);x < sizeof (new_record.description) ; x++)
        !           980:                new_record.description[x] = '\0';
        !           981: 
        !           982: 
        !           983: 
        !           984:        wclear(win3);
        !           985:        wmove(win3,1,1);
        !           986:        waddstr(win3,"Enter the date that the file was added or last modified");
        !           987:        wmove(win3,2,1);
        !           988:        waddstr(win3,"Enter no more than 6 characters");
        !           989:        wrefresh(win3);
        !           990: 
        !           991:        getstring(win2,DATEHI);
        !           992:        strcpy(new_record.date, workstring);
        !           993:        for(x=strlen(workstring);x < sizeof (new_record.date) ; x++)
        !           994:                new_record.date[x] = '\0';
        !           995: 
        !           996:        wclear(win3);
        !           997:        wmove(win3,1,1);
        !           998:        waddstr(win3,"Enter the file size in number of bytes");
        !           999:        wrefresh(win3);
        !          1000:        getstring(win2, SIZEHI);
        !          1001:        strcpy(new_record.filesize, workstring);
        !          1002:        for(x=strlen(workstring);x < sizeof (new_record.filesize) ; x++)
        !          1003:                new_record.filesize[x] = '\0';
        !          1004: 
        !          1005: 
        !          1006:        wclear(win3);
        !          1007:        wmove(win3,3,1);
        !          1008:        waddstr(win3,"Enter the number of parts that this file is divided into");
        !          1009:        wrefresh(win3);
        !          1010:        getstring(win2, PARTHI);
        !          1011:        new_record.noparts = atoi(workstring);
        !          1012: 
        !          1013: 
        !          1014:        /* if the number of parts is 0 (not a split file), then we can
        !          1015:         * cat the filename on to the end of the pathname. We can later
        !          1016:         * test the length of the pathname to determine whether or not
        !          1017:         * to ask for a pathname, as would be required for a split file.
        !          1018:        */
        !          1019: 
        !          1020: 
        !          1021:                if(new_record.noparts ==0)
        !          1022:                {
        !          1023:                        strcpy(new_record.pathname, PATHNAME);
        !          1024:                        strcat(new_record.pathname, new_record.filename);
        !          1025:                        wmove(win2,PATHHI);
        !          1026:                        wstandout(win2);
        !          1027:                        waddstr(win2, new_record.pathname);
        !          1028:                        wstandend(win2);
        !          1029:                        wrefresh(win2);
        !          1030:                }
        !          1031: 
        !          1032: 
        !          1033:        wclear(win3);
        !          1034:        wmove(win3,3,1);
        !          1035:        waddstr(win3,"Enter the names of any support files required");
        !          1036:        wrefresh(win3);
        !          1037:        getstring(win2, REQHI);
        !          1038: 
        !          1039:        if(strlen(workstring) == 0 )
        !          1040:                {
        !          1041:                wmove(win2, REQHI);
        !          1042:                wstandout(win2);
        !          1043:                waddstr(win2,"none");
        !          1044:                wstandend(win2);
        !          1045:                wrefresh(win2);
        !          1046:                strcpy(new_record.requires, "none");
        !          1047:        }
        !          1048:        else
        !          1049:                strcpy(new_record.requires, workstring);
        !          1050: 
        !          1051:        for(x=strlen(new_record.requires);x < sizeof (new_record.requires) ; x++)
        !          1052:                new_record.requires[x] = '\0';
        !          1053: 
        !          1054:        wclear(win3);
        !          1055:        wmove(win3,3,1);
        !          1056:        waddstr(win3,"Enter any relevant notes about this file");
        !          1057:        wrefresh(win3);
        !          1058:        getstring(win2, NOTEHI);
        !          1059:        if(strlen(workstring) == 0)
        !          1060:                {
        !          1061:                wmove(win2,NOTEHI);
        !          1062:                wstandout(win2);
        !          1063:                waddstr(win2,"none");
        !          1064:                wstandend(win2);
        !          1065:                wrefresh(win2);
        !          1066:                strcpy(new_record.notes, "none");
        !          1067:                }
        !          1068:        
        !          1069:        else
        !          1070:                strcpy(new_record.notes, workstring);
        !          1071:        for(x=strlen(new_record.notes);x < sizeof (new_record.notes) ; x++)
        !          1072:                new_record.notes[x] = '\0';
        !          1073: 
        !          1074:        /* if there is more than one part to download, or number of
        !          1075:         * parts is not zero, we need to complete the pathlist.
        !          1076:        */
        !          1077:        
        !          1078:        if(new_record.noparts != 0)
        !          1079:        {
        !          1080:                wclear(win3);
        !          1081:                wmove(win3,3,1);
        !          1082:                waddstr(win3,"Complete the pathlist to this file.");
        !          1083:                wrefresh(win3);
        !          1084:                wmove(win2,PATHHI);
        !          1085:                wstandout(win2);
        !          1086:                waddstr(win2, PATHNAME);
        !          1087:                wstandend(win2);
        !          1088:                wrefresh(win2);
        !          1089:                getstring(win2, PATHHI2);
        !          1090:                strcpy(new_record.pathname, PATHNAME);
        !          1091:                strcat(new_record.pathname, workstring);
        !          1092:        }
        !          1093:        for(x=strlen(new_record.pathname);x < sizeof (new_record.pathname) ; x++)
        !          1094:                new_record.pathname[x] = '\0';
        !          1095: 
        !          1096: 
        !          1097:        wclear(win3);
        !          1098:        wmove(win3,0,0);
        !          1099:        waddstr(win3,"Do you wish to write the record?");
        !          1100:        wmove(win3,1,0);
        !          1101:        waddstr(win3,"[y]es or any other to abort.");
        !          1102:        wrefresh(win3);
        !          1103:        choice ='\0';
        !          1104:        while(choice == '\0')
        !          1105:                choice = wgetch(win3);
        !          1106: 
        !          1107:        if(choice == 'y' || choice == 'Y')
        !          1108:                {
        !          1109:                wclear(win3);
        !          1110:                wmove(win3,0,0);
        !          1111:                waddstr(win3,"Updating...");
        !          1112:                wrefresh(win3);
        !          1113:                del_rec(win3,row,col,screen_num, new_record);
        !          1114:                }
        !          1115: 
        !          1116:        delwin(win3);
        !          1117: 
        !          1118: }
        !          1119: 
        !          1120: 
        !          1121: /* this function will get a string and print to the approp field 
        !          1122:  * on win2. This is to prevent people from entering too many characters.
        !          1123: */
        !          1124: 
        !          1125: void getstring (win2, row, col)
        !          1126: 
        !          1127: WINDOW *win2;
        !          1128: int row, col;
        !          1129: 
        !          1130: {
        !          1131: 
        !          1132: 
        !          1133:        noraw();
        !          1134:        echo();
        !          1135:        wmove(win2,row,col);
        !          1136:        wrefresh(win2);
        !          1137:        wgetstr(win2,workstring);
        !          1138:        wstandout(win2);
        !          1139:        wmove(win2,row,col);
        !          1140:        wprintw(win2,"%s",workstring);
        !          1141:        wstandend(win2);
        !          1142:        wrefresh(win2);
        !          1143:        noecho();
        !          1144:        raw();
        !          1145: 
        !          1146:        
        !          1147: 
        !          1148: }
        !          1149: /* this function will take the pathname and append the necessary
        !          1150:  * character(s) to generate the multiple requests necessary to
        !          1151:  * download multipart files.
        !          1152: */
        !          1153: 
        !          1154: void build_uucp(record)
        !          1155: struct entry *record;
        !          1156: 
        !          1157: {
        !          1158: int x,y;
        !          1159: 
        !          1160:        y = strlen(record.pathname);
        !          1161: 
        !          1162:        for(x=0;x< record.noparts;x++)
        !          1163:                {
        !          1164:                strcpy(getfiles[x],HOST);
        !          1165:                record.pathname[y] = 97 + x;
        !          1166:                strcat(getfiles[x],record.pathname);
        !          1167:                strcat(getfiles[x],RECEIVER);
        !          1168:                }
        !          1169: }

unix.superglobalmegacorp.com

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