blob: 4e0d3e90962caa77df6c6d29835fc86a5f6e1fab (
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
 | package FS::SelfService::XMLRPC;
=head1 NAME
FS::SelfService::XMLRPC - Freeside XMLRPC accessible self-service API
=head1 SYNOPSIS
=head1 DESCRIPTION
Use this API to implement your own client "self-service" module vi XMLRPC.
Each routine described in L<FS::SelfService> is available vi XMLRPC as the
method FS.SelfService.XMLRPC.B<method>.  All values are passed to the
selfservice-server in a struct of strings.  The return values are in a
struct as strings, arrays, or structs as appropriate for the values
described in L<FS::SelfService>.
=head1 BUGS
=head1 SEE ALSO
L<freeside-selfservice-clientd>, L<freeside-selfservice-server>,L<FS::SelfService>
=cut
use strict;
use vars qw($DEBUG $AUTOLOAD);
use FS::SelfService;
$DEBUG = 0;
$FS::SelfService::DEBUG = $DEBUG;
sub AUTOLOAD {
  my $call = $AUTOLOAD;
  $call =~ s/^FS::SelfService::XMLRPC:://;
  if (exists($FS::SelfService::autoload{$call})) {
    shift; #discard package name;
    $call = "FS::SelfService::$call";
    no strict 'refs';
    &{$call}(@_);
  }else{
    die "No such procedure: $call";
  }
}
package SOAP::Transport::HTTP::Daemon;  # yuck
use POSIX qw(:sys_wait_h);
no warnings 'redefine';
sub handle {
  my $self = shift->new;
  local $SIG{CHLD} = 'IGNORE';
ACCEPT:
  while (my $c = $self->accept) {
    
    my $kid = 0;
    do {
      $kid = waitpid(-1, WNOHANG);
      warn "found kid $kid";
    } while $kid > 0;
    my $pid = fork;
    next ACCEPT if $pid;
    if ( not defined $pid ) {
      warn "fork() failed: $!";
      $c = undef;
    } else {
      while (my $r = $c->get_request) {
        $self->request($r);
        $self->SUPER::handle;
        $c->send_response($self->response);
      }
      # replaced ->close, thanks to Sean Meisner <Sean.Meisner@VerizonWireless.com>
      # shutdown() doesn't work on AIX. close() is used in this case. Thanks to Jos Clijmans <jos.clijmans@recyfin.be>
      UNIVERSAL::isa($c, 'shutdown') ? $c->shutdown(2) : $c->close(); 
      $c->close;
    }
    exit;
  }
}
1;
 |