#! /nix/store/hlx4viisc6a6b003r9ik0viaa62hdl1y-perl-5.24.3/bin/perl -w -I/nix/store/gy4yv67gv3j6in0lalw37j353zdmfcwm-nix-1.11.16/lib/perl5/site_perl/5.24.3/x86_64-linux-thread-multi -I/nix/store/lj6qn3zmjwrxmplf85ck67h982ssy80k-perl-DBI-1.636/lib/perl5/site_perl -I/nix/store/9g0ndfrjmrz5xq874pzyk9hzr6y97265-perl-DBD-SQLite-1.54/lib/perl5/site_perl -I/nix/store/79ixwd2m1z1rk03sbq3qma24cpjbf72l-perl-WWW-Curl-4.17/lib/perl5/site_perl

use strict;
use Nix::Utils;
use Nix::Config;


sub readProc {
    return unless -d "/proc";

    opendir DIR, "/proc" or return;

    foreach my $name (readdir DIR) {
        next unless $name =~ /^\d+$/;

        my $process = "/proc/$name";

        #print STDERR "=== $process\n";

        my $target;
        print "$target\n" if $target = readlink "$process/exe";
        print "$target\n" if $target = readlink "$process/cwd";

        if (opendir FDS, "$process/fd") {
            foreach my $name (readdir FDS) {
                $target = readlink "$process/fd/$name";
                print "$target\n" if $target && substr($target, 0, 1) eq "/";
            }
            closedir FDS;
        }

        if (open MAP, "<$process/maps") {
            while (<MAP>) {
                next unless /^ \s* \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ \S+ \s+ (\/\S+) \s* $/x;
                print "$1\n";
            }
            close MAP;
        }

        # Get all store paths that appear in the environment of this process.
        eval {
            my $env = Nix::Utils::readFile "$process/environ";
            my @matches = $env =~ /\Q$Nix::Config::storeDir\E\/[0-9a-z]+[0-9a-zA-Z\+\-\._\?=]*/g;
            print "$_\n" foreach @matches;
        }
    }

    closedir DIR;
}


sub lsof {
    return unless open LSOF, "lsof -n -w -F n 2> /dev/null |";

    while (<LSOF>) {
        next unless /^n (\/ .*)$/x;
        print $1, "\n";
    }

    close LSOF;
}


readProc;
lsof;


sub printFile {
    my ($fn) = @_;
    if (-e $fn) {
        print Nix::Utils::readFile($fn), "\n";
    }
}


# This is rather NixOS-specific, so it probably shouldn't be here.
printFile "/proc/sys/kernel/modprobe";
printFile "/proc/sys/kernel/fbsplash";
printFile "/proc/sys/kernel/poweroff_cmd";
