#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use lib::relative 'lib';
use UnsplashSource;
use IPC::Run3;
use Getopt::Long qw( GetOptions );
use Data::Dumper;
my %options = ( resolution => '1920x1080' );
use constant is_OpenBSD => $^O eq "openbsd";
require OpenBSD::Unveil if is_OpenBSD;
sub unveil {
if (is_OpenBSD) {
say "Unveil :: @_" if $options{debug};
return OpenBSD::Unveil::unveil(@_);
} else {
warn "Dummy Unveil :: @_\n" if $options{debug};
return 1;
}
}
# Unveil @INC.
foreach my $path (@INC) {
unveil( $path, 'rx' )
or die "Unable to unveil: $!\n";
}
GetOptions(
"resolution=s" => \$options{resolution},
"search=s{1,}" => \@{$options{search}},
"featured" => \$options{featured},
"user=s" => \$options{user},
"userlikes|user-likes" => \$options{user_likes},
"collection=s" => \$options{collection_id},
"daily" => \$options{daily},
"weekly" => \$options{weekly},
"debug" => \$options{debug},
"help|h|?" => sub { HelpMessage() },
) or die "Error in command line arguments\n";
sub HelpMessage {
say "Crux:
--help Print this help message
--debug Print debugging information
Unsplash Source:
--resolution Device resolution (default: $options{resolution})
--search=s Search term (space seperated)
--featured Unsplash curated photos
--user=s Photos by user
--userlikes Photos by user from user's likes
--collection=s Photos from collection
--daily Daily photo
--weekly Weekly photo";
exit;
}
# %unveil contains list of paths to unveil with their permissions.
my %unveil = (
"/usr" => "rx",
"/var" => "rx",
"/etc" => "rx",
"/dev" => "rx",
);
# Unveil each path from %unveil. We use sort because otherwise keys is
# random order everytime.
foreach my $path ( sort keys %unveil ) {
unveil( $path, $unveil{$path} )
or die "Unable to unveil: $!\n";
}
my $response = UnsplashSource::get( %options );
print Dumper($response) if $options{debug};
die "Unexpected response\n"
unless $response->{status} == 302;
# Unveil $PATH.
foreach my $path ( split(/:/, $ENV{PATH}) ) {
unveil( $path, "rx" )
or ($! eq "No such file or directory"
# Don't die if the file/directory doesn't exist.
? next
: die "Unable to unveil: $! :: $path\n");
}
# Block further unveil calls.
unveil() or die "Unable to lock unveil: $!\n";
run3 ["feh", "--bg-fill", "$response->{headers}{location}"];