err(EXIT_FAILURE, N_("failed to parse PID argument '%s'"), pidstr);
}
}
+
+
+#ifdef TEST_PROGRAM_PARSEPID
+
+#include <getopt.h>
+
+static void __attribute__((__noreturn__)) usage(void)
+{
+ fprintf(stdout, " %s [options] <pidstr>\n\n", program_invocation_short_name);
+ fputs(" -z, --zero allow zero (0) as value for <pidstr>\n", stdout);
+ fputs(" -n, --negative allow negative number as value for <pidstr>\n", stdout);
+
+ exit(EXIT_SUCCESS);
+}
+
+int main(int argc, char **argv)
+{
+ int c, flags = 0, rc = 0;
+ uint64_t pidfd_ino = 0;
+ pid_t pid_num = 0;
+ char *str = NULL;
+
+ static const struct option longopts[] = {
+ { "zero", 0, NULL, 'z' },
+ { "negative", 0, NULL, 'n' },
+ { "help", 0, NULL, 'h' },
+ { NULL, 0, NULL, 0 },
+ };
+
+ while((c = getopt_long(argc, argv, "nhz", longopts, NULL)) != -1) {
+ switch(c) {
+ case 'n':
+ flags |= UL_PID_NEGATIVE;
+ break;
+ case 'z':
+ flags |= UL_PID_ZERO;
+ break;
+ case 'h':
+ usage();
+ break;
+ default:
+ err(EXIT_FAILURE, "try --help");
+ }
+ }
+
+ if (optind == argc)
+ errx(EXIT_FAILURE, "missing <pidstr> argument");
+ str = argv[optind];
+
+ rc = ul_parse_pid_str(str, &pid_num, &pidfd_ino, flags);
+ if (rc)
+ err(EXIT_FAILURE, "failed to parse PID '%s'", str);
+
+ printf("PID: %d\n", pid_num);
+ if (pidfd_ino)
+ printf("inode: %"PRIu64"\n", pidfd_ino);
+
+ return EXIT_SUCCESS;
+}
+
+#endif /* TEST_PROGRAM_PARSE_PID */
--- /dev/null
+#!/bin/bash
+
+# This file is part of util-linux.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This file is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# Copyright (C) 2026 Christian Goeschel Ndjomouo <cgoesc2@wgu.edu>
+TS_TOPDIR="${0%/*}/../.."
+TS_DESC="pidutils"
+
+. "$TS_TOPDIR/functions.sh"
+ts_init "$*"
+
+ts_check_test_command "$TS_HELPER_PARSEPID"
+ts_check_test_command "$TS_HELPER_STRERROR"
+
+ts_init_subtest "flag-unset"
+
+"$TS_HELPER_PARSEPID" 1 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" 1: >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" 1:0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" 1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" -- -1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" -- -2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" '1:-122' >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" 2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" -- 0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+
+sed -i -e "s@$($TS_HELPER_STRERROR EINVAL)@EINVAL@" $TS_OUTPUT $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR ERANGE)@ERANGE@" $TS_OUTPUT $TS_ERRLOG
+
+ts_finalize_subtest
+
+ts_init_subtest "flag-zero"
+
+"$TS_HELPER_PARSEPID" --zero 1 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero 1: >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero 1:0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero 1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero -- -1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero -- -2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero '1:-122' >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero 2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero 0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR EINVAL)@EINVAL@" $TS_OUTPUT $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR ERANGE)@ERANGE@" $TS_OUTPUT $TS_ERRLOG
+
+ts_finalize_subtest
+
+ts_init_subtest "flag-negative"
+
+"$TS_HELPER_PARSEPID" --negative 1 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative 1: >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative -- -1:0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative 1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative '1:-122' >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative 1:0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative -- -1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative -- -2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative -- '-2147:78' >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative 2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --negative 0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR EINVAL)@EINVAL@" $TS_OUTPUT $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR ERANGE)@ERANGE@" $TS_OUTPUT $TS_ERRLOG
+
+
+ts_finalize_subtest
+
+ts_init_subtest "flag-zero-negative"
+
+"$TS_HELPER_PARSEPID" --zero --negative 1 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative 1: >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative -- -1443 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative 1:0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative 1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative '1:-122' >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative -- -1:122 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative -- -2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative 2147 >> $TS_OUTPUT 2>> $TS_ERRLOG
+"$TS_HELPER_PARSEPID" --zero --negative 0 >> $TS_OUTPUT 2>> $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR EINVAL)@EINVAL@" $TS_OUTPUT $TS_ERRLOG
+sed -i -e "s@$($TS_HELPER_STRERROR ERANGE)@ERANGE@" $TS_OUTPUT $TS_ERRLOG
+
+
+ts_finalize_subtest
+
+
+ts_finalize