|
|
1.1 root 1: #include "mk.h"
2: #include <sys/types.h>
3: #include <sys/stat.h>
4: #include <ar.h>
5:
6: static atimes();
7:
8: long
9: atimeof(force, name, ar, mem)
10: char *name, *ar, *mem;
11: {
12: struct stat sbuf;
13: Symtab *sym;
14:
15: if(stat(ar, &sbuf) < 0)
16: sbuf.st_mtime = 0;
17: if(sym = symlook(ar, S_AGG, (char *)0)){
18: if(force || (sbuf.st_mtime > (long)sym->value)){
19: atimes(ar);
20: symlook(ar, S_AGG, ar)->value = (char *)sbuf.st_mtime;
21: }
22: } else {
23: atimes(ar);
24: symlook(strdup(ar), S_AGG, ar)->value = (char *)sbuf.st_mtime;
25: }
26: if(sym = symlook(name, S_TIME, (char *)0))
27: sbuf.st_mtime = (long)sym->value;
28: else
29: sbuf.st_mtime = 0;
30: return((long)sbuf.st_mtime);
31: }
32:
33: void
34: atouch(name, ar, mem)
35: char *name, *ar, *mem;
36: {
37: int fd;
38: struct ar_hdr hdr;
39: char *s;
40: long t;
41: char buf[NAMEBLOCK];
42:
43: strcpy(buf, mem);
44: #ifdef SYSV
45: strcat(buf, "/");
46: #endif
47: if((fd = open(ar, 2)) < 0){
48: if((fd = creat(ar, 0666)) < 0){
49: perror(ar);
50: Exit();
51: }
52: write(fd, ARMAG, SARMAG);
53: }
54: if(symlook(name, S_TIME, (char *)0)){
55: /* hoon off and change it in situ */
56: lseek(fd, (long)SARMAG, 0);
57: while(read(fd, (char *)&hdr, sizeof(hdr)) == sizeof(hdr)){
58: for(s = &hdr.ar_name[sizeof(hdr.ar_name)]; *--s == ' ';);
59: s[1] = 0;
60: if(strcmp(buf, hdr.ar_name) == 0){
61: t = sizeof(hdr.ar_name)-sizeof(hdr);
62: lseek(fd, t, 1);
63: fprint(fd, "%-12ld", time((long *)0));
64: break;
65: }
66: t = atol(hdr.ar_size);
67: #ifdef CRAY
68: t = (t+7)&~7;
69: t -= sizeof(hdr)-60;
70: #else
71: if(t&01) t++;
72: #endif
73: lseek(fd, t, 1);
74: }
75: } else {
76: lseek(fd, 0L, 2);
77: fprint(fd, "%-16s%-12ld%-6d%-6d%-8lo%-10ld%2s", buf, time((long *)0),
78: getuid(), getgid(), 0100666L, 0L, ARFMAG);
79: }
80: close(fd);
81: }
82:
83:
84: void
85: adelete(name, ar, mem)
86: char *name, *ar, *mem;
87: {
88: Fprint(2, "sorry; mk doesn't know how to delete archive members yet\n");
89: }
90:
91: static
92: atimes(ar)
93: char *ar;
94: {
95: struct ar_hdr hdr;
96: long t;
97: int fd;
98: char buf[BIGBLOCK];
99: register char *s;
100:
101: if((fd = open(ar, 0)) < 0)
102: return;
103: if(read(fd, buf, SARMAG) != SARMAG){
104: close(fd);
105: return;
106: }
107: while(read(fd, (char *)&hdr, sizeof(hdr)) == sizeof(hdr)){
108: for(s = &hdr.ar_name[sizeof(hdr.ar_name)]; *--s == ' ';);
109: #ifdef SYSV
110: if(*s == '/') /* Damn you Sytem V */
111: s--;
112: #endif
113: s[1] = 0;
114: t = atol(hdr.ar_date);
115: sprint(buf, "%s(%s)", ar, hdr.ar_name);
116: symlook(strdup(buf), S_TIME, (char *)t)->value = (char *)t;
117: t = atol(hdr.ar_size);
118: if(t&01) t++;
119: lseek(fd, t, 1);
120: }
121: close(fd);
122: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.