1*6236dae4SAndroid Build Coastguard Worker#!/usr/bin/env perl 2*6236dae4SAndroid Build Coastguard Worker#*************************************************************************** 3*6236dae4SAndroid Build Coastguard Worker# _ _ ____ _ 4*6236dae4SAndroid Build Coastguard Worker# Project ___| | | | _ \| | 5*6236dae4SAndroid Build Coastguard Worker# / __| | | | |_) | | 6*6236dae4SAndroid Build Coastguard Worker# | (__| |_| | _ <| |___ 7*6236dae4SAndroid Build Coastguard Worker# \___|\___/|_| \_\_____| 8*6236dae4SAndroid Build Coastguard Worker# 9*6236dae4SAndroid Build Coastguard Worker# Copyright (C) Daniel Stenberg, <[email protected]>, et al. 10*6236dae4SAndroid Build Coastguard Worker# 11*6236dae4SAndroid Build Coastguard Worker# This software is licensed as described in the file COPYING, which 12*6236dae4SAndroid Build Coastguard Worker# you should have received as part of this distribution. The terms 13*6236dae4SAndroid Build Coastguard Worker# are also available at https://curl.se/docs/copyright.html. 14*6236dae4SAndroid Build Coastguard Worker# 15*6236dae4SAndroid Build Coastguard Worker# You may opt to use, copy, modify, merge, publish, distribute and/or sell 16*6236dae4SAndroid Build Coastguard Worker# copies of the Software, and permit persons to whom the Software is 17*6236dae4SAndroid Build Coastguard Worker# furnished to do so, under the terms of the COPYING file. 18*6236dae4SAndroid Build Coastguard Worker# 19*6236dae4SAndroid Build Coastguard Worker# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 20*6236dae4SAndroid Build Coastguard Worker# KIND, either express or implied. 21*6236dae4SAndroid Build Coastguard Worker# 22*6236dae4SAndroid Build Coastguard Worker# SPDX-License-Identifier: curl 23*6236dae4SAndroid Build Coastguard Worker# 24*6236dae4SAndroid Build Coastguard Worker########################################################################### 25*6236dae4SAndroid Build Coastguard Worker# Prepare a directory with known files and clean up afterwards 26*6236dae4SAndroid Build Coastguard Workeruse Time::Local; 27*6236dae4SAndroid Build Coastguard Worker 28*6236dae4SAndroid Build Coastguard Workerif ( $#ARGV < 1 ) 29*6236dae4SAndroid Build Coastguard Worker{ 30*6236dae4SAndroid Build Coastguard Worker print "Usage: $0 prepare|postprocess dir [logfile]\n"; 31*6236dae4SAndroid Build Coastguard Worker exit 1; 32*6236dae4SAndroid Build Coastguard Worker} 33*6236dae4SAndroid Build Coastguard Worker 34*6236dae4SAndroid Build Coastguard Worker# <precheck> expects an error message on stdout 35*6236dae4SAndroid Build Coastguard Workersub errout { 36*6236dae4SAndroid Build Coastguard Worker print $_[0] . "\n"; 37*6236dae4SAndroid Build Coastguard Worker exit 1; 38*6236dae4SAndroid Build Coastguard Worker} 39*6236dae4SAndroid Build Coastguard Worker 40*6236dae4SAndroid Build Coastguard Workerif ($ARGV[0] eq "prepare") 41*6236dae4SAndroid Build Coastguard Worker{ 42*6236dae4SAndroid Build Coastguard Worker my $dirname = $ARGV[1]; 43*6236dae4SAndroid Build Coastguard Worker mkdir $dirname || errout "$!"; 44*6236dae4SAndroid Build Coastguard Worker chdir $dirname; 45*6236dae4SAndroid Build Coastguard Worker 46*6236dae4SAndroid Build Coastguard Worker # Create the files in alphabetical order, to increase the chances 47*6236dae4SAndroid Build Coastguard Worker # of receiving a consistent set of directory contents regardless 48*6236dae4SAndroid Build Coastguard Worker # of whether the server alphabetizes the results or not. 49*6236dae4SAndroid Build Coastguard Worker mkdir "asubdir" || errout "$!"; 50*6236dae4SAndroid Build Coastguard Worker chmod 0777, "asubdir"; 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard Worker open(FILE, ">plainfile.txt") || errout "$!"; 53*6236dae4SAndroid Build Coastguard Worker binmode FILE; 54*6236dae4SAndroid Build Coastguard Worker print FILE "Test file to support curl test suite\n"; 55*6236dae4SAndroid Build Coastguard Worker close(FILE); 56*6236dae4SAndroid Build Coastguard Worker # The mtime is specifically chosen to be an even number so that it can be 57*6236dae4SAndroid Build Coastguard Worker # represented exactly on a FAT filesystem. 58*6236dae4SAndroid Build Coastguard Worker utime time, timegm(0,0,12,1,0,100), "plainfile.txt"; 59*6236dae4SAndroid Build Coastguard Worker chmod 0666, "plainfile.txt"; 60*6236dae4SAndroid Build Coastguard Worker 61*6236dae4SAndroid Build Coastguard Worker open(FILE, ">rofile.txt") || errout "$!"; 62*6236dae4SAndroid Build Coastguard Worker binmode FILE; 63*6236dae4SAndroid Build Coastguard Worker print FILE "Read-only test file to support curl test suite\n"; 64*6236dae4SAndroid Build Coastguard Worker close(FILE); 65*6236dae4SAndroid Build Coastguard Worker # The mtime is specifically chosen to be an even number so that it can be 66*6236dae4SAndroid Build Coastguard Worker # represented exactly on a FAT filesystem. 67*6236dae4SAndroid Build Coastguard Worker utime time, timegm(0,0,12,31,11,100), "rofile.txt"; 68*6236dae4SAndroid Build Coastguard Worker chmod 0444, "rofile.txt"; 69*6236dae4SAndroid Build Coastguard Worker 70*6236dae4SAndroid Build Coastguard Worker exit 0; 71*6236dae4SAndroid Build Coastguard Worker} 72*6236dae4SAndroid Build Coastguard Workerelsif ($ARGV[0] eq "postprocess") 73*6236dae4SAndroid Build Coastguard Worker{ 74*6236dae4SAndroid Build Coastguard Worker my $dirname = $ARGV[1]; 75*6236dae4SAndroid Build Coastguard Worker my $logfile = $ARGV[2]; 76*6236dae4SAndroid Build Coastguard Worker 77*6236dae4SAndroid Build Coastguard Worker # Clean up the test directory 78*6236dae4SAndroid Build Coastguard Worker unlink "$dirname/rofile.txt"; 79*6236dae4SAndroid Build Coastguard Worker unlink "$dirname/plainfile.txt"; 80*6236dae4SAndroid Build Coastguard Worker rmdir "$dirname/asubdir"; 81*6236dae4SAndroid Build Coastguard Worker 82*6236dae4SAndroid Build Coastguard Worker rmdir $dirname || die "$!"; 83*6236dae4SAndroid Build Coastguard Worker 84*6236dae4SAndroid Build Coastguard Worker if ($logfile && -s $logfile) { 85*6236dae4SAndroid Build Coastguard Worker # Process the directory file to remove all information that 86*6236dae4SAndroid Build Coastguard Worker # could be inconsistent from one test run to the next (e.g. 87*6236dae4SAndroid Build Coastguard Worker # file date) or may be unsupported on some platforms (e.g. 88*6236dae4SAndroid Build Coastguard Worker # Windows). Also, since 7.17.0, the sftp directory listing 89*6236dae4SAndroid Build Coastguard Worker # format can be dependent on the server (with a recent 90*6236dae4SAndroid Build Coastguard Worker # enough version of libssh2) so this script must also 91*6236dae4SAndroid Build Coastguard Worker # canonicalize the format. Here are examples of the general 92*6236dae4SAndroid Build Coastguard Worker # format supported: 93*6236dae4SAndroid Build Coastguard Worker # -r--r--r-- 12 ausername grp 47 Dec 31 2000 rofile.txt 94*6236dae4SAndroid Build Coastguard Worker # -r--r--r-- 1 1234 4321 47 Dec 31 2000 rofile.txt 95*6236dae4SAndroid Build Coastguard Worker # The "canonical" format is similar to the first (which is 96*6236dae4SAndroid Build Coastguard Worker # the one generated on a typical Linux installation): 97*6236dae4SAndroid Build Coastguard Worker # -r-?r-?r-? 12 U U 47 Dec 31 2000 rofile.txt 98*6236dae4SAndroid Build Coastguard Worker 99*6236dae4SAndroid Build Coastguard Worker my @canondir; 100*6236dae4SAndroid Build Coastguard Worker open(IN, "<$logfile") || die "$!"; 101*6236dae4SAndroid Build Coastguard Worker while (<IN>) { 102*6236dae4SAndroid Build Coastguard Worker /^(.)(..).(..).(..).\s*(\S+)\s+\S+\s+\S+\s+(\S+)\s+(\S+\s+\S+\s+\S+)\s+(.*)$/; 103*6236dae4SAndroid Build Coastguard Worker if ($1 eq "d") { 104*6236dae4SAndroid Build Coastguard Worker # Skip current and parent directory listing, because some SSH 105*6236dae4SAndroid Build Coastguard Worker # servers (eg. OpenSSH for Windows) are not listing those 106*6236dae4SAndroid Build Coastguard Worker if ($8 eq "." || $8 eq "..") { 107*6236dae4SAndroid Build Coastguard Worker next; 108*6236dae4SAndroid Build Coastguard Worker } 109*6236dae4SAndroid Build Coastguard Worker # Erase all directory metadata except for the name, as it is not 110*6236dae4SAndroid Build Coastguard Worker # consistent for across all test systems and filesystems 111*6236dae4SAndroid Build Coastguard Worker push @canondir, "d????????? N U U N ??? N NN:NN $8\n"; 112*6236dae4SAndroid Build Coastguard Worker } elsif ($1 eq "-") { 113*6236dae4SAndroid Build Coastguard Worker # Replace missing group and other permissions with user 114*6236dae4SAndroid Build Coastguard Worker # permissions (eg. on Windows) due to them being shown as * 115*6236dae4SAndroid Build Coastguard Worker my ($u, $g, $o) = ($2, $3, $4); 116*6236dae4SAndroid Build Coastguard Worker if($g eq "**") { 117*6236dae4SAndroid Build Coastguard Worker $g = $u; 118*6236dae4SAndroid Build Coastguard Worker } 119*6236dae4SAndroid Build Coastguard Worker if($o eq "**") { 120*6236dae4SAndroid Build Coastguard Worker $o = $u; 121*6236dae4SAndroid Build Coastguard Worker } 122*6236dae4SAndroid Build Coastguard Worker # Erase user and group names, as they are not consistent across 123*6236dae4SAndroid Build Coastguard Worker # all test systems 124*6236dae4SAndroid Build Coastguard Worker my $line = sprintf("%s%s?%s?%s?%5d U U %15d %s %s\n", $1,$u,$g,$o,$5,$6,$7,$8); 125*6236dae4SAndroid Build Coastguard Worker push @canondir, $line; 126*6236dae4SAndroid Build Coastguard Worker } else { 127*6236dae4SAndroid Build Coastguard Worker # Unexpected format; just pass it through and let the test fail 128*6236dae4SAndroid Build Coastguard Worker push @canondir, $_; 129*6236dae4SAndroid Build Coastguard Worker } 130*6236dae4SAndroid Build Coastguard Worker } 131*6236dae4SAndroid Build Coastguard Worker close(IN); 132*6236dae4SAndroid Build Coastguard Worker 133*6236dae4SAndroid Build Coastguard Worker @canondir = sort {substr($a,57) cmp substr($b,57)} @canondir; 134*6236dae4SAndroid Build Coastguard Worker my $newfile = $logfile . ".new"; 135*6236dae4SAndroid Build Coastguard Worker open(OUT, ">$newfile") || die "$!"; 136*6236dae4SAndroid Build Coastguard Worker print OUT join('', @canondir); 137*6236dae4SAndroid Build Coastguard Worker close(OUT); 138*6236dae4SAndroid Build Coastguard Worker 139*6236dae4SAndroid Build Coastguard Worker unlink $logfile; 140*6236dae4SAndroid Build Coastguard Worker rename $newfile, $logfile; 141*6236dae4SAndroid Build Coastguard Worker } 142*6236dae4SAndroid Build Coastguard Worker 143*6236dae4SAndroid Build Coastguard Worker exit 0; 144*6236dae4SAndroid Build Coastguard Worker} 145*6236dae4SAndroid Build Coastguard Workerprint "Unsupported command $ARGV[0]\n"; 146*6236dae4SAndroid Build Coastguard Workerexit 1; 147