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