| | | |
Offset 0, 0 lines modified | Offset 1, 541 lines modified |
| 1 | #!/bin/sh |
| 2 | #·install·-·install·a·program,·script,·or·datafile |
| |
| 3 | scriptversion=2020-11-14.01;·#·UTC |
| |
| 4 | #·This·originates·from·X11R5·(mit/util/scripts/install.sh),·which·was |
| 5 | #·later·released·in·X11R6·(xc/config/util/install.sh)·with·the |
| 6 | #·following·copyright·and·license. |
| 7 | # |
| 8 | #·Copyright·(C)·1994·X·Consortium |
| 9 | # |
| 10 | #·Permission·is·hereby·granted,·free·of·charge,·to·any·person·obtaining·a·copy |
| 11 | #·of·this·software·and·associated·documentation·files·(the·"Software"),·to |
| 12 | #·deal·in·the·Software·without·restriction,·including·without·limitation·the |
| 13 | #·rights·to·use,·copy,·modify,·merge,·publish,·distribute,·sublicense,·and/or |
| 14 | #·sell·copies·of·the·Software,·and·to·permit·persons·to·whom·the·Software·is |
| 15 | #·furnished·to·do·so,·subject·to·the·following·conditions: |
| 16 | # |
| 17 | #·The·above·copyright·notice·and·this·permission·notice·shall·be·included·in |
| 18 | #·all·copies·or·substantial·portions·of·the·Software. |
| 19 | # |
| 20 | #·THE·SOFTWARE·IS·PROVIDED·"AS·IS",·WITHOUT·WARRANTY·OF·ANY·KIND,·EXPRESS·OR |
| 21 | #·IMPLIED,·INCLUDING·BUT·NOT·LIMITED·TO·THE·WARRANTIES·OF·MERCHANTABILITY, |
| 22 | #·FITNESS·FOR·A·PARTICULAR·PURPOSE·AND·NONINFRINGEMENT.··IN·NO·EVENT·SHALL·THE |
| 23 | #·X·CONSORTIUM·BE·LIABLE·FOR·ANY·CLAIM,·DAMAGES·OR·OTHER·LIABILITY,·WHETHER·IN |
| 24 | #·AN·ACTION·OF·CONTRACT,·TORT·OR·OTHERWISE,·ARISING·FROM,·OUT·OF·OR·IN·CONNEC- |
| 25 | #·TION·WITH·THE·SOFTWARE·OR·THE·USE·OR·OTHER·DEALINGS·IN·THE·SOFTWARE. |
| 26 | # |
| 27 | #·Except·as·contained·in·this·notice,·the·name·of·the·X·Consortium·shall·not |
| 28 | #·be·used·in·advertising·or·otherwise·to·promote·the·sale,·use·or·other·deal- |
| 29 | #·ings·in·this·Software·without·prior·written·authorization·from·the·X·Consor- |
| 30 | #·tium. |
| 31 | # |
| 32 | # |
| 33 | #·FSF·changes·to·this·file·are·in·the·public·domain. |
| 34 | # |
| 35 | #·Calling·this·script·install-sh·is·preferred·over·install.sh,·to·prevent |
| 36 | #·'make'·implicit·rules·from·creating·a·file·called·install·from·it |
| 37 | #·when·there·is·no·Makefile. |
| 38 | # |
| 39 | #·This·script·is·compatible·with·the·BSD·install·script,·but·was·written |
| 40 | #·from·scratch. |
| |
| 41 | tab='» ' |
| 42 | nl=' |
| 43 | ' |
| 44 | IFS="·$tab$nl" |
| |
| 45 | #·Set·DOITPROG·to·"echo"·to·test·this·script. |
| |
| 46 | doit=${DOITPROG-} |
| 47 | doit_exec=${doit:-exec} |
| |
| 48 | #·Put·in·absolute·file·names·if·you·don't·have·them·in·your·path; |
| 49 | #·or·use·environment·vars. |
| |
| 50 | chgrpprog=${CHGRPPROG-chgrp} |
| 51 | chmodprog=${CHMODPROG-chmod} |
| 52 | chownprog=${CHOWNPROG-chown} |
| 53 | cmpprog=${CMPPROG-cmp} |
| 54 | cpprog=${CPPROG-cp} |
| 55 | mkdirprog=${MKDIRPROG-mkdir} |
| 56 | mvprog=${MVPROG-mv} |
| 57 | rmprog=${RMPROG-rm} |
| 58 | stripprog=${STRIPPROG-strip} |
| |
| 59 | posix_mkdir= |
| |
| 60 | #·Desired·mode·of·installed·file. |
| 61 | mode=0755 |
| |
| 62 | #·Create·dirs·(including·intermediate·dirs)·using·mode·755. |
| 63 | #·This·is·like·GNU·'install'·as·of·coreutils·8.32·(2020). |
| 64 | mkdir_umask=22 |
| |
| 65 | backupsuffix= |
| 66 | chgrpcmd= |
| 67 | chmodcmd=$chmodprog |
| 68 | chowncmd= |
| 69 | mvcmd=$mvprog |
| 70 | rmcmd="$rmprog·-f" |
| 71 | stripcmd= |
| |
| 72 | src= |
| 73 | dst= |
| 74 | dir_arg= |
| 75 | dst_arg= |
| |
| 76 | copy_on_change=false |
| 77 | is_target_a_directory=possibly |
| |
| 78 | usage="\ |
| 79 | Usage:·$0·[OPTION]...·[-T]·SRCFILE·DSTFILE |
| 80 | ···or:·$0·[OPTION]...·SRCFILES...·DIRECTORY |
| 81 | ···or:·$0·[OPTION]...·-t·DIRECTORY·SRCFILES... |
| 82 | ···or:·$0·[OPTION]...·-d·DIRECTORIES... |
| |
| 83 | In·the·1st·form,·copy·SRCFILE·to·DSTFILE. |
| 84 | In·the·2nd·and·3rd,·copy·all·SRCFILES·to·DIRECTORY. |
| 85 | In·the·4th,·create·DIRECTORIES. |
| |
| 86 | Options: |
| 87 | ·····--help·····display·this·help·and·exit. |
| 88 | ·····--version··display·version·info·and·exit. |
| |
| 89 | ··-c············(ignored) |
| 90 | ··-C············install·only·if·different·(preserve·data·modification·time) |
| 91 | ··-d············create·directories·instead·of·installing·files. |
| 92 | ··-g·GROUP······$chgrpprog·installed·files·to·GROUP. |
| 93 | ··-m·MODE·······$chmodprog·installed·files·to·MODE. |
| 94 | ··-o·USER·······$chownprog·installed·files·to·USER. |
| 95 | ··-p············pass·-p·to·$cpprog. |
| 96 | ··-s············$stripprog·installed·files. |
| 97 | ··-S·SUFFIX·····attempt·to·back·up·existing·files,·with·suffix·SUFFIX. |
| 98 | ··-t·DIRECTORY··install·into·DIRECTORY. |
| 99 | ··-T············report·an·error·if·DSTFILE·is·a·directory. |
| |
| 100 | Environment·variables·override·the·default·commands: |
| 101 | ··CHGRPPROG·CHMODPROG·CHOWNPROG·CMPPROG·CPPROG·MKDIRPROG·MVPROG |
| 102 | ··RMPROG·STRIPPROG |
| |
| 103 | By·default,·rm·is·invoked·with·-f;·when·overridden·with·RMPROG, |
| 104 | it's·up·to·you·to·specify·-f·if·you·want·it. |
| |
| 105 | If·-S·is·not·specified,·no·backups·are·attempted. |
| |
| 106 | Email·bug·reports·to·bug-automake@gnu.org. |
| 107 | Automake·home·page:·https://www.gnu.org/software/automake/ |
| 108 | " |
| |
| 109 | while·test·$#·-ne·0;·do |
| 110 | ··case·$1·in |
| 111 | ····-c)·;; |
| |
| 112 | ····-C)·copy_on_change=true;; |
| |
| 113 | ····-d)·dir_arg=true;; |
| |
| 114 | ····-g)·chgrpcmd="$chgrpprog·$2" |
| 115 | ········shift;; |
| |
| 116 | ····--help)·echo·"$usage";·exit·$?;; |
| |
| 117 | ····-m)·mode=$2 |
| 118 | ········case·$mode·in |
| 119 | ··········*'·'*·|·*"$tab"*·|·*"$nl"*·|·*'*'*·|·*'?'*·|·*'['*) |
| 120 | ············echo·"$0:·invalid·mode:·$mode"·>&2 |
| 121 | ············exit·1;; |
| 122 | ········esac |
| 123 | ········shift;; |
| |
| 124 | ····-o)·chowncmd="$chownprog·$2" |
| 125 | ········shift;; |
| |
| 126 | ····-p)·cpprog="$cpprog·-p";; |
| |
| 127 | ····-s)·stripcmd=$stripprog;; |
| |
| 128 | ····-S)·backupsuffix="$2" |
| 129 | ········shift;; |
| |
| 130 | ····-t) |
| 131 | ········is_target_a_directory=always |
| 132 | ········dst_arg=$2 |
| 133 | ········#·Protect·names·problematic·for·'test'·and·other·utilities. |
| 134 | ········case·$dst_arg·in |
| 135 | ··········-*·|·[=\(\)!])·dst_arg=./$dst_arg;; |
| 136 | ········esac |
| 137 | ········shift;; |
| |
| 138 | ····-T)·is_target_a_directory=never;; |
| |
| 139 | ····--version)·echo·"$0·$scriptversion";·exit·$?;; |
| |
| 140 | ····--)·shift |
| 141 | ········break;; |
| |
| 142 | ····-*)·echo·"$0:·invalid·option:·$1"·>&2 |
| 143 | ········exit·1;; |
| |
| 144 | ····*)··break;; |
| 145 | ··esac |
| 146 | ··shift |
| 147 | done |
| |
| 148 | #·We·allow·the·use·of·options·-d·and·-T·together,·by·making·-d |
| 149 | #·take·the·precedence;·this·is·for·compatibility·with·GNU·install. |
| |
| 150 | if·test·-n·"$dir_arg";·then |
| 151 | ··if·test·-n·"$dst_arg";·then |
| 152 | ····echo·"$0:·target·directory·not·allowed·when·installing·a·directory."·>&2 |
| 153 | ····exit·1 |
| 154 | ··fi |
| 155 | fi |
| |
| 156 | if·test·$#·-ne·0·&&·test·-z·"$dir_arg$dst_arg";·then |
| 157 | ··#·When·-d·is·used,·all·remaining·arguments·are·directories·to·create. |
| 158 | ··#·When·-t·is·used,·the·destination·is·already·specified. |
| 159 | ··#·Otherwise,·the·last·argument·is·the·destination.··Remove·it·from·$@. |
| 160 | ··for·arg |
| 161 | ··do |
| 162 | ····if·test·-n·"$dst_arg";·then |
| 163 | ······#·$@·is·not·empty:·it·contains·at·least·$arg. |
| 164 | ······set·fnord·"$@"·"$dst_arg" |
| 165 | ······shift·#·fnord |
| 166 | ····fi |
| 167 | ····shift·#·arg |
| 168 | ····dst_arg=$arg |
| 169 | ····#·Protect·names·problematic·for·'test'·and·other·utilities. |
| 170 | ····case·$dst_arg·in |
| 171 | ······-*·|·[=\(\)!])·dst_arg=./$dst_arg;; |
| 172 | ····esac |
| 173 | ··done |
| 174 | fi |
| |
| 175 | if·test·$#·-eq·0;·then |
| 176 | ··if·test·-z·"$dir_arg";·then |
| 177 | ····echo·"$0:·no·input·file·specified."·>&2 |
| 178 | ····exit·1 |
| 179 | ··fi |
| 180 | ··#·It's·OK·to·call·'install-sh·-d'·without·argument. |
| 181 | ··#·This·can·happen·when·creating·conditional·directories. |
| 182 | ··exit·0 |
| 183 | fi |
| |
| 184 | if·test·-z·"$dir_arg";·then |
| 185 | ··if·test·$#·-gt·1·||·test·"$is_target_a_directory"·=·always;·then |
| 186 | ····if·test·!·-d·"$dst_arg";·then |
| 187 | ······echo·"$0:·$dst_arg:·Is·not·a·directory."·>&2 |
| 188 | ······exit·1 |
| 189 | ····fi |
| 190 | ··fi |
| 191 | fi |
| |
| 192 | if·test·-z·"$dir_arg";·then |
| 193 | ··do_exit='(exit·$ret);·exit·$ret' |
| 194 | ··trap·"ret=129;·$do_exit"·1 |
| 195 | ··trap·"ret=130;·$do_exit"·2 |
| 196 | ··trap·"ret=141;·$do_exit"·13 |
| 197 | ··trap·"ret=143;·$do_exit"·15 |
| |
| 198 | ··#·Set·umask·so·as·not·to·create·temps·with·too-generous·modes. |
| 199 | ··#·However,·'strip'·requires·both·read·and·write·access·to·temps. |
| 200 | ··case·$mode·in |
| 201 | ····#·Optimize·common·cases. |
| 202 | ····*644)·cp_umask=133;; |
| 203 | ····*755)·cp_umask=22;; |
| |
| 204 | ····*[0-7]) |
| 205 | ······if·test·-z·"$stripcmd";·then |
| 206 | ········u_plus_rw= |
| 207 | ······else |
| 208 | ········u_plus_rw='%·200' |
| 209 | ······fi |
| 210 | ······cp_umask=`expr·'('·777·-·$mode·%·1000·')'·$u_plus_rw`;; |
| 211 | ····*) |
| 212 | ······if·test·-z·"$stripcmd";·then |
| 213 | ········u_plus_rw= |
| 214 | ······else |
| 215 | ········u_plus_rw=,u+rw |
| 216 | ······fi |
| 217 | ······cp_umask=$mode$u_plus_rw;; |
| 218 | ··esac |
| 219 | fi |
| |
| 220 | for·src |
| 221 | do |
| 222 | ··#·Protect·names·problematic·for·'test'·and·other·utilities. |
| 223 | ··case·$src·in |
| 224 | ····-*·|·[=\(\)!])·src=./$src;; |
| 225 | ··esac |
| |
| 226 | ··if·test·-n·"$dir_arg";·then |
| 227 | ····dst=$src |
| 228 | ····dstdir=$dst |
| 229 | ····test·-d·"$dstdir" |
| 230 | ····dstdir_status=$? |
| 231 | ····#·Don't·chown·directories·that·already·exist. |
| 232 | ····if·test·$dstdir_status·=·0;·then |
| 233 | ······chowncmd="" |
| 234 | ····fi |
| 235 | ··else |
| |
| 236 | ····#·Waiting·for·this·to·be·detected·by·the·"$cpprog·$src·$dsttmp"·command |
| 237 | ····#·might·cause·directories·to·be·created,·which·would·be·especially·bad |
| 238 | ····#·if·$src·(and·thus·$dsttmp)·contains·'*'. |
| 239 | ····if·test·!·-f·"$src"·&&·test·!·-d·"$src";·then |
| 240 | ······echo·"$0:·$src·does·not·exist."·>&2 |
| 241 | ······exit·1 |
| 242 | ····fi |
| |
| 243 | ····if·test·-z·"$dst_arg";·then |
| 244 | ······echo·"$0:·no·destination·specified."·>&2 |
| 245 | ······exit·1 |
| 246 | ····fi |
| 247 | ····dst=$dst_arg |
| |
| 248 | ····#·If·destination·is·a·directory,·append·the·input·filename. |
| 249 | ····if·test·-d·"$dst";·then |
| 250 | ······if·test·"$is_target_a_directory"·=·never;·then |
| 251 | ········echo·"$0:·$dst_arg:·Is·a·directory"·>&2 |
| 252 | ········exit·1 |
| 253 | ······fi |
| 254 | ······dstdir=$dst |
| 255 | ······dstbase=`basename·"$src"` |
| 256 | ······case·$dst·in |
| 257 | » */)·dst=$dst$dstbase;; |
| 258 | » *)··dst=$dst/$dstbase;; |
| 259 | ······esac |
| 260 | ······dstdir_status=0 |
| 261 | ····else |
| 262 | ······dstdir=`dirname·"$dst"` |
| 263 | ······test·-d·"$dstdir" |
| 264 | ······dstdir_status=$? |
| 265 | ····fi |
| 266 | ··fi |
| |
| 267 | ··case·$dstdir·in |
| 268 | ····*/)·dstdirslash=$dstdir;; |
| 269 | ····*)··dstdirslash=$dstdir/;; |
| 270 | ··esac |
| |
| 271 | ··obsolete_mkdir_used=false |
| |
| 272 | ··if·test·$dstdir_status·!=·0;·then |
| 273 | ····case·$posix_mkdir·in |
| 274 | ······'') |
| 275 | ········#·With·-d,·create·the·new·directory·with·the·user-specified·mode. |
| 276 | ········#·Otherwise,·rely·on·$mkdir_umask. |
| 277 | ········if·test·-n·"$dir_arg";·then |
| 278 | ··········mkdir_mode=-m$mode |
| 279 | ········else |
| 280 | ··········mkdir_mode= |
| 281 | ········fi |
| |
| 282 | ········posix_mkdir=false |
| 283 | » #·The·$RANDOM·variable·is·not·portable·(e.g.,·dash).··Use·it |
| 284 | » #·here·however·when·possible·just·to·lower·collision·chance. |
| 285 | » tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ |
| |
| 286 | » trap·' |
| 287 | » ··ret=$? |
| 288 | » ··rmdir·"$tmpdir/a/b"·"$tmpdir/a"·"$tmpdir"·2>/dev/null |
| 289 | » ··exit·$ret |
| 290 | » '·0 |
| |
| 291 | » #·Because·"mkdir·-p"·follows·existing·symlinks·and·we·likely·work |
| 292 | » #·directly·in·world-writeable·/tmp,·make·sure·that·the·'$tmpdir' |
| 293 | » #·directory·is·successfully·created·first·before·we·actually·test |
| 294 | » #·'mkdir·-p'. |
| 295 | » if·(umask·$mkdir_umask·&& |
| 296 | » ····$mkdirprog·$mkdir_mode·"$tmpdir"·&& |
| 297 | » ····exec·$mkdirprog·$mkdir_mode·-p·--·"$tmpdir/a/b")·>/dev/null·2>&1 |
| 298 | » then |
| 299 | » ··if·test·-z·"$dir_arg"·||·{ |
| 300 | » ·······#·Check·for·POSIX·incompatibilities·with·-m. |
| 301 | » ·······#·HP-UX·11.23·and·IRIX·6.5·mkdir·-m·-p·sets·group-·or |
| 302 | » ·······#·other-writable·bit·of·parent·directory·when·it·shouldn't. |
| 303 | » ·······#·FreeBSD·6.1·mkdir·-m·-p·sets·mode·of·existing·directory. |
| 304 | » ·······test_tmpdir="$tmpdir/a" |
| 305 | » ·······ls_ld_tmpdir=`ls·-ld·"$test_tmpdir"` |
| 306 | » ·······case·$ls_ld_tmpdir·in |
| 307 | » » ·d????-?r-*)·different_mode=700;; |
| 308 | » » ·d????-?--*)·different_mode=755;; |
| 309 | » » ·*)·false;; |
| 310 | » ·······esac·&& |
| 311 | » ·······$mkdirprog·-m$different_mode·-p·--·"$test_tmpdir"·&&·{ |
| 312 | » » ·ls_ld_tmpdir_1=`ls·-ld·"$test_tmpdir"` |
| 313 | » » ·test·"$ls_ld_tmpdir"·=·"$ls_ld_tmpdir_1" |
| 314 | » ·······} |
| 315 | » ·····} |
| 316 | » ··then·posix_mkdir=: |
| 317 | » ··fi |
| 318 | » ··rmdir·"$tmpdir/a/b"·"$tmpdir/a"·"$tmpdir" |
| 319 | » else |
| 320 | » ··#·Remove·any·dirs·left·behind·by·ancient·mkdir·implementations. |
| 321 | » ··rmdir·./$mkdir_mode·./-p·./--·"$tmpdir"·2>/dev/null |
| 322 | » fi |
| 323 | » trap·''·0;; |
| 324 | ····esac |
| |
| 325 | ····if |
| 326 | ······$posix_mkdir·&&·( |
| 327 | ········umask·$mkdir_umask·&& |
| 328 | ········$doit_exec·$mkdirprog·$mkdir_mode·-p·--·"$dstdir" |
| 329 | ······) |
| 330 | ····then·: |
| 331 | ····else |
| |
| 332 | ······#·mkdir·does·not·conform·to·POSIX, |
| 333 | ······#·or·it·failed·possibly·due·to·a·race·condition.··Create·the |
| 334 | ······#·directory·the·slow·way,·step·by·step,·checking·for·races·as·we·go. |
| |
| 335 | ······case·$dstdir·in |
| 336 | ········/*)·prefix='/';; |
| 337 | ········[-=\(\)!]*)·prefix='./';; |
| 338 | ········*)··prefix='';; |
| 339 | ······esac |
| |
| 340 | ······oIFS=$IFS |
| 341 | ······IFS=/ |
| 342 | ······set·-f |
| 343 | ······set·fnord·$dstdir |
| 344 | ······shift |
| 345 | ······set·+f |
| 346 | ······IFS=$oIFS |
| |
| 347 | ······prefixes= |
| |
| 348 | ······for·d |
| 349 | ······do |
| 350 | ········test·X"$d"·=·X·&&·continue |
| |
| 351 | ········prefix=$prefix$d |
| 352 | ········if·test·-d·"$prefix";·then |
| 353 | ··········prefixes= |
| 354 | ········else |
| 355 | ··········if·$posix_mkdir;·then |
| 356 | ············(umask·$mkdir_umask·&& |
| 357 | ·············$doit_exec·$mkdirprog·$mkdir_mode·-p·--·"$dstdir")·&&·break |
| 358 | ············#·Don't·fail·if·two·instances·are·running·concurrently. |
| 359 | ············test·-d·"$prefix"·||·exit·1 |
| 360 | ··········else |
| 361 | ············case·$prefix·in |
| 362 | ··············*\'*)·qprefix=`echo·"$prefix"·|·sed·"s/'/'\\\\\\\\''/g"`;; |
| 363 | ··············*)·qprefix=$prefix;; |
| 364 | ············esac |
| 365 | ············prefixes="$prefixes·'$qprefix'" |
| 366 | ··········fi |
| 367 | ········fi |
| 368 | ········prefix=$prefix/ |
| 369 | ······done |
| |
| 370 | ······if·test·-n·"$prefixes";·then |
| 371 | ········#·Don't·fail·if·two·instances·are·running·concurrently. |
| 372 | ········(umask·$mkdir_umask·&& |
| 373 | ·········eval·"\$doit_exec·\$mkdirprog·$prefixes")·|| |
| 374 | ··········test·-d·"$dstdir"·||·exit·1 |
| 375 | ········obsolete_mkdir_used=true |
| 376 | ······fi |
| 377 | ····fi |
| 378 | ··fi |
| |
| 379 | ··if·test·-n·"$dir_arg";·then |
| 380 | ····{·test·-z·"$chowncmd"·||·$doit·$chowncmd·"$dst";·}·&& |
| 381 | ····{·test·-z·"$chgrpcmd"·||·$doit·$chgrpcmd·"$dst";·}·&& |
| 382 | ····{·test·"$obsolete_mkdir_used$chowncmd$chgrpcmd"·=·false·|| |
| 383 | ······test·-z·"$chmodcmd"·||·$doit·$chmodcmd·$mode·"$dst";·}·||·exit·1 |
| 384 | ··else |
| |
| 385 | ····#·Make·a·couple·of·temp·file·names·in·the·proper·directory. |
| 386 | ····dsttmp=${dstdirslash}_inst.$$_ |
| 387 | ····rmtmp=${dstdirslash}_rm.$$_ |
| |
| 388 | ····#·Trap·to·clean·up·those·temp·files·at·exit. |
| 389 | ····trap·'ret=$?;·rm·-f·"$dsttmp"·"$rmtmp"·&&·exit·$ret'·0 |
| |
| 390 | ····#·Copy·the·file·name·to·the·temp·name. |
| 391 | ····(umask·$cp_umask·&& |
| 392 | ·····{·test·-z·"$stripcmd"·||·{ |
| 393 | » ·#·Create·$dsttmp·read-write·so·that·cp·doesn't·create·it·read-only, |
| 394 | » ·#·which·would·cause·strip·to·fail. |
| 395 | » ·if·test·-z·"$doit";·then |
| 396 | » ···:·>"$dsttmp"·#·No·need·to·fork-exec·'touch'. |
| 397 | » ·else |
| 398 | » ···$doit·touch·"$dsttmp" |
| 399 | » ·fi |
| 400 | ·······} |
| 401 | ·····}·&& |
| 402 | ·····$doit_exec·$cpprog·"$src"·"$dsttmp")·&& |
| |
| 403 | ····#·and·set·any·options;·do·chmod·last·to·preserve·setuid·bits. |
| 404 | ····# |
| 405 | ····#·If·any·of·these·fail,·we·abort·the·whole·thing.··If·we·want·to |
| 406 | ····#·ignore·errors·from·any·of·these,·just·make·sure·not·to·ignore |
| 407 | ····#·errors·from·the·above·"$doit·$cpprog·$src·$dsttmp"·command. |
| 408 | ····# |
| 409 | ····{·test·-z·"$chowncmd"·||·$doit·$chowncmd·"$dsttmp";·}·&& |
| 410 | ····{·test·-z·"$chgrpcmd"·||·$doit·$chgrpcmd·"$dsttmp";·}·&& |
| 411 | ····{·test·-z·"$stripcmd"·||·$doit·$stripcmd·"$dsttmp";·}·&& |
| 412 | ····{·test·-z·"$chmodcmd"·||·$doit·$chmodcmd·$mode·"$dsttmp";·}·&& |
| |
| 413 | ····#·If·-C,·don't·bother·to·copy·if·it·wouldn't·change·the·file. |
| 414 | ····if·$copy_on_change·&& |
| 415 | ·······old=`LC_ALL=C·ls·-dlL·"$dst"·····2>/dev/null`·&& |
| 416 | ·······new=`LC_ALL=C·ls·-dlL·"$dsttmp"··2>/dev/null`·&& |
| 417 | ·······set·-f·&& |
| 418 | ·······set·X·$old·&&·old=:$2:$4:$5:$6·&& |
| 419 | ·······set·X·$new·&&·new=:$2:$4:$5:$6·&& |
| 420 | ·······set·+f·&& |
| 421 | ·······test·"$old"·=·"$new"·&& |
| 422 | ·······$cmpprog·"$dst"·"$dsttmp"·>/dev/null·2>&1 |
| 423 | ····then |
| 424 | ······rm·-f·"$dsttmp" |
| 425 | ····else |
| 426 | ······#·If·$backupsuffix·is·set,·and·the·file·being·installed |
| 427 | ······#·already·exists,·attempt·a·backup.··Don't·worry·if·it·fails, |
| 428 | ······#·e.g.,·if·mv·doesn't·support·-f. |
| 429 | ······if·test·-n·"$backupsuffix"·&&·test·-f·"$dst";·then |
| 430 | ········$doit·$mvcmd·-f·"$dst"·"$dst$backupsuffix"·2>/dev/null |
| 431 | ······fi |
| |
| 432 | ······#·Rename·the·file·to·the·real·destination. |
| 433 | ······$doit·$mvcmd·-f·"$dsttmp"·"$dst"·2>/dev/null·|| |
| |
| 434 | ······#·The·rename·failed,·perhaps·because·mv·can't·rename·something·else |
| 435 | ······#·to·itself,·or·perhaps·because·mv·is·so·ancient·that·it·does·not |
| 436 | ······#·support·-f. |
| 437 | ······{ |
| 438 | ········#·Now·remove·or·move·aside·any·old·file·at·destination·location. |
| 439 | ········#·We·try·this·two·ways·since·rm·can't·unlink·itself·on·some |
| 440 | ········#·systems·and·the·destination·file·might·be·busy·for·other |
| 441 | ········#·reasons.··In·this·case,·the·final·cleanup·might·fail·but·the·new |
| 442 | ········#·file·should·still·install·successfully. |
| 443 | ········{ |
| 444 | ··········test·!·-f·"$dst"·|| |
| 445 | ··········$doit·$rmcmd·"$dst"·2>/dev/null·|| |
| 446 | ··········{·$doit·$mvcmd·-f·"$dst"·"$rmtmp"·2>/dev/null·&& |
| 447 | ············{·$doit·$rmcmd·"$rmtmp"·2>/dev/null;·:;·} |
| 448 | ··········}·|| |
| 449 | ··········{·echo·"$0:·cannot·unlink·or·rename·$dst"·>&2 |
| 450 | ············(exit·1);·exit·1 |
| 451 | ··········} |
| 452 | ········}·&& |
| |
| 453 | ········#·Now·rename·the·file·to·the·real·destination. |
| 454 | ········$doit·$mvcmd·"$dsttmp"·"$dst" |
| 455 | ······} |
| 456 | ····fi·||·exit·1 |
| |
| 457 | ····trap·''·0 |
| 458 | ··fi |
| 459 | done |
| |
| 460 | #·Local·variables: |
| 461 | #·eval:·(add-hook·'before-save-hook·'time-stamp) |
| 462 | #·time-stamp-start:·"scriptversion=" |
| 463 | #·time-stamp-format:·"%:y-%02m-%02d.%02H" |
| 464 | #·time-stamp-time-zone:·"UTC0" |
| 465 | #·time-stamp-end:·";·#·UTC" |
| 466 | #·End: |