12 #define ARMAG "!<arch>\n"
27 fatal(char * str
) { fprintf(stderr
, "%s\n", str
); exit(2); }
30 main(int argc
, char ** argv
)
35 int ar
, libarg
=0, need_o
= 0, got_o
= 0;
37 for(ar
=1; ar
<argc
; ar
++) if( argv
[ar
][0] == '-' )
39 if( argv
[ar
][1] == 'r' ) need_o
= 1;
40 if( argv
[ar
][1] == 'o' ) { got_o
++; libarg
= 0; }
44 if( libarg
== 0 ) libarg
= ar
;
47 if( libarg
== 0 || got_o
> 1 || need_o
> got_o
)
48 fatal("Err, what's the output gonna be called?");
50 if( (fd
=fopen(argv
[libarg
], "wb")) == 0 ) fatal("Cannot open archive");
51 if( fwrite(ARMAG
, 1, SARMAG
, fd
) != SARMAG
) fatal("Cannot write magic");
53 for(ar
=1; ar
<argc
; ar
++) if( ar
!= libarg
&& argv
[ar
][0] != '-' )
56 if( stat(argv
[ar
], &st
) < 0 ) fatal("Cannot stat object");
57 if((ptr
=strchr(argv
[ar
], '/'))) ptr
++; else ptr
=argv
[ar
];
58 memset(&arbuf
, ' ', sizeof(arbuf
));
59 strcpy(buf
, ptr
); strcat(buf
, "/ ");
60 strncpy(arbuf
.ar_name
, buf
, sizeof(arbuf
.ar_name
));
62 sprintf(arbuf
.ar_date
, "%-12ld", (long)st
.st_mtime
);
63 sprintf(arbuf
.ar_uid
, "%-6d", (int)(st
.st_uid
%1000000L));
64 sprintf(arbuf
.ar_gid
, "%-6d", (int)(st
.st_gid
%1000000L));
65 sprintf(arbuf
.ar_mode
, "%-8lo", (long)st
.st_mode
);
66 sprintf(arbuf
.ar_size
, "%-10ld", (long)st
.st_size
);
67 memcpy(arbuf
.ar_fmag
, ARFMAG
, sizeof(arbuf
.ar_fmag
));
69 if( fwrite(&arbuf
, 1, sizeof(arbuf
), fd
) != sizeof(arbuf
) )
70 fatal("Cannot write header");
72 ptr
= malloc(st
.st_size
+2);
73 if( ptr
== 0 ) fatal("Out of memory");
74 ptr
[st
.st_size
] = ' ';
75 if( (ifd
= fopen(argv
[ar
], "rb")) == 0 ) fatal("Cannot open input");
76 if( fread(ptr
, 1, st
.st_size
, ifd
) != st
.st_size
)
77 fatal("Cannot read input file");
80 if( st
.st_size
&1 ) st
.st_size
++;
81 if( fwrite(ptr
, 1, st
.st_size
, fd
) != st
.st_size
)
82 fatal("Cannot write output file");