Page MenuHomeFreeBSD

D25551.id74266.diff
No OneTemporary

D25551.id74266.diff

Index: head/usr.bin/xinstall/xinstall.c
===================================================================
--- head/usr.bin/xinstall/xinstall.c
+++ head/usr.bin/xinstall/xinstall.c
@@ -147,7 +147,7 @@
static void metadata_log(const char *, const char *, struct timespec *,
const char *, const char *, off_t);
static int parseid(const char *, id_t *);
-static void strip(const char *);
+static int strip(const char *, const char *, char **);
static int trymmap(int);
static void usage(void);
@@ -767,12 +767,13 @@
{
struct stat from_sb, temp_sb, to_sb;
struct timespec tsb[2];
- int devnull, files_match, from_fd, serrno, target;
+ int devnull, files_match, from_fd, serrno, stripped, target;
int tempcopy, temp_fd, to_fd;
char backup[MAXPATHLEN], *p, pathbuf[MAXPATHLEN], tempfile[MAXPATHLEN];
char *digestresult;
- files_match = 0;
+ digestresult = NULL;
+ files_match = stripped = 0;
from_fd = -1;
to_fd = -1;
@@ -858,19 +859,24 @@
(void)printf("install: %s -> %s\n",
from_name, to_name);
}
- if (!devnull)
- digestresult = copy(from_fd, from_name, to_fd,
- tempcopy ? tempfile : to_name, from_sb.st_size);
- else
- digestresult = NULL;
+ if (!devnull) {
+ if (dostrip)
+ stripped = strip(tempcopy ? tempfile : to_name,
+ from_name, &digestresult);
+ else
+ digestresult = copy(from_fd, from_name, to_fd,
+ tempcopy ? tempfile : to_name, from_sb.st_size);
+ }
}
if (dostrip) {
- strip(tempcopy ? tempfile : to_name);
+ if (!stripped)
+ (void)strip(tempcopy ? tempfile : to_name, NULL,
+ &digestresult);
/*
- * Re-open our fd on the target, in case we used a strip
- * that does not work in-place -- like GNU binutils strip.
+ * Re-open our fd on the target, in case
+ * we did not strip in-place.
*/
close(to_fd);
to_fd = open(tempcopy ? tempfile : to_name, O_RDONLY, 0);
@@ -1057,7 +1063,9 @@
/*
* compare --
- * compare two files; non-zero means files differ
+ * Compare two files; non-zero means files differ.
+ * Compute digest and return its address in *dresp
+ * unless it points to pre-computed digest.
*/
static int
compare(int from_fd, const char *from_name __unused, size_t from_len,
@@ -1066,15 +1074,17 @@
{
char *p, *q;
int rv;
- int done_compare;
+ int do_digest, done_compare;
DIGEST_CTX ctx;
rv = 0;
if (from_len != to_len)
return 1;
+ do_digest = (digesttype != DIGEST_NONE && dresp != NULL &&
+ *dresp == NULL);
if (from_len <= MAX_CMP_SIZE) {
- if (dresp != NULL)
+ if (do_digest)
digest_init(&ctx);
done_compare = 0;
if (trymmap(from_fd) && trymmap(to_fd)) {
@@ -1090,7 +1100,7 @@
}
rv = memcmp(p, q, from_len);
- if (dresp != NULL)
+ if (do_digest)
digest_update(&ctx, p, from_len);
munmap(p, from_len);
munmap(q, from_len);
@@ -1117,7 +1127,8 @@
rv = 1; /* out of sync */
} else
rv = 1; /* read failure */
- digest_update(&ctx, buf1, n1);
+ if (do_digest)
+ digest_update(&ctx, buf1, n1);
}
lseek(from_fd, 0, SEEK_SET);
lseek(to_fd, 0, SEEK_SET);
@@ -1125,7 +1136,7 @@
} else
rv = 1; /* don't bother in this case */
- if (dresp != NULL) {
+ if (do_digest) {
if (rv == 0)
*dresp = digest_end(&ctx, NULL);
else
@@ -1298,13 +1309,16 @@
/*
* strip --
- * use strip(1) to strip the target file
+ * Use strip(1) to strip the target file.
+ * Just invoke strip(1) on to_name if from_name is NULL,
+ * else try to run "strip -o to_name -- from_name" and return 0 on failure.
+ * Return 1 on success and assign result of digest_file(to_name) to *dresp.
*/
-static void
-strip(const char *to_name)
+static int
+strip(const char *to_name, const char *from_name, char **dresp)
{
const char *stripbin;
- const char *args[3];
+ const char *args[6];
pid_t pid;
int error, status;
@@ -1312,8 +1326,16 @@
if (stripbin == NULL)
stripbin = "strip";
args[0] = stripbin;
- args[1] = to_name;
- args[2] = NULL;
+ if (from_name == NULL) {
+ args[1] = to_name;
+ args[2] = NULL;
+ } else {
+ args[1] = "-o";
+ args[2] = to_name;
+ args[3] = "--";
+ args[4] = from_name;
+ args[5] = NULL;
+ }
error = posix_spawnp(&pid, stripbin, NULL, NULL,
__DECONST(char **, args), environ);
if (error != 0) {
@@ -1329,9 +1351,14 @@
}
if (status != 0) {
(void)unlink(to_name);
+ if (from_name != NULL)
+ return (0);
errx(EX_SOFTWARE, "strip command %s failed on %s",
stripbin, to_name);
}
+ if (dresp != NULL)
+ *dresp = digest_file(to_name);
+ return (1);
}
/*

File Metadata

Mime Type
text/plain
Expires
Sun, Nov 17, 11:21 AM (21 h, 33 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
14674039
Default Alt Text
D25551.id74266.diff (4 KB)

Event Timeline