.\" Automatically generated by Pod::Man 4.10 (Pod::Simple 3.35) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Lintian::Util 3" .TH Lintian::Util 3 "2021-02-01" "Lintian v2.104.0~bpo10+1" "Debian Package Checker" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Lintian::Util \- Lintian utility functions .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& use Lintian::Util; .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This module contains a number of utility subs that are nice to have, but on their own did not warrant their own module. .PP Most subs are imported only on request. .SH "VARIABLES" .IX Header "VARIABLES" .ie n .IP "$PKGNAME_REGEX" 4 .el .IP "\f(CW$PKGNAME_REGEX\fR" 4 .IX Item "$PKGNAME_REGEX" Regular expression that matches valid package names. The expression is not anchored and does not enforce any \*(L"boundary\*(R" characters. .ie n .IP "$PKGREPACK_REGEX" 4 .el .IP "\f(CW$PKGREPACK_REGEX\fR" 4 .IX Item "$PKGREPACK_REGEX" Regular expression that matches \*(L"repacked\*(R" package names. The expression is not anchored and does not enforce any \*(L"boundary\*(R" characters. It should only be applied to the upstream portion (see #931846). .ie n .IP "$PKGVERSION_REGEX" 4 .el .IP "\f(CW$PKGVERSION_REGEX\fR" 4 .IX Item "$PKGVERSION_REGEX" Regular expression that matches valid package versions. The expression is not anchored and does not enforce any \*(L"boundary\*(R" characters. .SH "FUNCTIONS" .IX Header "FUNCTIONS" .IP "drain_pipe(\s-1FD\s0)" 4 .IX Item "drain_pipe(FD)" Reads and discards any remaining contents from \s-1FD,\s0 which is assumed to be a pipe. This is mostly done to avoid having the \*(L"write\*(R"\-end die with a \s-1SIGPIPE\s0 due to a \*(L"broken pipe\*(R" (which can happen if you just close the pipe). .Sp May cause an exception if there are issues reading from the pipe. .Sp Caveat: This will block until the pipe is closed from the \*(L"write\*(R"\-end, so only use it with pipes where the \*(L"write\*(R"\-end will eventually close their end by themselves (or something else will make them close it). .IP "get_file_digest(\s-1ALGO, FILE\s0)" 4 .IX Item "get_file_digest(ALGO, FILE)" Creates an \s-1ALGO\s0 digest object that is seeded with the contents of \&\s-1FILE.\s0 If you just want the hex digest, please use \&\*(L"get_file_checksum(\s-1ALGO, FILE\s0)\*(R" instead. .Sp \&\s-1ALGO\s0 can be 'md5' or shaX, where X is any number supported by Digest::SHA (e.g. 'sha256'). .Sp This sub is a convenience wrapper around Digest::{\s-1MD5,SHA\s0}. .IP "get_file_checksum(\s-1ALGO, FILE\s0)" 4 .IX Item "get_file_checksum(ALGO, FILE)" Returns a hexadecimal string of the message digest checksum generated by the algorithm \s-1ALGO\s0 on \s-1FILE.\s0 .Sp \&\s-1ALGO\s0 can be 'md5' or shaX, where X is any number supported by Digest::SHA (e.g. 'sha256'). .Sp This sub is a convenience wrapper around Digest::{\s-1MD5,SHA\s0}. .IP "perm2oct(\s-1PERM\s0)" 4 .IX Item "perm2oct(PERM)" Translates \s-1PERM\s0 to an octal permission. \s-1PERM\s0 should be a string describing the permissions as done by \fItar t\fR or \fIls \-l\fR. That is, it should be a string like \*(L"\-rw\-r\*(--r\-\-\*(R". .Sp If the string does not appear to be a valid permission, it will cause a trappable error. .Sp Examples: .Sp .Vb 3 \& # Good \& perm2oct(\*(Aq\-rw\-r\-\-r\-\-\*(Aq) == 0644 \& perm2oct(\*(Aq\-rwxr\-xr\-x\*(Aq) == 0755 \& \& # Bad \& perm2oct(\*(Aqbroken\*(Aq) # too short to be recognised \& perm2oct(\*(Aq\-resurunet\*(Aq) # contains unknown permissions .Ve .IP "human_bytes(\s-1SIZE\s0)" 4 .IX Item "human_bytes(SIZE)" .PD 0 .IP "open_gz (\s-1FILE\s0)" 4 .IX Item "open_gz (FILE)" .PD Opens a handle that reads from the GZip compressed \s-1FILE.\s0 .Sp On failure, this sub emits a trappable error. .Sp Note: The handle may be a pipe from an external processes. .IP "locate_executable (\s-1CMD\s0)" 4 .IX Item "locate_executable (CMD)" .PD 0 .IP "drop_relative_prefix(\s-1STRING\s0)" 4 .IX Item "drop_relative_prefix(STRING)" .PD Remove an initial ./ from \s-1STRING,\s0 if present .IP "version_from_changelog" 4 .IX Item "version_from_changelog" .PD 0 .IP "normalize_pkg_path(\s-1PATH\s0)" 4 .IX Item "normalize_pkg_path(PATH)" .PD Normalize \s-1PATH\s0 by removing superfluous path segments. \s-1PATH\s0 is assumed to be relative the package root. Note that the result will never start nor end with a slash, even if \s-1PATH\s0 does. .Sp As the name suggests, this is a path \*(L"normalization\*(R" rather than a true path resolution (for that use Cwd::realpath). Particularly, it assumes none of the path segments are symlinks. .Sp normalize_pkg_path will return \f(CW\*(C`q{}\*(C'\fR (i.e. the empty string) if \s-1PATH\s0 is normalized to the root dir and \f(CW\*(C`undef\*(C'\fR if the path cannot be normalized without escaping the package root. .IP "normalize_link_target(\s-1CURDIR, LINK_TARGET\s0)" 4 .IX Item "normalize_link_target(CURDIR, LINK_TARGET)" Normalize the path obtained by following a link with \s-1LINK_TARGET\s0 as its target from \s-1CURDIR\s0 as the current directory. \s-1CURDIR\s0 is assumed to be relative to the package root. Note that the result will never start nor end with a slash, even if \s-1CURDIR\s0 or \s-1DEST\s0 does. .Sp normalize_pkg_path will return \f(CW\*(C`q{}\*(C'\fR (i.e. the empty string) if the target is the root dir and \f(CW\*(C`undef\*(C'\fR if the path cannot be normalized without escaping the package root. .Sp \&\fB\s-1CAVEAT\s0\fR: This function is \fInot always sufficient\fR to test if it is safe to open a given symlink. Use is_ancestor_of for that. If you must use this function, remember to check that the target is not a symlink (or if it is, that it can be resolved safely). .IP "is_ancestor_of(\s-1PARENTDIR, PATH\s0)" 4 .IX Item "is_ancestor_of(PARENTDIR, PATH)" Returns true if and only if \s-1PATH\s0 is \s-1PARENTDIR\s0 or a path stored somewhere within \s-1PARENTDIR\s0 (or its subdirs). .Sp This function will resolve the paths; any failure to resolve the path will cause a trappable error. .IP "read_md5sums" 4 .IX Item "read_md5sums" .PD 0 .IP "unescape_md5sum_filename" 4 .IX Item "unescape_md5sum_filename" .PD .SH "SEE ALSO" .IX Header "SEE ALSO" \&\fBlintian\fR\|(1)