/[svn.andrew.net.au]/scripts/printfax.pl
ViewVC logotype

Contents of /scripts/printfax.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations)
Sun Jun 25 17:33:52 2006 UTC (13 years, 9 months ago) by apollock
File MIME type: text/plain
File size: 20442 byte(s)
Initial experiment with svn
1 #!/usr/bin/perl
2 #
3 # printfax.pl 1.5.0, last changed 2000/03/22
4 #
5 ###################################################################
6 #
7 # Copyright (C) 2000 Horst F <horstf@gmx.de>
8 #
9 # This program is free software; you can redistribute it and/or
10 # modify it under the terms of the GNU General Public License as
11 # published by the Free Software Foundation; either version 2 of
12 # the License, or (at your option) any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 # General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
22 #
23 ###################################################################
24 #
25 # based on the script by
26 # Heiko Schlittermann <heiko@lotte.sax.de>
27 # added some modifications by
28 # Don Hayward <don@marinelab.sarasota.fl.us>
29 # Simon Hyde <shyde@poboxes.com>
30 # Helmut Lichtenberg <heli@tzv.fal.de>
31 # Ondrejicka Stefan <ondrej@idata.sk>
32 # Bryan Halvorson <bryan@pkgplus.com>
33 #
34 # NOTE: I'm neither a perl nor network expert (as well
35 # English isn't my natural language too)
36 #
37 #####
38 # This script is intended to be used in conjunction with
39 # ``Winsock Respond Daemon'' written by "Horst F" <horstf@gmx.de>
40 #
41 # You can download the current version from
42 # http://www.boerde.de/~horstf/
43 #
44 # called from smb.conf:
45 # print command = ( /usr/bin/printfax.pl %I %s %U %m; rm %s ) &
46 #
47 # History (changes since 1996/10/28/):
48 # [1996/10/28]
49 # - one script for all perl versions since 5.0 (or earlier?)
50 # (joining the scripts for 5.002 and for earlier versions)
51 # - replace of 'localhost' with call of hostname(), hope
52 # this fixes the problem with SunOS
53 # [1996/10/29 1.3.2]
54 # - the use of hostname() doesn't solve the problem with SunOS,
55 # the problem was gethostbyname, but now it works
56 # - start version numbering, now it's 1.3.2
57 # [1997/09/22 1.3.3]
58 # - minor bug fix:
59 # use "require/import" instead of "use Sys::Hostname" because
60 # "use" includes a file at compile time and so it includes
61 # Sys::Hostname every time, not only for perl version < 5.002
62 # [1997/10/29 1.3.4]
63 # - reading faxnumbers from file in user's home dir or everywhere
64 # - added debug output
65 # [1998/01/26 1.3.5]
66 # - report errors with winpopup
67 # - additional faxspool arguments in configuration section
68 # - optional faxnumber preprocessing
69 # [1999/02/19 1.4.0]
70 # - allows '*' in faxnumber now
71 # - missing smbclient don't breaks the use of multiple faxnumbers
72 # - added support for Hylafax (untested)
73 # [1999/07/01 1.4.1]
74 # - avoid winpopup timeout (seen with WinNT)
75 # [1999/12/05 1.4.2]
76 # - bug fix: use '-d' switch for hylafax when no faxreceiver given
77 # [2000/03/22 1.5.0]
78 # - added support for Windows NT Terminal Server
79 # - added workaround for the double connection problem
80 # - added additional logging features
81 ####
82
83 require 5.0; # Don't know if required include files exist
84 # in earlier versions
85 use strict;
86 no strict "refs";
87 use Socket;
88
89 # this is only required for perl versions below 5.002
90 if ( $] < 5.002 ) {
91 require Sys::Hostname;
92 import Sys::Hostname;
93 }
94
95 my($last, $tmp);
96
97 ###
98 ### CONFIGURATION Section
99 ###
100
101 my($port, $usedelay, $defaultdelay, $acct, $faxspool, $smbclient,
102 $logsmbhostname, $usesmbuser, $msg_to, $msg_ignored,
103 $msg_spooled, $msg_failed, $debug, $allowfile, $filechar,
104 $version, $nosendondebug, @faxspool_args, $msg_norespond,
105 $msg_strangeerr, $intl_with, $unillegal, $unillegalnumbers,
106 $termserver_ip, $ts_user, %respond_port, $minfaxsize,
107 $cmdlinefmt);
108
109 ### printfax.pl version string
110 $version = 'printfax.pl 1.5.0';
111
112 ### The default port we'll connect to RESPOND
113 $port = 5555;
114
115 ### Use delay
116 $usedelay = 1;
117
118 ### Default delay for delayed faxes
119 $defaultdelay = '18:00';
120
121 ### The log file we'll write the accounting information to
122 ### (It has to be writeable by the user samba is running as for faxes)
123 $acct = '/var/spool/fax/outgoing/printfax.log';
124
125 ### Format of commandline
126 $cmdlinefmt='mgetty';
127 # $cmdlinefmt='hylafax';
128
129 ### The faxspoolprogram
130 ### for mgetty+sendfax:
131 $faxspool = '/usr/bin/faxspool';
132 ### for hylafax:
133 # $faxspool = '/usr/bin/sendfax';
134
135 ### Additional faxspool args (e.g. header, coverpage)
136 ### empty:
137 @faxspool_args = qw();
138 ### for mgetty+sendfax with a special header:
139 # @faxspool_args = qw( -h /usr/local/etc/mgetty+sendfax/faxheader.smb );
140 ### for hylafax with send email when job is done or requeued and use
141 ### a4 sized paper:
142 # @faxspool_args = qw(-D -R -s a4);
143
144 ### The smbclient program, sender is the faxsystem.
145 ### Set to "" if you don't want to use smbclient
146 $smbclient = '/usr/bin/smbclient -U FAX';
147 #$smbclient = '';
148
149 ### The secure path for binaries searched
150 ### (faxspool makes usage of the PATH environment!)
151 $ENV{PATH} = '/usr/local/bin:/usr/bin:/bin' .
152 ':/usr/local/sbin:/usr/sbin:/sbin' .
153 ':/usr/X11R6/bin';
154
155 ### Use smb hostname for logging, set to 0 for inet hostname
156 ### (ip address will be logged in both cases)
157 $logsmbhostname = 1;
158
159 ### use smbuser for returning mail, ignore what the user types in
160 ### (smbuser will be allways used for logging)
161 $usesmbuser = 0;
162
163 ### Preprocess faxnumbers, disable it if you use faxspool aliases
164 # this replaces a leading '+', "" for no replace
165 $intl_with = "";
166 # delete all non numbers
167 $unillegal = 0;
168 # delete all non numbers, if faxnum contains only numbers and these characters
169 # "" for no delete
170 $unillegalnumbers = "()/-";
171
172 ### messages for smbclient
173 ### English:
174 $msg_to = "to";
175 $msg_ignored = "ignored";
176 $msg_spooled = "spooled";
177 $msg_failed = "failed";
178 $msg_norespond = "You doesn't have started RESPOND\nLaunch RESPOND and try again\n";
179 $msg_strangeerr = "Some serverside error\nTry again or contact administrator\n";
180 ### German:
181 # $msg_to = "an";
182 # $msg_ignored = "ignoriert";
183 # $msg_spooled = "gespoolt";
184 # $msg_failed = "fehlgeschlagen";
185 # $msg_norespond = "Respond laeuft nicht.\nBitte Respond starten und nochmal versuchen.\n";
186 # $msg_strangeerr = "Fehler im Faxserver.\nBitte den Administrator benachrichtigen.\n";
187
188 ### allow file for faxnumbers
189 $allowfile = 1;
190 $filechar = '@';
191
192 ### set $debug to 1 for debug messages and $nosendondebug to 1 if
193 ### you don't want to spool files on debug
194 ### debug messages go to syslog (or stderr, if called from commandline)
195 $debug = 0;
196 $nosendondebug = 1;
197
198 ### NT Terminal server and Win2000 sends out bogus print requests with
199 ### short files. Treat requests with files less than this size as bogus.
200 $minfaxsize = "100";
201
202 ### extra config info for NT Terminal server.
203 ### If you don't have an NT terminal server you can safely ignore this
204 ### section. Currently only one terminal server is supported.
205
206 # IP address of the terminal server, leave empty if you have none
207 # $termserver_ip = "192.168.101.171";
208 $termserver_ip = "";
209
210 # Array of user-port assignments
211 # If a request comes from the terminal server from one of the
212 # users in the array the assigned port will be used instead of the
213 # default port to connect to Respond
214 %respond_port = (
215 # Samples
216 # "me", "5556",
217 # "myself", "5557",
218 # "and_I", "5558"
219 );
220
221 ###
222 ### NOTHING else to configure
223 ###
224
225 ### Message buffer for smbclient (to avoid timeout)
226 my($messagebuffer);
227 $messagebuffer = '';
228
229 ### Append a message to message buffer
230 sub smbmessage {
231 $messagebuffer .= "@_";
232 }
233
234 ### Send message buffer to windows client
235 my($smbhost);
236 sub sendmessage {
237 if ($messagebuffer && $smbclient && (!$debug || ($debug && ! -t STDERR))) {
238 open(SF,"|$smbclient -M $smbhost") || ($smbclient = "");
239 $last = select(SF); $| = 1; select($last);
240 printf SF "$messagebuffer";
241 close(SF);
242 }
243 }
244
245 ### Error functions
246
247 sub norespond {
248 if ($smbclient) {
249 &smbmessage("$msg_norespond");
250 &sendmessage();
251 }
252 die "@_";
253 }
254
255 sub strangeerr {
256 if ($smbclient) {
257 &smbmessage("$msg_strangeerr");
258 &sendmessage();
259 }
260 die "@_";
261 }
262
263 sub silenterr {
264 die "@_";
265 }
266
267 ### If called non interactivly ... use the logger to report errors
268 ### in syslog
269
270 -t STDERR
271 || open(STDERR, "|logger -itprintfax")
272 || die "$0\[$$]: Can't open logger: $!\n";
273
274
275 ### Make STDERR unbuffered
276 $last = select(STDERR); $| = 1;
277 select($last);
278
279 if ($debug) {
280 print STDERR "$version started with: ", join(" ",@ARGV), "\n";
281 }
282
283 ### COMMAND line processing
284 my($remote_ip, $faxfile, $smbuser, $faxfname);
285
286 # 1.: The ip address (smb.conf: %I)
287 $remote_ip = $ARGV[0];
288 # 2.: The name of the faxfile with path (%s)
289 $faxfile = $ARGV[1];
290 # 3.: The samba session setup user (%U)
291 # used for accounting and if RESPOND doesn't return the user name
292 $smbuser = $ARGV[2];
293 # 4.: The NetBIOS hostname (%m)
294 $smbhost = $ARGV[3];
295
296 # Strip any domain from smbhost if required
297 # (sometimes %m gets the full qualified internet name)
298 $smbhost =~ s/^([^.]+).*$/$1/;
299
300 # Strip path from filename
301 ($faxfname = $faxfile) =~ s|.*/||;
302
303 ### Check on the file that samba handed us
304 if (!(-f $faxfile)) {
305 &strangeerr( "$0\[$$]: Fax file given on the command line doesn't exist.\n");
306 }
307 if (-z $faxfile) {
308 &silenterr( "$0\[$$]: Fax file given on the command line is zero length.\n");
309 }
310 if ((-s $faxfile) < $minfaxsize) {
311 &silenterr( "$0\[$$]: Fax file size is less than $minfaxsize.\n");
312 }
313
314 ### See if we're talking to a user on a terminal server
315 if ($remote_ip eq $termserver_ip) {
316 # get the user name
317 $ts_user = $smbuser;
318 $ts_user =~ tr/A-Z/a-z/;
319
320 # if the terminal server user has a different port number
321 # assigned to the respond program, reset $port to match it.
322 if ($respond_port{$ts_user}) {
323 $port = $respond_port{$ts_user};
324 }
325 if ($debug) {
326 print STDERR "User $ts_user is on a Terminal Server. Using port $port for respond.\n";
327 }
328 }
329
330
331 ### Check config
332 if (($cmdlinefmt ne 'hylafax') && ($cmdlinefmt ne 'mgetty')) {
333 &strangeerr( "$0\[$$]: Illegal value for cmdlinefmt: $cmdlinefmt\n");
334 }
335
336 ### Establish the socket connection
337 my($ip_remote, $remote, $proto);
338 $proto = getprotobyname('tcp');
339
340 # Since version 5.002 perl uses new ipc method
341 if ( $] < 5.002 ) {
342 # This is for perl versions below 5.002
343
344 my($ip_local, $local);
345 $ip_local = (gethostbyname(hostname()))[4];
346 $local = &Socket::sockaddr_in(AF_INET, 0, unpack('C4', $ip_local));
347
348 # This does not work on some systems (gethostbyname doesn't work properly):
349 # $ip_remote = (gethostbyname($remote_ip))[4] ||
350 # &strangeerr("$0\[$$]: No such host: $remote_ip\n");
351 # $remote = &Socket::sockaddr_in(AF_INET, $port, unpack('C4', $ip_remote));
352
353 # so we use this:
354 $remote = &Socket::sockaddr_in(AF_INET, $port, split(/\./, $remote_ip));
355
356 if ($debug) {
357 print STDERR "trying to connect to $remote_ip as ",
358 join ('.', unpack('C4', $ip_local)), "\n";
359 }
360
361 socket(S, AF_INET, SOCK_STREAM, $proto)
362 || &strangeerr("$0\[$$]: Can't get socket: $!\n");
363
364 bind(S, $local) || &strangeerr("$0\[$$]: Can't bind socket: $!\n");
365
366 } else {
367 # This must be used since perl version 5.002
368
369 # This seams to work:
370 $ip_remote = inet_aton($remote_ip) || &strangeerr("$0\[$$]: No host: $remote_ip\n");
371 $remote = sockaddr_in($port, $ip_remote);
372
373 # if not, try this:
374 # $remote = sockaddr_in($port, pack('C4', split(/\./, $remote_ip)));
375
376 if ($debug) {
377 print STDERR "trying to connect to $remote_ip\n";
378 }
379
380 socket(S, PF_INET, SOCK_STREAM, $proto)
381 || &strangeerr("$0\[$$]: Can't get socket: $!\n");
382
383 }
384 connect(S, $remote) || &norespond("$0\[$$]: Can't connect to $remote_ip: $!\n");
385
386
387 if ($debug) {
388 print STDERR "connected\n";
389 }
390
391 ### Get the needed information
392 my($faxnum, $user, $faxreceiver, $fullname, $delayed);
393
394 # Read FaxNr, User, Receivers name and Users fullname
395 # as well as strip trailing \n or \r
396 ($faxnum = <S>) =~ tr/\r\n//d;
397 ($user = <S>) =~ tr/\r\n//d;
398 ($faxreceiver = <S>) =~ tr/\r\n//d;
399 ($fullname = <S>) =~ tr/\r\n//d;
400 ($delayed = <S>) =~ tr/\r\n//d;
401
402 if ($debug) {
403 print STDERR "got faxnumber: $faxnum\n";
404 print STDERR "got receiver : $faxreceiver\n";
405 print STDERR "got sender : $user\n";
406 print STDERR "got fullname : $fullname\n";
407 print STDERR "got delay : $delayed\n";
408 }
409
410 # use default delay if respond's delay checkbox checked
411 if ( $delayed eq 'delayed' ) { $delayed = $defaultdelay; }
412
413 # Close the query connection
414 close(S);
415
416 # use samba user if no user is given
417 $user = $smbuser unless $user;
418
419 # allways use smbuser (look in the configuration section)
420 $user = $smbuser if $usesmbuser;
421
422 # user needs to lowercased too
423 $user =~ tr/A-Z/a-z/;
424
425 my(@faxnums, $gcos);
426
427 # split space or comma delimited faxnums (for more then one receiver)
428 @faxnums = split(/[ ,]+/, $faxnum);
429
430
431 # Retrieve additional information about the user (here: the users
432 # fullname) and the date
433
434 # Extract fullname from /etc/passwd
435 # only if we didn't get it from respond
436 $fullname =~ s/^ *(.*) *$/\1/;
437 if ( ! $fullname ) {
438 $gcos = (getpwnam($user))[6];
439 $fullname = (split(/,/, $gcos))[0];
440 }
441 $fullname = $user unless $fullname;
442
443 ### OK, do accounting
444
445 # What says the clock?
446 my($s, $m, $h, $dy, $mo, $yr);
447 ($s, $m, $h, $dy, $mo, $yr) = (localtime(time))[0..5];
448 $mo++; # month is 0 based.
449
450 my($host, $faxdest);
451
452 # Log smb or inet hostname (look in the configuration section)
453 if ( $logsmbhostname ) {
454
455 # Use the NetBIOS name for accounting:
456 $host = "$smbhost($remote_ip)";
457
458 # Uppercase looks more NetBIOS like :-)
459 # uncomment if you don't want this
460 $host =~ tr/a-z/A-Z/;
461
462 } else {
463
464 # Use the internet name for accounting:
465 $host = (gethostbyaddr(pack('C4', split(/\./, $remote_ip)),AF_INET))[0];
466
467 # Strip domains from name
468 $host =~ s/^([^.]+).*$/$1/;
469 $host = ($host) ? "$host($remote_ip)" : $remote_ip;
470
471 }
472
473 # Open the accounting file
474 open(ACCT, ">>$acct") || &strangeerr("$0\[$$]: Can't open `$acct': $!\n");
475
476 # Make it unbuffered
477 $last = select(ACCT); $| = 1;
478 select($last);
479
480
481 # If no faxnum is given it's assumed that cancelling the fax is ok.
482 scalar(@faxnums) || do {
483 printf ACCT "[%02d/%02d/%02d] %02d:%02d:%02d Fax from $host by $smbuser",
484 $mo, $dy, $yr, $h, $m, $s;
485 if ( $faxreceiver ) {
486 print ACCT " to $faxreceiver";
487 $faxdest = " " . $msg_to . " $faxreceiver";
488 }
489 print ACCT " cancelled\n";
490 if ($smbclient) {
491 &smbmessage("Fax $faxfname$faxdest $msg_ignored\n");
492 &sendmessage();
493 }
494 close(ACCT);
495 if ($debug) {
496 print STDERR "No faxnumbers given. Fax cancelled. Aborting\n";
497 }
498 exit 0;
499 };
500
501 ### Spool it
502
503 my(@fixargs, @faxargs, $fnum, $retval);
504
505 # Arguments for faxspool call
506 # --- Change this for other fax programs
507 if ($cmdlinefmt eq 'hylafax') {
508 @fixargs = ("-f",$user,"-r", $fullname);
509 } elsif ($cmdlinefmt eq 'mgetty') {
510 @fixargs = ("-q","-f","$user","-F","$fullname");
511 }
512 @fixargs = (@fixargs,@faxspool_args) if @faxspool_args;
513
514 # set delay if required
515 if ( ($delayed ne '') && $usedelay ) {
516 # Additional argument for faxspool call
517 # --- Change this for other fax programs
518 if ($cmdlinefmt eq 'hylafax') {
519 push(@fixargs,"-a",$delayed);
520 } elsif ($cmdlinefmt eq 'mgetty') {
521 @fixargs = (@fixargs,"-t","$delayed");
522 }
523 }
524
525 # do the "faxnumbers in a file" handling
526
527 my(@newfaxnums, @numfiles1, @numfiles2, @files, $file, $fnum2);
528
529 if ($allowfile) {
530
531 # seperate between faxnumbers and filenames
532 foreach $fnum (@faxnums) {
533 if (substr($fnum,0,1) eq $filechar ) {
534 push(@numfiles1, $fnum);
535 } else {
536 push(@newfaxnums, $fnum);
537 }
538 }
539 @faxnums = @newfaxnums;
540
541 # now process the file(s), a file can contain other filenames
542 while (scalar(@numfiles1)) {
543 foreach $fnum (@numfiles1) {
544 $file = substr($fnum, 1);
545
546 # Don't read a file twice (avoid endless loop)!
547 next if scalar(grep($_ eq $file, @files));
548 push(@files, $file);
549
550 # Get user's home dir, if path is not absolute
551 if (substr($file,0,1) ne '/') {
552 $file = (getpwnam($smbuser))[7] . "/$file";
553 }
554
555 # Read a file
556
557 if ($debug) {
558 print STDERR "read file $file - ";
559 }
560
561 if (open(NUMBERS,"<$file")) {
562 while (<NUMBERS>) {
563
564 # remove \r and \n
565 tr/\r\n//d;
566
567 # remove trailing blanks
568 s/^ *(.*) *$/$1/;
569
570 # ignore comments
571 next if /^#/;
572
573 # separate between faxnumbers and filenames
574 foreach $fnum2 (split(/[ ,]+/)) {
575 if (substr($fnum2,0,1) eq $filechar) {
576 push(@numfiles2, $fnum2);
577 } else {
578 push(@faxnums, $fnum2);
579 }
580 }
581 }
582 close(NUMBERS);
583
584 if ($debug) {
585 print STDERR "ok\n",
586 }
587
588 } elsif ($debug) {
589 print STDERR "failed\n";
590 }
591 }
592
593 # recurse files
594 @numfiles1 = @numfiles2;
595 @numfiles2 = ();
596
597 }
598 }
599
600 # preprocess faxnumbers
601 if ( $intl_with || $unillegal || $unillegalnumbers) {
602 for($tmp=0; $tmp<scalar(@faxnums); $tmp++) {
603 $faxnums[$tmp] =~ s/^\+/$intl_with/ if $intl_with;
604 if ( $unillegalnumbers ) {
605 $_ = $faxnums[$tmp];
606 # remove separator chars
607 eval "tr[$unillegalnumbers][]d;";
608 $faxnums[$tmp] = $_ if tr/*0-9// == length;
609 } else {
610 # remove all except digits and *
611 $faxnums[$tmp] =~ tr/*0-9//cd if $unillegal;
612 }
613 }
614 }
615 # delete duplicate faxnumbers
616 @newfaxnums = sort(@faxnums);
617 @faxnums = ();
618 $fnum2 = "";
619 while ($fnum = shift(@newfaxnums)) {
620 push(@faxnums, $fnum) if ($fnum ne $fnum2);
621 $fnum2 = $fnum;
622 }
623
624
625 # Spool it once for every number in $faxnum
626 foreach $fnum (@faxnums) {
627 printf ACCT "[%02d/%02d/%02d] %02d:%02d:%02d Fax from $host by $smbuser ",
628 $mo, $dy, $yr, $h, $m, $s;
629
630 # Build faxspool arguments from above arguments, number and file
631 # --- Change this for other fax programs
632 if( $cmdlinefmt eq 'hylafax' ) {
633 if ( $faxreceiver ) {
634 # Add receivers name to faxspool arguments
635 @faxargs = (@fixargs,"-d",$faxreceiver . '@'. $fnum,$faxfile);
636 } else {
637 @faxargs = (@fixargs,"-d",$fnum,$faxfile);
638 }
639 } elsif ( $cmdlinefmt eq 'mgetty' ) {
640 @faxargs = (@fixargs,$fnum,$faxfile);
641 if ( $faxreceiver ) {
642 # Add receivers name to faxspool arguments
643 @faxargs = ("-D","$faxreceiver",@faxargs);
644 }
645 } else {
646 @faxargs = (@fixargs,$fnum,$faxfile);
647 }
648
649 if ( $faxreceiver ) {
650 print ACCT "to $faxreceiver ($fnum)";
651 $faxdest = "$faxreceiver ($fnum)";
652 } else {
653 print ACCT "to $fnum";
654 $faxdest = "$fnum";
655 }
656
657 # Call the fax spooler
658 if ($debug) {
659 print STDERR "simulate " if ($nosendondebug);
660 print STDERR "call: $faxspool ", join(" ", @faxargs), "\n";
661 }
662 if (!$debug || ($debug && !$nosendondebug)) {
663 system($faxspool, @faxargs);
664 }
665
666
667 # Report the state to the logfile
668 $retval = $?;
669 if ($debug && !$nosendondebug) {
670 print STDERR "spooling ";
671 print STDERR ($retval == 0) ? "succeeded\n" : "failed\n";
672 }
673 print ACCT (($retval == 0) ? " spooled\n" : " failed\n");
674 if ($smbclient) {
675 &smbmessage("Fax $faxfname $msg_to $faxdest " );
676 &smbmessage(($retval == 0) ? $msg_spooled : $msg_failed );
677 &smbmessage("\n");
678 }
679 }
680
681 ### Done
682 if ($smbclient) {
683 &sendmessage();
684 }
685 close(ACCT);
686 exit 0;

Properties

Name Value
svn:executable

  ViewVC Help
Powered by ViewVC 1.1.22