blob: 7d572642304c2aa33ab5911e32104c0328ac605e (
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
#!/usr/local/bin/perl -w
#-*- perl -*-
#
# Copyright (C) 2000-2001 Ken'ichi Fukamachi
# All rights reserved.
#
# $Id: loader,v 1.12 2001/02/17 14:39:16 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
=head1 AUTHOR
Ken'ichi Fukamachi
=head1 COPYRIGHT
Copyright (C) 2001 Ken'ichi Fukamachi
All rights reserved. This program is free software; you can
redistribute it and/or modify it under the same terms as Perl itself.
=head1 HISTORY
libexec/loader appeared in fml5 mailing list driver package.
See C<http://www.fml.org/> for more details.
=cut
1;
|