Annotation of coherent/g/usr/lib/uucp/uuinstall/delete.c, revision 1.1

1.1     ! root        1: /* delete.c: given a filename, the number of lines before the entry
        !             2:  *     to delete, and the number of lines in the entry, delete the
        !             3:  *     entry by copying the lines before the entry to a temp file,
        !             4:  *     skipping the lines the entry we wish to delete occuppies,
        !             5:  *     then copying the remaining lines to the temp file. Delete
        !             6:  *     the old file and link the temp file to the newly modified file.
        !             7:  *     A similar scheme is used to add a modified entry.
        !             8:  */
        !             9: 
        !            10: #include "uuinstall.h"
        !            11: 
        !            12: delete_entry(fname,before,during,insert_flag)
        !            13: char * fname;                                  /* file name to work with */
        !            14: int before, during;
        !            15: int insert_flag;                               /* insert a modified entry? */
        !            16: {
        !            17:        FILE *filefd;
        !            18:        FILE *tmpfd;
        !            19:        FILE *newfd;
        !            20:        struct termio thisterm;
        !            21:        int x;
        !            22:        char *env;
        !            23:        char workstring[88];
        !            24:        char syscmd[65];                /* used to build system command to edit */
        !            25:        char b;
        !            26: 
        !            27:        extern char * getenv();
        !            28: 
        !            29:        wclear(portwin);
        !            30: 
        !            31:        /* open file for reading */
        !            32:        if ((filefd = fopen(fname,"r")) == NULL){
        !            33:                mvwaddstr(portwin,12,29,"Error opening file for reading!");
        !            34:                wrefresh(portwin);
        !            35:                sleep(1);
        !            36:                wclear(portwin);
        !            37:                wrefresh(portwin);
        !            38:                return;
        !            39:        }
        !            40: 
        !            41:        /* open edit file for writing */
        !            42:        if(insert_flag){
        !            43:                if ((newfd = fopen(UUEDIT,"w")) == NULL){
        !            44:                        mvwaddstr(portwin,12,29,"Error opening file for reading!");
        !            45:                        wrefresh(portwin);
        !            46:                        sleep(1);
        !            47:                        wclear(portwin);
        !            48:                        wrefresh(portwin);
        !            49:                        fclose(filefd);
        !            50:                        return;
        !            51:                }
        !            52:        }
        !            53:        /* open tmp file for writing */
        !            54:        if ((tmpfd = fopen(UUTMP,"w")) == NULL){
        !            55:                mvwaddstr(portwin,12,29,"Error opening file for writing!");
        !            56:                wrefresh(portwin);
        !            57:                sleep(1);
        !            58:                wclear(portwin);
        !            59:                wrefresh(portwin);
        !            60:                fclose(filefd);
        !            61:                fclose(tmpfd);
        !            62:                return;
        !            63:        }
        !            64: 
        !            65:        wmove(portwin,12,0);
        !            66:        wclrtoeol(portwin);     
        !            67:        if(!insert_flag){
        !            68:                mvwaddstr(portwin,12,29,"Updating...");
        !            69:        }else{
        !            70:                mvwaddstr(portwin,12,29,"Standby ...");
        !            71:        }
        !            72:        wrefresh(portwin);
        !            73: 
        !            74:        /* skip the lines we don't want to delete */
        !            75: 
        !            76:        for(x = 0 ; x < before ; x++){
        !            77:                fgets(workstring, sizeof(workstring) -1, filefd);
        !            78:                fputs(workstring, tmpfd);
        !            79:                fflush(tmpfd);
        !            80:        }
        !            81: 
        !            82:        /* now read the entry to delete, but don't copy it to the tmp file...
        !            83:         * UNLESS we're going to edit an entry, in which case, we write the
        !            84:         * indicated entry to another temp file and then invoke an editor on it.
        !            85:         */
        !            86: 
        !            87:        during++;
        !            88: 
        !            89:        for(x = 0; x < during ; x++){
        !            90:                fgets(workstring, sizeof(workstring) -1, filefd);
        !            91: 
        !            92:                /* write to edit file */
        !            93:                if(insert_flag){
        !            94:                        fputs(workstring,newfd);
        !            95:                }
        !            96:        }
        !            97: 
        !            98:        strcpy(workstring,"");
        !            99: 
        !           100: /* if edit, get the EDITOR environment variable. If there is none, use emacs */
        !           101: 
        !           102:        if (insert_flag){
        !           103:                fputs("\n",newfd);
        !           104:                fclose(newfd);
        !           105: 
        !           106:                /* build system command to edit temp editfile */
        !           107:                if( (env = getenv("EDITOR")) != NULL){
        !           108:                        sprintf(syscmd,"%s %s",env, UUEDIT);
        !           109:                }else{
        !           110:                        sprintf(syscmd,"%s %s","/usr/bin/me", UUEDIT);
        !           111:                }
        !           112: 
        !           113:                /* save our current terminal characteristics. I can't
        !           114:                 * ass/u/me that the editor will return us to our
        !           115:                 * current state when it exits.
        !           116:                 */
        !           117:                ioctl(fileno(stdin), TCGETA, &thisterm);
        !           118: 
        !           119:                /* invoke editor */
        !           120:                system(syscmd);
        !           121: 
        !           122:                /* now restore our saved information */
        !           123:                ioctl(fileno(stdin), TCSETA, &thisterm);
        !           124: 
        !           125:        /* if we editted an entry, we need to insert the tmp editfile now. 
        !           126:         * Prompt to really save changes, re-open the edit file and
        !           127:         * copy its contents to the temp file.
        !           128:         */
        !           129: 
        !           130:                wclear(portwin);
        !           131:                mvwaddstr(portwin,12,23,"Do you wish to save changes? (y/n)");
        !           132:                wrefresh(portwin);
        !           133:                do{
        !           134:                        b = ' ';
        !           135:                        b = wgetch(portwin);
        !           136:                }
        !           137:                while ((b != 'y') && (b != 'n'));
        !           138: 
        !           139:                if(b == 'y'){
        !           140:                        if((newfd = fopen(UUEDIT,"r")) == NULL){
        !           141:                                wclear(portwin);
        !           142:                                mvwaddstr(portwin,12,16,"Failed to open temp file to get modified entry!");
        !           143:                                mvwaddstr(portwin,14,20,"Leaving all files in original condition.");
        !           144:                                wrefresh(portwin);
        !           145:                                sleep(2);
        !           146:                                fclose(tmpfd);
        !           147:                                fclose(filefd);
        !           148:                                return;
        !           149:                        }
        !           150: 
        !           151:                        while(fgets(workstring,sizeof(workstring) -1,newfd) != NULL){
        !           152:                                fputs(workstring, tmpfd);
        !           153:                                fflush(tmpfd);
        !           154:                        }
        !           155:                        fclose(newfd);
        !           156:                }else{
        !           157:                        /* user doesn't want to save changes, so close the
        !           158:                         * files we opened and delete the temp files.
        !           159:                         */
        !           160: 
        !           161:                        fclose(tmpfd);
        !           162:                        fclose(filefd);
        !           163:                        unlink(UUTMP);  /* don't care if this fails, it may */
        !           164:                        unlink(UUEDIT); /* prove useful to keep these files */
        !           165:                        return;         /* around anyways. */
        !           166:                }
        !           167:        }
        !           168: 
        !           169:        /* now copy the rest of the file */
        !           170:        while (fgets(workstring,sizeof(workstring)-1,filefd) != NULL){
        !           171:                fputs(workstring, tmpfd);
        !           172:                fflush(tmpfd);
        !           173:        }
        !           174: 
        !           175:        /* close the files */
        !           176: 
        !           177:        fclose(filefd);
        !           178:        fclose(tmpfd);
        !           179: 
        !           180:        /* now unlink the old and link in the new! */
        !           181: 
        !           182:        if (unlink(fname) == -1){
        !           183:                wclear(portwin);
        !           184:                mvwaddstr(portwin,12,28,"Error deleting old file!");
        !           185:                wmove(portwin,13,15);
        !           186:                wprintw(portwin,"Leaving old file intact. New data saved to %s.",UUTMP);
        !           187:                wrefresh(portwin);
        !           188:                sleep(2);
        !           189:                return;
        !           190:        }
        !           191: 
        !           192:        if(link(UUTMP,fname) == -1){
        !           193:                wclear(portwin);
        !           194:                wmove(portwin,12,15);
        !           195:                wprintw(portwin,"Error writing data to %s. Data is saved in %s!",fname, UUTMP);
        !           196:                wrefresh(portwin);
        !           197:                sleep(2);
        !           198:                return;
        !           199:        }
        !           200: 
        !           201:        /* We don't care about the tmp file being unlinked, as there is no
        !           202:         * code here that appends to a tmp file.
        !           203:         */
        !           204: 
        !           205:        unlink(UUTMP);
        !           206: 
        !           207:        wclear(portwin);
        !           208:        wrefresh(portwin);
        !           209: }

unix.superglobalmegacorp.com

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