Date: Mon, 13 Mar 1995 15:46:36 -0800 (PST) From: Steven G Kargl <kargl@troutmask.apl.washington.edu> To: phk@freefall.cdrom.com, freebsd-hackers@freefall.cdrom.com (FreeBSD) Subject: install compressed binary patch Message-ID: <199503132346.PAA15798@troutmask.apl.washington.edu>
next in thread | raw e-mail | index | archive | help
Poul, Hackers,
I have added a `-z' option to install. It will tell install to
execute gzip to compress a binary and create a sym link. I have
tested my addition, and it appears to work correctly. This might
be useful for a `make world' on a machine with limited disk space.
You obviously do not want to blindly compress all binaries during
a `make world':-)
Of course, your kernel must be compiled to run gzipped binaries.
This is with -current sources. I hope I got `diff -c'right.
--
Steven G. Kargl | Phone: 206-685-4677 |
Applied Physics Laboratory | Fax: 206-543-6785 |
University of Washington |---------------------|
1013 NE 40th St | FreeBSD 2.1-current |
Seattle, WA 98105 |---------------------|
*** /usr/src/usr.bin/xinstall/install.1 Fri May 27 05:33:39 1994
--- ./install.1 Mon Mar 13 14:24:04 1995
***************
*** 39,52 ****
.Nd install binaries
.Sh SYNOPSIS
.Nm install
! .Op Fl cs
.Op Fl f Ar flags
.Op Fl g Ar group
.Op Fl m Ar mode
.Op Fl o Ar owner
.Ar file1 file2
.Nm install
! .Op Fl cs
.Op Fl f Ar flags
.Op Fl g Ar group
.Op Fl m Ar mode
--- 39,52 ----
.Nd install binaries
.Sh SYNOPSIS
.Nm install
! .Op Fl csz
.Op Fl f Ar flags
.Op Fl g Ar group
.Op Fl m Ar mode
.Op Fl o Ar owner
.Ar file1 file2
.Nm install
! .Op Fl csz
.Op Fl f Ar flags
.Op Fl g Ar group
.Op Fl m Ar mode
***************
*** 93,98 ****
--- 93,103 ----
.Xr strip 1
to strip binaries so that install can be portable over a large
number of systems and binary types.
+ .It Fl z
+ .Nm Install
+ exec's the command
+ .Xr gzip 1
+ to compress the binaries and create the necessary symbolic links.
.El
.Pp
By default,
Only in /usr/src/usr.bin/xinstall: obj
Only in .: patch.txt
diff -c /usr/src/usr.bin/xinstall/pathnames.h ./pathnames.h
*** /usr/src/usr.bin/xinstall/pathnames.h Fri May 27 05:33:38 1994
--- ./pathnames.h Mon Mar 13 15:11:57 1995
***************
*** 34,36 ****
--- 34,38 ----
*/
#define _PATH_STRIP "/usr/bin/strip"
+ #define _PATH_GZIP "/usr/bin/gzip"
+ #define _PATH_LN "/bin/ln"
diff -c /usr/src/usr.bin/xinstall/xinstall.c ./xinstall.c
*** /usr/src/usr.bin/xinstall/xinstall.c Fri May 27 05:33:39 1994
--- ./xinstall.c Mon Mar 13 15:20:19 1995
***************
*** 61,67 ****
struct passwd *pp;
struct group *gp;
! int docopy, dostrip;
int mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
char *group, *owner, pathbuf[MAXPATHLEN];
--- 61,67 ----
struct passwd *pp;
struct group *gp;
! int docopy, dostrip, dogzip;
int mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
char *group, *owner, pathbuf[MAXPATHLEN];
***************
*** 73,78 ****
--- 73,79 ----
void install __P((char *, char *, u_long, u_int));
u_long string_to_flags __P((char **, u_long *, u_long *));
void strip __P((char *));
+ void gzip __P((char *));
void usage __P((void));
int
***************
*** 88,94 ****
char *flags, *to_name;
iflags = 0;
! while ((ch = getopt(argc, argv, "cf:g:m:o:s")) != EOF)
switch((char)ch) {
case 'c':
docopy = 1;
--- 89,95 ----
char *flags, *to_name;
iflags = 0;
! while ((ch = getopt(argc, argv, "cf:g:m:o:sz")) != EOF)
switch((char)ch) {
case 'c':
docopy = 1;
***************
*** 113,118 ****
--- 114,122 ----
case 's':
dostrip = 1;
break;
+ case 'z':
+ dogzip = 1;
+ break;
case '?':
default:
usage();
***************
*** 246,251 ****
--- 250,261 ----
err("%s: chflags: %s", to_name, strerror(serrno));
}
+ /*
+ * The file has been installed. We now compress and create sym link
+ */
+ if (dogzip)
+ gzip(to_name);
+
(void)close(to_fd);
if (!docopy && !devnull && unlink(from_name))
err("%s: %s", from_name, strerror(errno));
***************
*** 317,322 ****
--- 327,388 ----
}
/*
+ * gzip --
+ * use gzip(1) to compress target file, then create a sym link
+ */
+ void
+ gzip(to_name)
+ char *to_name;
+ {
+ char gz_name[MAXPATHLEN];
+ int serrno, status;
+
+ /*
+ * Fork a child process to compress file. Note: gzip is executed
+ * with the `-f' option to force installation over existing files.
+ */
+ switch (vfork()) {
+ case -1:
+ serrno = errno;
+ (void)unlink(to_name);
+ err("forks: %s", strerror(errno));
+ case 0:
+ execl(_PATH_GZIP, "gzip", "-f", to_name, NULL);
+ err("%s: %s", _PATH_STRIP, strerror(errno));
+ default:
+ if (wait(&status) == -1 || status)
+ (void)unlink(to_name);
+ }
+
+ /*
+ * Compression must have been successful, if we get here.
+ * So, build a filename for the gzipped file
+ */
+ if (strlen(to_name) < MAXPATHLEN - 3)
+ strcpy(gz_name, to_name);
+ strcat(gz_name, ".gz");
+
+ /*
+ * Fork a child to create sym link
+ */
+ switch (vfork()) {
+ case -1:
+ serrno = errno;
+ (void)unlink(to_name);
+ (void)unlink(gz_name);
+ err("forks: %s", strerror(errno));
+ case 0:
+ execl(_PATH_LN, "ln", "-s", gz_name, to_name, NULL);
+ err("%s: %s", _PATH_LN, strerror(errno));
+ default:
+ if (wait(&status) == -1 || status) {
+ (void)unlink(to_name);
+ (void)unlink(gz_name);
+ }
+ }
+ }
+
+ /*
* usage --
* print a usage message and die
*/
***************
*** 324,330 ****
usage()
{
(void)fprintf(stderr,
! "usage: install [-cs] [-f flags] [-g group] [-m mode] [-o owner] file1 file2;\n\tor file1 ... fileN directory\n");
exit(1);
}
--- 390,396 ----
usage()
{
(void)fprintf(stderr,
! "usage: install [-csz] [-f flags] [-g group] [-m mode] [-o owner] file1 file2;\n\tor file1 ... fileN directory\n");
exit(1);
}
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199503132346.PAA15798>
