view lib-src/make-path.c @ 3062:21d92abaac3a

[xemacs-hg @ 2005-11-13 10:39:28 by ben] fix up clean targets to delete .elc's as necessary dynodump/Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. *-noconfig targets are like the base targets they're based off of, but don't delete Makefiles and certain other files needed to rebuild the Makefiles as necessary. Refactor things to be more consistent. Top-level `elcclean' is an alias for `realclean-noconfig' and is used by target `beta'. `realclean-noconfig' (and, by extension, `realclean' and `extraclean') remove the .elc files. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile.in.in: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Makefile: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. common/Makefile.common: Add targets distclean-noconfig, realclean-noconfig, extraclean-noconfig. Do some refactoring for cleanliness. Put in some magic cookies in comments so this file gets read as a make file by XEmacs.
author ben
date Sun, 13 Nov 2005 10:39:41 +0000
parents 023b83f4e54b
children ed624ab64583
line wrap: on
line source

/* Make all the directories along a path.
   Copyright (C) 1992 Free Software Foundation, Inc.

This file is part of XEmacs.

XEmacs is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

XEmacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with XEmacs; see the file COPYING.  If not, write to
the Free the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.  */

/* Synched up with: FSF 19.28. */

/* This program works like mkdir, except that it generates
   intermediate directories if they don't exist.  This is just like
   the `mkdir -p' command on most systems; unfortunately, the mkdir
   command on some of the purer BSD systems (like Mt. Xinu) don't have
   that option. */

#ifdef emacs
#include <config.h>
#endif

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <errno.h>

char *prog_name;

static int touchy_mkdir (char *path)
{
  struct stat buf;

  /* If PATH already exists and is a directory, return success.  */
  if (stat (path, &buf) >= 0
      && (buf.st_mode & S_IFMT) == S_IFDIR)
    return 0;

  /* Otherwise, try to make it.  If PATH exists but isn't a directory,
     this will signal an error.  */
  if (mkdir (path, 0777) < 0)
    {
      fprintf (stderr, "%s: ", prog_name);
      perror (path);
      return 1;
    }

  return 0;
}

int
main (int argc, char *argv[])
{
  prog_name = *argv;

  for (argc--, argv++; argc > 0; argc--, argv++)
    {
      char *path = *argv;
      int i;

      /* Stop at each slash in path and try to create the directory.
	 Skip any initial slash.  */
      for (i = (path[0] == '/') ? 1 : 0; path[i]; i++)
	if (path[i] == '/')
	  {
	    path[i] = '\0';
	    if (touchy_mkdir (path) < 0)
	      goto next_pathname;
	    path[i] = '/';
	  }

      touchy_mkdir (path);

    next_pathname:
      ;
    }

  return 0;
}