blob: bc54f920b4b73b98913370d8ee655d532f8796a0 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/usr/local/bin/perl -w
#-*- perl -*-
#
# Copyright (C) 2000-2001 Ken'ichi Fukamachi
# All rights reserved.
#
# $Id: loader,v 1.11 2001/02/17 07:39:38 fukachan Exp $
# $FML$
#
eval 'exec /usr/local/bin/perl -S $0 ${1+"$@"}'
if $running_under_some_shell;
use vars qw($MainCF $running_under_some_shell);
use strict;
use Carp;
# main configuration file for directory switch
$MainCF = '/etc/fml/main.cf';
eval { &Bootstrap();};
if ($@) { print STDERR "Error: ", $@, "\n"; exit 1;}
exit 0;
# Firstly we load Standalone.pm which has main.cf parser().
BEGIN {
use File::Basename;
unshift(@INC, dirname($0));
require Standalone;
}
# Descriptions: top lebel bootstrap program
# which load a dispather program (process_switch)
# for process switch. The flow of execution follows:
# libexec/loader ->
# libexec/process_switch ->
# FML::Process::Something
# Arguments: none
# XXX this program sees $0
# (program name, == argv[0] of C language)
# Side Effects: switch to the real process
# Return Value: none
sub Bootstrap
{
# 1. main.cf exists and I can open it?
-f $MainCF || die("cannot find ${MainCF}");
my $fh = new FileHandle $MainCF;
defined($fh) || die("cannot find ${MainCF}");
# parse command line options (preliminary)
my $main_cf_file = $MainCF;
my $params;
for (my $i = 0; $i <= $#ARGV; $i++) {
if ($ARGV[ $i ] =~ /^\-c$/) { $main_cf_file = $ARGV[$i + 1];}
if ($ARGV[ $i ] =~ /^\-\-params$/) { $params = $ARGV[$i + 1];}
}
# 2.1 o.k. try to load main.cf (1st pass) to resolve $libexec_dir
my $main_cf = Standalone::load_cf($main_cf_file, $params);
my $libexec_dir = $main_cf->{ libexec_dir };
# set up @INC
push(@INC, split(/\s+/, $main_cf->{ lib_dir }));
# 2.2 load $version depended process_switch
eval {
require FML::Process::Switch;
};
unless ($@) {
&Bootstrap2($main_cf_file);
}
else {
croak("cannot load $libexec_dir/process_switch\n");
}
}
=head1 NAME
loader -- the wrapper which executes a real fml5 program.
=head1 SYNOPSIS
loader C<[-c main.cf]> C<[--debug]> C<[--ctladdr]> [ml_home_dir]
=head1 DESCRIPTION
The loader resolves fml version dependence.
It checks /etc/fml/main.cf and prepare @INC for some fml version.
The real process switch routine is dependent on fml version.
C<libexec/fml/loader> switches itself to a program specified by $0.
C<libexec/fml/$VERSION/process_switch> analyzes several conditions
specified by main.cf, @INC and $0 et. al.
The swithing is done in libexec/fml/$VERSION/process_switch.
See C<libexec/fml/$VERSION/process_switch> for more details on process
switching.
C<-c main.cf>
main.cf alternative
C<--debug>
debug on.
C<--ctladdr>
execute fml/libexec/command.
C<--params>
--params 'key1=value1 key2=value2 ...'
=cut
|