4 static void atimes(char *);
5 static char *split(char*, char**);
8 atimeof(int force, char *name)
12 char *archive, *member, buf[512];
14 archive = split(name, &member);
19 sym = symlook(archive, S_AGG, 0);
21 if(force || t > sym->u.value){
28 /* mark the aggegate as having been done */
29 symlook(strdup(archive), S_AGG, "")->u.value = t;
31 /* truncate long member name to sizeof of name field in archive header */
32 snprint(buf, sizeof(buf), "%s(%.*s)", archive, utfnlen(member, SARNAME), member);
33 sym = symlook(buf, S_TIME, 0);
42 char *archive, *member;
47 archive = split(name, &member);
51 fd = open(archive, ORDWR);
53 fd = create(archive, OWRITE, 0666);
58 write(fd, ARMAG, SARMAG);
60 if(symlook(name, S_TIME, 0)){
61 /* hoon off and change it in situ */
63 while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){
64 for(i = SARNAME-1; i > 0 && h.name[i] == ' '; i--)
67 if(strcmp(member, h.name) == 0){
68 t = SARNAME-sizeof(h); /* ughgghh */
70 fprint(fd, "%-12ld", time(0));
94 if(read(fd, buf, SARMAG) != SARMAG){
98 if((d = dirfstat(fd)) == nil){
104 while(read(fd, (char *)&h, sizeof(h)) == sizeof(h)){
106 if(t >= at) /* new things in old archives confuses mk */
108 if(t <= 0) /* as it sometimes happens; thanks ken */
110 for(i = sizeof(h.name)-1; i > 0 && h.name[i] == ' '; i--)
112 if(h.name[i] == '/') /* system V bug */
114 h.name[i+1]=0; /* can stomp on date field */
115 snprint(buf, sizeof buf, "%s(%s)", ar, h.name);
116 symlook(strdup(buf), S_TIME, (void*)t)->u.value = t;
130 fd = open(file, OREAD);
132 if(symlook(file, S_BITCH, 0) == 0){
133 Bprint(&bout, "%s doesn't exist: assuming it will be an archive\n", file);
134 symlook(file, S_BITCH, (void *)file);
138 if(read(fd, buf, SARMAG) != SARMAG){
143 return !strncmp(ARMAG, buf, SARMAG);
147 split(char *name, char **member)
163 fprint(2, "mk: '%s' is not an archive\n", name);