xref: /original-bsd/usr.bin/ar/append.c (revision ae291b9c)
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[] = "@(#)append.c	5.1 (Berkeley) 01/17/91";
13 #endif /* not lint */
14 
15 #include <sys/param.h>
16 #include <sys/stat.h>
17 #include <sys/errno.h>
18 #include <fcntl.h>
19 #include <unistd.h>
20 #include <dirent.h>
21 #include <stdio.h>
22 #include "archive.h"
23 
24 extern char *archive;			/* archive name */
25 
26 /*
27  * append --
28  *	Append files to the archive - modifies original archive or creates
29  *	a new archive if named archive does not exist.
30  */
31 append(argv)
32 	char **argv;
33 {
34 	register int fd, afd;
35 	register char *file;
36 	struct stat sb;
37 	CF cf;
38 	int rval;
39 	char *rname();
40 
41 	afd = open_archive(O_CREAT|O_RDWR);
42 	if (lseek(afd, (off_t)0, SEEK_END) == (off_t)-1)
43 		error(archive);
44 
45 	SETCF(0, 0, afd, archive, WPAD);
46 	while (file = *argv++) {
47 		if ((fd = open(file, O_RDONLY)) < 0) {
48 			(void)fprintf(stderr,
49 			    "ar: %s: %s.\n", file, strerror(errno));
50 			rval = 1;
51 			continue;
52 		}
53 		if (options & AR_V)
54 			(void)printf("q - %s\n", rname(file));
55 		cf.rfd = fd;
56 		cf.rname = file;
57 		put_header(&cf, &sb);
58 		copyfile(&cf, sb.st_size);
59 		(void)close(fd);
60 	}
61 	close_archive(afd);
62 	return(rval);
63 }
64