1#!/usr/bin/perl 2# Exercise od 3 4# Copyright (C) 2006-2023 Free Software Foundation, Inc. 5 6# This program is free software: you can redistribute it and/or modify 7# it under the terms of the GNU General Public License as published by 8# the Free Software Foundation, either version 3 of the License, or 9# (at your option) any later version. 10 11# This program is distributed in the hope that it will be useful, 12# but WITHOUT ANY WARRANTY; without even the implied warranty of 13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14# GNU General Public License for more details. 15 16# You should have received a copy of the GNU General Public License 17# along with this program. If not, see <https://www.gnu.org/licenses/>. 18 19use strict; 20 21(my $program_name = $0) =~ s|.*/||; 22 23# Turn off localization of executable's output. 24@ENV{qw(LANGUAGE LANG LC_ALL)} = ('C') x 3; 25 26# Use a file in /proc whose size is not likely to 27# change between the wc and od invocations. 28my $proc_file = '/proc/version'; 29-f $proc_file 30 or $proc_file = '/dev/null'; 31 32# Count the bytes in $proc_file, _by reading_. 33my $len = 0; 34open FH, '<', $proc_file 35 or die "$program_name: can't open '$proc_file' for reading: $!\n"; 36while (defined (my $line = <FH>)) 37 { 38 $len += length $line; 39 } 40close FH; 41my $proc_file_byte_count = $len; 42 43my @Tests = 44 ( 45 # Skip the exact length of the input file. 46 # Up to coreutils-6.9, this would ignore the "-j 1". 47 ['j-bug1', '-c -j 1 -An', {IN=>{g=>'a'}}, {OUT=>''}], 48 ['j-bug2', '-c -j 2 -An', {IN=>{g=>'a'}}, {IN=>{h=>'b'}}, {OUT=>''}], 49 # Skip the sum of the lengths of the first three inputs. 50 ['j-bug3', '-c -j 3 -An', {IN=>{g=>'a'}}, {IN=>{h=>'b'}}, 51 {IN=>{i=>'c'}}, {OUT=>''}], 52 # Skip the sum of the lengths of the first three inputs, printing the 4th. 53 ['j-bug4', '-c -j 3 -An', {IN=>{g=>'a'}}, {IN=>{h=>'b'}}, 54 {IN=>{i=>'c'}}, {IN=>{j=>'d'}}, {OUT=>" d\n"}], 55 56 # Ensure that od -j doesn't fseek across a nonempty file in /proc, 57 # even if the kernel reports that the file has stat.st_size = 0. 58 ['j-proc', "-An -c -j $proc_file_byte_count $proc_file", 59 {IN=>{f2=>'e'}}, {OUT=>" e\n"}], 60 61 # Ensure that a large width does not cause trouble. 62 # From coreutils-7.0 through coreutils-8.21, these would print 63 # approximately 128KiB of padding. 64 ['wide-a', '-a -w65537 -An', {IN=>{g=>'x'}}, {OUT=>" x\n"}], 65 ['wide-c', '-c -w65537 -An', {IN=>{g=>'x'}}, {OUT=>" x\n"}], 66 ['wide-x', '-tx1 -w65537 -An', {IN=>{g=>'B'}}, {OUT=>" 42\n"}], 67 ); 68 69my $save_temps = $ENV{DEBUG}; 70my $verbose = $ENV{VERBOSE}; 71 72my $prog = 'od'; 73my $fail = run_tests ($program_name, $prog, \@Tests, $save_temps, $verbose); 74exit $fail; 75