1 /*- 2 * Copyright (c) 1990 The Regents of the University of California. 3 * All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Hugh Smith at The University of Guelph. 7 * 8 * %sccs.include.redist.c% 9 */ 10 11 #ifndef lint 12 static char sccsid[] = "@(#)delete.c 5.2 (Berkeley) 01/21/91"; 13 #endif /* not lint */ 14 15 #include <sys/param.h> 16 #include <sys/stat.h> 17 #include <fcntl.h> 18 #include <unistd.h> 19 #include <dirent.h> 20 #include <stdio.h> 21 #include <ar.h> 22 #include "archive.h" 23 #include "pathnames.h" 24 25 extern CHDR chdr; /* converted header */ 26 extern char *archive; /* archive name */ 27 extern char *tname; /* temporary file "name" */ 28 29 /*- 30 * delete -- 31 * Deletes named members from the archive. 32 */ 33 delete(argv) 34 register char **argv; 35 { 36 CF cf; 37 off_t size; 38 int afd, eval, tfd; 39 40 afd = open_archive(O_RDWR); 41 tfd = tmp(); 42 43 SETCF(afd, archive, tfd, tname, RPAD|WPAD); 44 while (get_header(afd)) { 45 if (*argv && files(argv)) { 46 if (options & AR_V) 47 (void)printf("d - %s\n", chdr.name); 48 SKIP(afd, chdr.size, archive); 49 continue; 50 } 51 put_header(&cf, (struct stat *)NULL); 52 copyfile(&cf, chdr.size); 53 } 54 eval = 0; 55 ORPHANS; 56 57 size = lseek(tfd, (off_t)0, SEEK_CUR); 58 (void)lseek(tfd, (off_t)0, SEEK_SET); 59 (void)lseek(afd, (off_t)SARMAG, SEEK_SET); 60 SETCF(tfd, tname, afd, archive, RPAD|WPAD); 61 copyfile(&cf, size); 62 (void)close(tfd); 63 (void)ftruncate(afd, size + SARMAG); 64 close_archive(afd); 65 return(eval); 66 } 67