Blame


1 76193d7c 2003-09-30 devnull #include "mk.h"
2 76193d7c 2003-09-30 devnull #define ARMAG "!<arch>\n"
3 76193d7c 2003-09-30 devnull #define SARMAG 8
4 76193d7c 2003-09-30 devnull
5 76193d7c 2003-09-30 devnull #define ARFMAG "`\n"
6 76193d7c 2003-09-30 devnull #define SARNAME 16
7 76193d7c 2003-09-30 devnull
8 76193d7c 2003-09-30 devnull struct ar_hdr
9 76193d7c 2003-09-30 devnull {
10 76193d7c 2003-09-30 devnull char name[SARNAME];
11 76193d7c 2003-09-30 devnull char date[12];
12 76193d7c 2003-09-30 devnull char uid[6];
13 76193d7c 2003-09-30 devnull char gid[6];
14 76193d7c 2003-09-30 devnull char mode[8];
15 76193d7c 2003-09-30 devnull char size[10];
16 76193d7c 2003-09-30 devnull char fmag[2];
17 76193d7c 2003-09-30 devnull };
18 76193d7c 2003-09-30 devnull #define SAR_HDR (SARNAME+44)
19 76193d7c 2003-09-30 devnull
20 76193d7c 2003-09-30 devnull static int dolong;
21 76193d7c 2003-09-30 devnull
22 76193d7c 2003-09-30 devnull static void atimes(char *);
23 76193d7c 2003-09-30 devnull static char *split(char*, char**);
24 76193d7c 2003-09-30 devnull
25 76193d7c 2003-09-30 devnull long
26 76193d7c 2003-09-30 devnull atimeof(int force, char *name)
27 76193d7c 2003-09-30 devnull {
28 76193d7c 2003-09-30 devnull Symtab *sym;
29 76193d7c 2003-09-30 devnull long t;
30 76193d7c 2003-09-30 devnull char *archive, *member, buf[512];
31 76193d7c 2003-09-30 devnull
32 76193d7c 2003-09-30 devnull archive = split(name, &member);
33 76193d7c 2003-09-30 devnull if(archive == 0)
34 76193d7c 2003-09-30 devnull Exit();
35 76193d7c 2003-09-30 devnull
36 76193d7c 2003-09-30 devnull t = mtime(archive);
37 76193d7c 2003-09-30 devnull sym = symlook(archive, S_AGG, 0);
38 76193d7c 2003-09-30 devnull if(sym){
39 76193d7c 2003-09-30 devnull if(force || (t > (long)sym->value)){
40 76193d7c 2003-09-30 devnull atimes(archive);
41 76193d7c 2003-09-30 devnull sym->value = (void *)t;
42 76193d7c 2003-09-30 devnull }
43 76193d7c 2003-09-30 devnull }
44 76193d7c 2003-09-30 devnull else{
45 76193d7c 2003-09-30 devnull atimes(archive);
46 76193d7c 2003-09-30 devnull /* mark the aggegate as having been done */
47 76193d7c 2003-09-30 devnull symlook(strdup(archive), S_AGG, "")->value = (void *)t;
48 76193d7c 2003-09-30 devnull }
49 76193d7c 2003-09-30 devnull /* truncate long member name to sizeof of name field in archive header */
50 76193d7c 2003-09-30 devnull if(dolong)
51 76193d7c 2003-09-30 devnull snprint(buf, sizeof(buf), "%s(%s)", archive, member);
52 76193d7c 2003-09-30 devnull else
53 76193d7c 2003-09-30 devnull snprint(buf, sizeof(buf), "%s(%.*s)", archive, SARNAME, member);
54 76193d7c 2003-09-30 devnull sym = symlook(buf, S_TIME, 0);
55 76193d7c 2003-09-30 devnull if (sym)
56 76193d7c 2003-09-30 devnull return (long)sym->value; /* uggh */
57 76193d7c 2003-09-30 devnull return 0;
58 76193d7c 2003-09-30 devnull }
59 76193d7c 2003-09-30 devnull
60 76193d7c 2003-09-30 devnull void
61 76193d7c 2003-09-30 devnull atouch(char *name)
62 76193d7c 2003-09-30 devnull {
63 76193d7c 2003-09-30 devnull char *archive, *member;
64 76193d7c 2003-09-30 devnull int fd, i;
65 76193d7c 2003-09-30 devnull struct ar_hdr h;
66 76193d7c 2003-09-30 devnull long t;
67 76193d7c 2003-09-30 devnull
68 76193d7c 2003-09-30 devnull archive = split(name, &member);
69 76193d7c 2003-09-30 devnull if(archive == 0)
70 76193d7c 2003-09-30 devnull Exit();
71 76193d7c 2003-09-30 devnull
72 76193d7c 2003-09-30 devnull fd = open(archive, ORDWR);
73 76193d7c 2003-09-30 devnull if(fd < 0){
74 76193d7c 2003-09-30 devnull fd = create(archive, OWRITE, 0666);
75 76193d7c 2003-09-30 devnull if(fd < 0){
76 76193d7c 2003-09-30 devnull fprint(2, "create %s: %r\n", archive);
77 76193d7c 2003-09-30 devnull Exit();
78 76193d7c 2003-09-30 devnull }
79 76193d7c 2003-09-30 devnull write(fd, ARMAG, SARMAG);
80 76193d7c 2003-09-30 devnull }
81 76193d7c 2003-09-30 devnull if(symlook(name, S_TIME, 0)){
82 76193d7c 2003-09-30 devnull /* hoon off and change it in situ */
83 76193d7c 2003-09-30 devnull LSEEK(fd, SARMAG, 0);
84 76193d7c 2003-09-30 devnull while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){
85 76193d7c 2003-09-30 devnull for(i = SARNAME-1; i > 0 && h.name[i] == ' '; i--)
86 76193d7c 2003-09-30 devnull ;
87 76193d7c 2003-09-30 devnull h.name[i+1]=0;
88 76193d7c 2003-09-30 devnull if(strcmp(member, h.name) == 0){
89 76193d7c 2003-09-30 devnull t = SARNAME-sizeof(h); /* ughgghh */
90 76193d7c 2003-09-30 devnull LSEEK(fd, t, 1);
91 76193d7c 2003-09-30 devnull fprint(fd, "%-12ld", time(0));
92 76193d7c 2003-09-30 devnull break;
93 76193d7c 2003-09-30 devnull }
94 76193d7c 2003-09-30 devnull t = atol(h.size);
95 76193d7c 2003-09-30 devnull if(t&01) t++;
96 76193d7c 2003-09-30 devnull LSEEK(fd, t, 1);
97 76193d7c 2003-09-30 devnull }
98 76193d7c 2003-09-30 devnull }
99 76193d7c 2003-09-30 devnull close(fd);
100 76193d7c 2003-09-30 devnull }
101 76193d7c 2003-09-30 devnull
102 76193d7c 2003-09-30 devnull static void
103 76193d7c 2003-09-30 devnull atimes(char *ar)
104 76193d7c 2003-09-30 devnull {
105 76193d7c 2003-09-30 devnull struct ar_hdr h;
106 76193d7c 2003-09-30 devnull long t;
107 76193d7c 2003-09-30 devnull int fd, i;
108 76193d7c 2003-09-30 devnull char buf[BIGBLOCK];
109 76193d7c 2003-09-30 devnull char name[sizeof(h.name)+1];
110 76193d7c 2003-09-30 devnull
111 76193d7c 2003-09-30 devnull fd = open(ar, OREAD);
112 76193d7c 2003-09-30 devnull if(fd < 0)
113 76193d7c 2003-09-30 devnull return;
114 76193d7c 2003-09-30 devnull
115 76193d7c 2003-09-30 devnull if(read(fd, buf, SARMAG) != SARMAG){
116 76193d7c 2003-09-30 devnull close(fd);
117 76193d7c 2003-09-30 devnull return;
118 76193d7c 2003-09-30 devnull }
119 76193d7c 2003-09-30 devnull while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){
120 76193d7c 2003-09-30 devnull t = atol(h.date);
121 76193d7c 2003-09-30 devnull if(t == 0) /* as it sometimes happens; thanks ken */
122 76193d7c 2003-09-30 devnull t = 1;
123 76193d7c 2003-09-30 devnull strncpy(name, h.name, sizeof(h.name));
124 76193d7c 2003-09-30 devnull for(i = sizeof(h.name)-1; i > 0 && name[i] == ' '; i--)
125 76193d7c 2003-09-30 devnull ;
126 76193d7c 2003-09-30 devnull if(name[i] == '/') /* system V bug */
127 76193d7c 2003-09-30 devnull i--;
128 76193d7c 2003-09-30 devnull name[i+1]=0;
129 76193d7c 2003-09-30 devnull sprint(buf, "%s(%s)", ar, h.size);
130 76193d7c 2003-09-30 devnull symlook(strdup(buf), S_TIME, (void *)t)->value = (void *)t;
131 76193d7c 2003-09-30 devnull t = atol(h.size);
132 76193d7c 2003-09-30 devnull if(t&01) t++;
133 76193d7c 2003-09-30 devnull LSEEK(fd, t, 1);
134 76193d7c 2003-09-30 devnull }
135 76193d7c 2003-09-30 devnull close(fd);
136 76193d7c 2003-09-30 devnull }
137 76193d7c 2003-09-30 devnull
138 76193d7c 2003-09-30 devnull static int
139 76193d7c 2003-09-30 devnull type(char *file)
140 76193d7c 2003-09-30 devnull {
141 76193d7c 2003-09-30 devnull int fd;
142 76193d7c 2003-09-30 devnull char buf[SARMAG];
143 76193d7c 2003-09-30 devnull
144 76193d7c 2003-09-30 devnull fd = open(file, OREAD);
145 76193d7c 2003-09-30 devnull if(fd < 0){
146 76193d7c 2003-09-30 devnull if(symlook(file, S_BITCH, 0) == 0){
147 76193d7c 2003-09-30 devnull Bprint(&bout, "%s doesn't exist: assuming it will be an archive\n", file);
148 76193d7c 2003-09-30 devnull symlook(file, S_BITCH, (void *)file);
149 76193d7c 2003-09-30 devnull }
150 76193d7c 2003-09-30 devnull return 1;
151 76193d7c 2003-09-30 devnull }
152 76193d7c 2003-09-30 devnull if(read(fd, buf, SARMAG) != SARMAG){
153 76193d7c 2003-09-30 devnull close(fd);
154 76193d7c 2003-09-30 devnull return 0;
155 76193d7c 2003-09-30 devnull }
156 76193d7c 2003-09-30 devnull close(fd);
157 76193d7c 2003-09-30 devnull return !strncmp(ARMAG, buf, SARMAG);
158 76193d7c 2003-09-30 devnull }
159 76193d7c 2003-09-30 devnull
160 76193d7c 2003-09-30 devnull static char*
161 76193d7c 2003-09-30 devnull split(char *name, char **member)
162 76193d7c 2003-09-30 devnull {
163 76193d7c 2003-09-30 devnull char *p, *q;
164 76193d7c 2003-09-30 devnull
165 76193d7c 2003-09-30 devnull p = strdup(name);
166 76193d7c 2003-09-30 devnull q = utfrune(p, '(');
167 76193d7c 2003-09-30 devnull if(q){
168 76193d7c 2003-09-30 devnull *q++ = 0;
169 76193d7c 2003-09-30 devnull if(member)
170 76193d7c 2003-09-30 devnull *member = q;
171 76193d7c 2003-09-30 devnull q = utfrune(q, ')');
172 76193d7c 2003-09-30 devnull if (q)
173 76193d7c 2003-09-30 devnull *q = 0;
174 76193d7c 2003-09-30 devnull if(type(p))
175 76193d7c 2003-09-30 devnull return p;
176 76193d7c 2003-09-30 devnull free(p);
177 76193d7c 2003-09-30 devnull fprint(2, "mk: '%s' is not an archive\n", name);
178 76193d7c 2003-09-30 devnull }
179 76193d7c 2003-09-30 devnull return 0;
180 76193d7c 2003-09-30 devnull }