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
|
#!/usr/local/bin/perl -w
#-*- perl -*-
#
# Copyright (C) 2000 Ken'ichi Fukamachi
# All rights reserved.
#
# $FML$
#
package FML;
use vars qw($debug);
use strict;
use Carp;
# Descriptions: top level process switch
# emulates "use $package" but $package is dynamically
# determined by e.g. $0.
# Arguments: $args
# XXX non OO interface
# Side Effects: process switching :-)
# ProcessSwtich() is exported to main:: Name Space.
# Return Value: package name
sub main::ProcessSwitch
{
my ($args) = @_;
# Firstly, create process
# $pkg is a package name, for exampl,e "FML::Process::Distribute".
my $pkg = _module_we_use($args);
croak("$args->{ myname } is unknown program\n") unless ($pkg);
eval qq{ require $pkg; }; # XXX require() needs bare words.
croak($@) if $@;
$pkg->import(); # fake to use() method.
return $pkg;
}
# Descriptions: determine package we need and require() it if needed.
# Arguments: $args
# XXX non OO interface
# Side Effects: none
# Return Value: FML::Process::SOMETHING process object
sub _module_we_use
{
my ($args) = @_;
my $name = $args->{ myname };
my $pkg = '';
if (($name eq 'fml.pl' && $args->{ options }->{ ctladdr }) ||
$name eq 'command') {
$pkg = 'FML::Process::Command';
}
elsif ($name eq 'fml.pl' || $name eq 'distribute' || $name eq 'loader') {
$pkg = 'FML::Process::Distribute';
}
elsif ($name eq 'fmlserv') {
$pkg = 'FML::Process::ListServer';
}
elsif ($name eq 'fmlconf' || $name eq 'makefml') {
$pkg = 'FML::Process::Configure';
}
elsif ($name eq 'fmlticket') {
$pkg = 'FML::Process::TicketSystem';
}
elsif ($name eq 'mead') {
$pkg = 'FML::Process::MailErrorAnalyzer';
}
elsif ($name eq 'qmail-ext') {
$pkg = 'FML::Process::QMail';
}
else {
return '';
}
return $pkg;
}
=head1 NAME
process_switch - switch or dispacther table to execute real fml programs
=head1 SYNOPSIS
require "$libexec_dir/process_switch";
ProcessSwitch(
{
fml_version => $main_cf->{ fml_version },
myname => $myname,
ml_home_prefix => $main_cf->{ ml_home_prefix },
ml_home_dir => $ml_home_dir,
cf_list => \@cf,
options => \%options,
});
See also C<libexec/fml/loader>.
=head1 DESCRIPTION
C<libexec/loader>
(C<libexec/fml/loader>),
the wrapper, loads this program and calls C<ProcessSwitch()>.
C<ProcessSwitch()> emulates "use $package" for a program specified by
the arguments.
The details of each program exists in FML::Process:: class.
=head1 SEE ALSO
L<FML::Process::Distribute>,
L<FML::Process::Command>,
L<FML::Process::ListServer>,
L<FML::Process::Configure>,
L<FML::Process::TicketSystem>,
L<FML::Process::MailErrorAnalyzer>
=cut
1;
|