Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 2 Feb 1996 20:18:38 +0100 (MET)
From:      haury@sagem.fr
To:        hackers@freebsd.org
Subject:   Q: why install -d dir missing ?
Message-ID:   <199602021918.UAA10893@sagem.fr>

next in thread | raw e-mail | index | archive | help
I am wondering why the well known option '-d' is missing in current install
program. Since I am a newbie in FreeBSD, I hope it's not an old war :-)

If the problem is just because no one has time to do that, here are my patches.
I have copied the right routine in NetBSD 1.0 and adapted it for FreeBSD.

NOTA: I have changed the '-d' (debug) option in '-D'.


======= CUT HERE (don't forget to remove my signature) =============
*** ./usr.bin/xinstall/install.1#ctm	Wed Jan 31 14:35:24 1996
--- ./usr.bin/xinstall/install.1	Wed Jan 31 15:56:03 1996
***************
*** 47,53 ****
  .Op Fl o Ar owner
  .Ar file1 file2
  .Nm install
! .Op Fl Ccdps
  .Op Fl f Ar flags
  .Op Fl g Ar group
  .Op Fl m Ar mode
--- 47,53 ----
  .Op Fl o Ar owner
  .Ar file1 file2
  .Nm install
! .Op Fl CcDps
  .Op Fl f Ar flags
  .Op Fl g Ar group
  .Op Fl m Ar mode
***************
*** 55,60 ****
--- 55,67 ----
  .Ar file1
  \&...
  .Ar fileN directory
+ .Nm install
+ .Fl d
+ .Op Fl m Ar mode
+ .Op Fl o Ar owner
+ .Op Fl g Ar group 
+ .Ar directory   
+ \&...   
  .Sh DESCRIPTION
  The file(s) are moved (or copied if the
  .Fl c
***************
*** 79,96 ****
  This flag turns off the default behavior of
  .Nm install
  where it deletes the original file after creating the target.
! .It Fl d
  Print debugging information.
  If
! .Fl d
  is specified one or more times,
  then print the renaming steps for
  .Fl C .
  If
! .Fl d
  is specified two or more times,
  then warn about files that aren't installed with
  .Fl C .
  .It Fl f
  Specify the target's file flags.
  (See
--- 86,106 ----
  This flag turns off the default behavior of
  .Nm install
  where it deletes the original file after creating the target.
! .It Fl D
  Print debugging information.
  If
! .Fl D
  is specified one or more times,
  then print the renaming steps for
  .Fl C .
  If
! .Fl D
  is specified two or more times,
  then warn about files that aren't installed with
  .Fl C .
+ .It Fl d
+ Create directories.
+ Missing parent directories are created as required.
  .It Fl f
  Specify the target's file flags.
  (See
*** ./usr.bin/xinstall/xinstall.c#ctm	Tue Jan 30 11:41:50 1996
--- ./usr.bin/xinstall/xinstall.c	Fri Feb  2 20:12:17 1996
***************
*** 81,87 ****
  
  struct passwd *pp;
  struct group *gp;
! int debug, docompare, docopy, dopreserve, dostrip;
  int mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
  char *group, *owner, pathbuf[MAXPATHLEN];
  char pathbuf2[MAXPATHLEN];
--- 81,87 ----
  
  struct passwd *pp;
  struct group *gp;
! int debug, docompare, docopy, dopreserve, dostrip, dodir;
  int mode = S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH;
  char *group, *owner, pathbuf[MAXPATHLEN];
  char pathbuf2[MAXPATHLEN];
***************
*** 111,117 ****
  	char *flags, *to_name;
  
  	iflags = 0;
! 	while ((ch = getopt(argc, argv, "Ccdf:g:m:o:ps")) != EOF)
  		switch((char)ch) {
  		case 'C':
  			docompare = docopy = 1;
--- 111,117 ----
  	char *flags, *to_name;
  
  	iflags = 0;
! 	while ((ch = getopt(argc, argv, "CcDdf:g:m:o:ps")) != EOF)
  		switch((char)ch) {
  		case 'C':
  			docompare = docopy = 1;
***************
*** 119,127 ****
  		case 'c':
  			docopy = 1;
  			break;
! 		case 'd':
  			debug++;
  			break;
  		case 'f':
  			flags = optarg;
  			if (string_to_flags(&flags, &fset, NULL))
--- 119,130 ----
  		case 'c':
  			docopy = 1;
  			break;
! 		case 'D':
  			debug++;
  			break;
+ 		case 'd':
+ 			dodir = 1;
+ 			break;
  		case 'f':
  			flags = optarg;
  			if (string_to_flags(&flags, &fset, NULL))
***************
*** 152,158 ****
  		}
  	argc -= optind;
  	argv += optind;
! 	if (argc < 2)
  		usage();
  
  	/* get group and owner id's */
--- 155,161 ----
  		}
  	argc -= optind;
  	argv += optind;
! 	if (argc < 2 && !dodir)
  		usage();
  
  	/* get group and owner id's */
***************
*** 161,166 ****
--- 164,176 ----
  	if (owner && !(pp = getpwnam(owner)))
  		errx(EX_NOUSER, "unknown user %s", owner);
  
+ 	if (dodir) {
+ 		for (; *argv != NULL; ++argv)
+ 			build(*argv);
+ 		exit (0);
+ 		/* NOTREACHED */
+ 	}
+ 
  	no_target = stat(to_name = argv[argc - 1], &to_sb);
  	if (!no_target && (to_sb.st_mode & S_IFMT) == S_IFDIR) {
  		for (; *argv != to_name; ++argv)
***************
*** 492,497 ****
--- 502,546 ----
  }
  
  /*
+  * build --
+  *	build directory heirarchy
+  */
+ build(path)
+         char *path;
+ {
+         register char *p;
+         struct stat sb;
+         int create, ch;
+ 
+         for (create = 0, p = path;; ++p)
+                 if (!*p || *p  == '/') {
+                         ch = *p;
+                         *p = '\0';
+                         if (stat(path, &sb)) {
+                                 if (errno != ENOENT || mkdir(path, 0777) < 0) {
+ 					errx(EX_OSERR, "mkdir %s", path);
+                                 }
+                                 create = 1;
+                         } else {
+ 				if ((sb.st_mode & S_IFMT) != S_IFDIR) {
+ 					errx(EX_CANTCREAT, "%s not a directory",
+ 						path);
+ 				}
+ 			}
+                         if (!(*p = ch))
+                                 break;
+                 }
+ 
+ 	if ((group || owner) &&
+             chown(path, owner ? pp->pw_uid : -1, group ? gp->gr_gid : -1) ||
+             chmod(path, mode)) {
+ 		errx(EX_OSERR, "chmod %s", path);
+         }
+ 
+         return(0);
+ }
+ 
+ /*
   * usage --
   *	print a usage message and die
   */
***************
*** 499,504 ****
  usage()
  {
  	(void)fprintf(stderr,
! "usage: install [-Ccdps] [-f flags] [-g group] [-m mode] [-o owner] file1 file2;\n\tor file1 ... fileN directory\n");
  	exit(1);
  }
--- 548,553 ----
  usage()
  {
  	(void)fprintf(stderr,
! "usage: install [-CcDps] [-f flags] [-g group] [-m mode] [-o owner] file1 file2;\n\tor file1 ... fileN directory;\n       install -d [-g group] [-m mode] [-o owner] dir1 ... dirN;\n");
  	exit(1);
  }
-- 
		=Christian Haury (Christian.Haury@sagem.fr)

	 ---------------------------------------------------------
	|   SAGEM Eragny - Avenue du Gros Chene - Eragny BP 51    |
	|             95612 Cergy Pontoise Cedex - France         |
	| phone   : +33 (1) 34 30 53 93 | telex   : 607387F       |
	| fax     : +33 (1) 34 30 50 28 | teletex : 933-130731770 |
	 ---------------------------------------------------------



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi? <199602021918.UAA10893>