ref: 0e0241ec76a8e8c87d092e9ea592d856bb010275
dir: /ar/main.c/
static char sccsid[] = "@(#) ./ar/main.c"; #include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stat.h> int main(int argc, char *argv[]) { int c; size_t n; FILE *fp, *arfile; char *fname, *arname = "lib.a"; struct stat st; if ((arfile = fopen(arname, "wb")) == NULL) { perror("ar:error opening library file"); exit(1); } fputs("!<arch>\n", arfile); while ((fname = *++argv) != NULL) { if ((n = strlen(fname)) > 16) { fprintf(stderr, "ar:too long file name '%s'\n", fname); exit(3); } if (stat(fname, &st) < 0) { fprintf(stderr, "ar:error opening object file '%s':%s\n", fname, strerror(errno)); exit(2); } fprintf(arfile, "%-16s%-12llu%-6u%-6u%-8o%-10llu`\n", fname, (unsigned long long) st.st_atime, (int) st.st_uid, (int) st.st_gid, (int) st.st_mode, (unsigned long long) st.st_size); if ((fp = fopen(fname, "rb")) == NULL) { fprintf(stderr, "ar: error opening file '%s':%s\n", fname, strerror(errno)); exit(3); } while ((c = getc(fp)) != EOF) putc(c, arfile); if (st.st_size & 1) putc('\n', arfile); if (fclose(fp)) { fprintf(stderr, "ar:error reading from input file '%s':%s\n", fname, strerror(errno)); exit(4); } } if (fclose(arfile)) { fprintf(stderr, "ar:error writing to output file '%s':%s\n", arname, strerror(errno)); } return 0; }