23 char bakfile[FILENAME_MAX];
27 if(filename==NULL || strlen(filename)<1) {
28 if(status!=NULL) sprintf(status,
"invalid filename");
33 if(access(filename, 0) == -1) {
34 if(status!=NULL) sprintf(status,
"file does not pre-exist");
38 strlcpy(bakfile, filename, FILENAME_MAX);
39 if(backup_ext==NULL)
strlcat(bakfile,
".bak", FILENAME_MAX);
40 else strlcat(bakfile, backup_ext, FILENAME_MAX);
42 if(access(bakfile, 0) != -1) {
45 if(status!=NULL) sprintf(status,
"cannot delete previous backup file");
50 ret=rename(filename, bakfile);
52 if(status!=NULL) sprintf(status,
"cannot rename file as backup");
55 if(status!=NULL) sprintf(status,
"file renamed as backup");
78 if(filename1==NULL || filename2==NULL) {
79 if(status!=NULL) sprintf(status,
"invalid filename");
83 if((from=fopen(filename1,
"rb"))==NULL) {
84 if(status!=NULL) sprintf(status,
"cannot open file for read");
88 if((to=fopen(filename2,
"wb"))==NULL) {
89 if(status!=NULL) sprintf(status,
"cannot open file for write");
90 fclose(from);
return 3;
96 if(status!=NULL) sprintf(status,
"cannot read from file");
97 fclose(from); fclose(to); (void)remove(filename2);
return 4;
99 if(!feof(from)) fputc(c, to);
101 if(status!=NULL) sprintf(status,
"cannot write to file");
102 fclose(from); fclose(to); (void)remove(filename2);
return 6;
106 if(fclose(from)==EOF) {
107 if(status!=NULL) sprintf(status,
"cannot close file");
108 fclose(to);
return 7;
110 if(fclose(to)==EOF) {
111 if(status!=NULL) sprintf(status,
"cannot close file");