Why not adopt me?
NAME
Getargs::Original - remember the original arguments a program was invoked with
SYNOPSIS
In your main program:
use Getargs::Original;
Later on somewhere else
require Getargs::Original;
exec @{ Getargs::Original->args };
DESCRIPTION
Common behaviour for a daemon is to re-exec itself upon receipt of a signal (typically SIGHUP). It is also common to use modules like Getopt::Long to parse command line arguments when the program first starts. To achieve both of these tasks one must store the original contents of $0
and @ARGV
, as argument processing usually removes elements from @ARGV.
Getargs::Original simplifies this task by storing the contents of $0 and @ARGV when it is first used in a program. Later on when the original arguments are required, a singleton instance of Getargs::Original can be used to retrieve the arguments.
Getargs::Original is not meant to be instantiated as an object. All of the methods are called as class methods.
RESOLVING THE PATH OF $0
In normal operation, the path of $0 is made absolute using File::Spec->rel2abs()
. Sometimes it is desireable for the canonical name of the program run to be rooted in a particular directory.
Take for example a scenario where the canonical path to programs is /opt/foo/bin/ but /opt/foo/ is a symlink to another filesystem which can differ from machine to machine. When the full path to $0 is resolved, the path will be the true filesystem and not /opt/foo/.
This distinction may not matter to most, but if system monitoring tools are looking for a program to be running with a specific path then things will break. /opt/foo/bin/mumble.pl is not the same as /.d1/bin/mumble.pl after all.
To address this, Getargs::Original provides a way to specify the base directory used for resolution of $0
. By passing a directory to the base_dir method the resolved path to $0
will be calculated relative to that directory.
METHODS
argv()
Returns the original value of $0 and @ARGV as a list reference in scalar context and a list in array context.
If the base_dir() method has been called then the first element of the list returned will be a relative path rooted in the directory that base_dir() was called with. If base_dir() has not been called then the first element of the list will be the absolute path to $0.
Resolution of $0 is performed the first time that the argv() method (or the shortcuts described below) are called. As such if relative resolution is desired then the base_dir() method must be called prior to the first use of argv(), program() or args().
program()
Returns the original value of $0. A shortcut to saying
$originalargs->argv->[0];
args()
Returns the original value of @ARGV. A shortcut to saying
my $numargs = $originalargs->_argv_count;
$originalargs->argv->[1..$numargs]
As with argv() arguments are returned as a list or list reference depending on calling context.
base_dir()
Sets or gets the base directory used for resolution of $0. See "RESOLVING THE PATH OF $0" above for more detail. Returns the previous base directory.
resolved()
Sets or gets the flag indicating whether $0 has been resolved. Returns the previous state of the flag.
Using this method as a set accessor should only be required if the argv() method or one of it's shortcuts was inadvertently called prior to the base_dir() method being called.
AUTHOR
James FitzGibbon, <jfitz@CPAN.org>
COPYRIGHT
Copyright (c) 2003 James FitzGibbon. All Rights Reserved.
This module is free software; you may use it under the same terms as Perl itself.