xref: /aosp_15_r20/external/libexif/mkinstalldirs (revision 735d6239c16e246968a03ef6e2db00d67bad6cdc)
1*735d6239SKiyoung Kim#! /bin/sh
2*735d6239SKiyoung Kim# mkinstalldirs --- make directory hierarchy
3*735d6239SKiyoung Kim
4*735d6239SKiyoung Kimscriptversion=2009-04-28.21; # UTC
5*735d6239SKiyoung Kim
6*735d6239SKiyoung Kim# Original author: Noah Friedman <[email protected]>
7*735d6239SKiyoung Kim# Created: 1993-05-16
8*735d6239SKiyoung Kim# Public domain.
9*735d6239SKiyoung Kim#
10*735d6239SKiyoung Kim# This file is maintained in Automake, please report
11*735d6239SKiyoung Kim# bugs to <[email protected]> or send patches to
12*735d6239SKiyoung Kim# <[email protected]>.
13*735d6239SKiyoung Kim
14*735d6239SKiyoung Kimnl='
15*735d6239SKiyoung Kim'
16*735d6239SKiyoung KimIFS=" ""	$nl"
17*735d6239SKiyoung Kimerrstatus=0
18*735d6239SKiyoung Kimdirmode=
19*735d6239SKiyoung Kim
20*735d6239SKiyoung Kimusage="\
21*735d6239SKiyoung KimUsage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
22*735d6239SKiyoung Kim
23*735d6239SKiyoung KimCreate each directory DIR (with mode MODE, if specified), including all
24*735d6239SKiyoung Kimleading file name components.
25*735d6239SKiyoung Kim
26*735d6239SKiyoung KimReport bugs to <[email protected]>."
27*735d6239SKiyoung Kim
28*735d6239SKiyoung Kim# process command line arguments
29*735d6239SKiyoung Kimwhile test $# -gt 0 ; do
30*735d6239SKiyoung Kim  case $1 in
31*735d6239SKiyoung Kim    -h | --help | --h*)         # -h for help
32*735d6239SKiyoung Kim      echo "$usage"
33*735d6239SKiyoung Kim      exit $?
34*735d6239SKiyoung Kim      ;;
35*735d6239SKiyoung Kim    -m)                         # -m PERM arg
36*735d6239SKiyoung Kim      shift
37*735d6239SKiyoung Kim      test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
38*735d6239SKiyoung Kim      dirmode=$1
39*735d6239SKiyoung Kim      shift
40*735d6239SKiyoung Kim      ;;
41*735d6239SKiyoung Kim    --version)
42*735d6239SKiyoung Kim      echo "$0 $scriptversion"
43*735d6239SKiyoung Kim      exit $?
44*735d6239SKiyoung Kim      ;;
45*735d6239SKiyoung Kim    --)                         # stop option processing
46*735d6239SKiyoung Kim      shift
47*735d6239SKiyoung Kim      break
48*735d6239SKiyoung Kim      ;;
49*735d6239SKiyoung Kim    -*)                         # unknown option
50*735d6239SKiyoung Kim      echo "$usage" 1>&2
51*735d6239SKiyoung Kim      exit 1
52*735d6239SKiyoung Kim      ;;
53*735d6239SKiyoung Kim    *)                          # first non-opt arg
54*735d6239SKiyoung Kim      break
55*735d6239SKiyoung Kim      ;;
56*735d6239SKiyoung Kim  esac
57*735d6239SKiyoung Kimdone
58*735d6239SKiyoung Kim
59*735d6239SKiyoung Kimfor file
60*735d6239SKiyoung Kimdo
61*735d6239SKiyoung Kim  if test -d "$file"; then
62*735d6239SKiyoung Kim    shift
63*735d6239SKiyoung Kim  else
64*735d6239SKiyoung Kim    break
65*735d6239SKiyoung Kim  fi
66*735d6239SKiyoung Kimdone
67*735d6239SKiyoung Kim
68*735d6239SKiyoung Kimcase $# in
69*735d6239SKiyoung Kim  0) exit 0 ;;
70*735d6239SKiyoung Kimesac
71*735d6239SKiyoung Kim
72*735d6239SKiyoung Kim# Solaris 8's mkdir -p isn't thread-safe.  If you mkdir -p a/b and
73*735d6239SKiyoung Kim# mkdir -p a/c at the same time, both will detect that a is missing,
74*735d6239SKiyoung Kim# one will create a, then the other will try to create a and die with
75*735d6239SKiyoung Kim# a "File exists" error.  This is a problem when calling mkinstalldirs
76*735d6239SKiyoung Kim# from a parallel make.  We use --version in the probe to restrict
77*735d6239SKiyoung Kim# ourselves to GNU mkdir, which is thread-safe.
78*735d6239SKiyoung Kimcase $dirmode in
79*735d6239SKiyoung Kim  '')
80*735d6239SKiyoung Kim    if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
81*735d6239SKiyoung Kim      echo "mkdir -p -- $*"
82*735d6239SKiyoung Kim      exec mkdir -p -- "$@"
83*735d6239SKiyoung Kim    else
84*735d6239SKiyoung Kim      # On NextStep and OpenStep, the `mkdir' command does not
85*735d6239SKiyoung Kim      # recognize any option.  It will interpret all options as
86*735d6239SKiyoung Kim      # directories to create, and then abort because `.' already
87*735d6239SKiyoung Kim      # exists.
88*735d6239SKiyoung Kim      test -d ./-p && rmdir ./-p
89*735d6239SKiyoung Kim      test -d ./--version && rmdir ./--version
90*735d6239SKiyoung Kim    fi
91*735d6239SKiyoung Kim    ;;
92*735d6239SKiyoung Kim  *)
93*735d6239SKiyoung Kim    if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
94*735d6239SKiyoung Kim       test ! -d ./--version; then
95*735d6239SKiyoung Kim      echo "mkdir -m $dirmode -p -- $*"
96*735d6239SKiyoung Kim      exec mkdir -m "$dirmode" -p -- "$@"
97*735d6239SKiyoung Kim    else
98*735d6239SKiyoung Kim      # Clean up after NextStep and OpenStep mkdir.
99*735d6239SKiyoung Kim      for d in ./-m ./-p ./--version "./$dirmode";
100*735d6239SKiyoung Kim      do
101*735d6239SKiyoung Kim        test -d $d && rmdir $d
102*735d6239SKiyoung Kim      done
103*735d6239SKiyoung Kim    fi
104*735d6239SKiyoung Kim    ;;
105*735d6239SKiyoung Kimesac
106*735d6239SKiyoung Kim
107*735d6239SKiyoung Kimfor file
108*735d6239SKiyoung Kimdo
109*735d6239SKiyoung Kim  case $file in
110*735d6239SKiyoung Kim    /*) pathcomp=/ ;;
111*735d6239SKiyoung Kim    *)  pathcomp= ;;
112*735d6239SKiyoung Kim  esac
113*735d6239SKiyoung Kim  oIFS=$IFS
114*735d6239SKiyoung Kim  IFS=/
115*735d6239SKiyoung Kim  set fnord $file
116*735d6239SKiyoung Kim  shift
117*735d6239SKiyoung Kim  IFS=$oIFS
118*735d6239SKiyoung Kim
119*735d6239SKiyoung Kim  for d
120*735d6239SKiyoung Kim  do
121*735d6239SKiyoung Kim    test "x$d" = x && continue
122*735d6239SKiyoung Kim
123*735d6239SKiyoung Kim    pathcomp=$pathcomp$d
124*735d6239SKiyoung Kim    case $pathcomp in
125*735d6239SKiyoung Kim      -*) pathcomp=./$pathcomp ;;
126*735d6239SKiyoung Kim    esac
127*735d6239SKiyoung Kim
128*735d6239SKiyoung Kim    if test ! -d "$pathcomp"; then
129*735d6239SKiyoung Kim      echo "mkdir $pathcomp"
130*735d6239SKiyoung Kim
131*735d6239SKiyoung Kim      mkdir "$pathcomp" || lasterr=$?
132*735d6239SKiyoung Kim
133*735d6239SKiyoung Kim      if test ! -d "$pathcomp"; then
134*735d6239SKiyoung Kim	errstatus=$lasterr
135*735d6239SKiyoung Kim      else
136*735d6239SKiyoung Kim	if test ! -z "$dirmode"; then
137*735d6239SKiyoung Kim	  echo "chmod $dirmode $pathcomp"
138*735d6239SKiyoung Kim	  lasterr=
139*735d6239SKiyoung Kim	  chmod "$dirmode" "$pathcomp" || lasterr=$?
140*735d6239SKiyoung Kim
141*735d6239SKiyoung Kim	  if test ! -z "$lasterr"; then
142*735d6239SKiyoung Kim	    errstatus=$lasterr
143*735d6239SKiyoung Kim	  fi
144*735d6239SKiyoung Kim	fi
145*735d6239SKiyoung Kim      fi
146*735d6239SKiyoung Kim    fi
147*735d6239SKiyoung Kim
148*735d6239SKiyoung Kim    pathcomp=$pathcomp/
149*735d6239SKiyoung Kim  done
150*735d6239SKiyoung Kimdone
151*735d6239SKiyoung Kim
152*735d6239SKiyoung Kimexit $errstatus
153*735d6239SKiyoung Kim
154*735d6239SKiyoung Kim# Local Variables:
155*735d6239SKiyoung Kim# mode: shell-script
156*735d6239SKiyoung Kim# sh-indentation: 2
157*735d6239SKiyoung Kim# eval: (add-hook 'write-file-hooks 'time-stamp)
158*735d6239SKiyoung Kim# time-stamp-start: "scriptversion="
159*735d6239SKiyoung Kim# time-stamp-format: "%:y-%02m-%02d.%02H"
160*735d6239SKiyoung Kim# time-stamp-time-zone: "UTC"
161*735d6239SKiyoung Kim# time-stamp-end: "; # UTC"
162*735d6239SKiyoung Kim# End:
163