cwdaemon-0.10.1/0000755000175000017500000000000012326024336010370 500000000000000cwdaemon-0.10.1/README0000644000175000017500000002316112070103444011165 00000000000000Cwdaemon-0.9 ============ Cwdaemon is a small daemon which uses the pc parallel or serial port and a simple transistor switch to output morse code to a transmitter from a text message sent to it via the udp internet protocol. The program uses the soundcard or PC speaker (console buzzer) to generate a sidetone. It is called as root, with "cwdaemon -p -d ". If no portnumber is given, the default portnumber 6789 is used. Device can be one of the serial (ttyS0, ttyS1, etc) or parallel (parport0, parport1, etc) ports. Default is parport0. For FreeBSD, use ttyd0, ttyd1, etc. for the serial ports and ppi0, ppi1, etc. for the parallel ports. Default is the first parallel port. You can also use dummy device "null" instead of parallel or serial port. This device does exactly nothing (no rig keying, no ssb keying, etc.). Cwdaemon also handles PTT, and band index output for automatic switching of antennas, filters etc. Pinout is compatible with the standard (CT, TRlog). Please note ----------- BSD and/or Linux are not real-time operating systems. e.g. the timer resolution of the kernel is 10 milliseconds. You may especially notice this when using PTT and setting the PTT delay value. If you experience timing problems, you might try using the -P flag. This will set cwdaemon's priority. The default is zero, any negative value will be a higher priority, the maximum being -20. Quickstart ---------- On linux run the cwsetup.sh script and next run cwdaemon with the -n flag. If this does not work, read the next paragraphs.... Setting up parallel port(s) on linux for cwdaemon ------------------------------------------------- You need the parport devices to use cwdaemon. Check if you have them: ls -al /dev/parport* If you don't see any files, create the with MAKEDEV (as root user): cd /dev; ./MAKEDEV parport Next, check whether the parport and parport_pc kernel modules are loaded: when you type 'lsmod', you should (on the i386 architecture) see something like: parport_pc 23304 0 (autoclean) parport 25992 0 (autoclean) [parport_pc] The lp module should not be loaded, it is only needed if you want to use a printer and it will block the parallel port if you use cwdaemon. You can unload it with the command 'rmmod lp' as root. If you don't see any parport modules please check whether you have the line: alias parport_lowlevel parport_pc in your /etc/modules.conf file and load the modules with: modprobe parport modprobe parport_pc Be sure that parallel port support is enabled in your BIOS! If you use odd ioports or interrupts, you can do things like: modprobe parport_pc io=0x3bc,0x378,0x278 irq=none,7,auto which configures 3 parallel ports with the second port using irq 7 and the third port some auto-detected irq. When cwdaemon is run, the ppdev kernel module should be loaded automatically. In case it doesn't, just type: modprobe ppdev PLEASE NOTE: you should probably run a 2.4 kernel to use the ppdev device with cwdaemon. Setting up serial port(s) on linux for cwdaemon ----------------------------------------------- Setting up your serial ports is straightforward. Here are some commands to get you started: setserial -g /dev/ttyS* will tell you what serial lines are configured. If you see a line with "UART: unknown", this probably means there is no serial port for the device. setserial /dev/ttyS0 -v autoconfig will try to autoconfigure your first serial port. You need to run this command as root. Other valid commands are: setserial /dev/ttyS1 auto_irq skip_test autoconfig setserial /dev/ttyS3 irq 5 uart 16550A skip_test Newer distributions use a file called '/etc/serial.conf' where the information for your serial ports are stored. Setting up parallel port(s) on FreeBSD for cwdaemon --------------------------------------------------- You will need ppbus and ppi either defined in the kernel or loaded at boot time as kernel modules. ppbus and ppi are defined in the GENERIC kernel hence should work as is unless you have removed them from your kernel. If not, you can add the following in the kernel config, recompiling and reloading a kernel as outlined in the FreeBSD handbook. # Parallel port device ppbus # Parallel port bus (required) device ppi # Parallel port interface device You can also load ppbus.ko and ppi.ko at boot time instead of rebuilding your kernel. This is also outlined in the FreeBSD handbook. e.g. In /boot add ppbus_load="YES" ppi_load="YES" Setting up serial port(s) on FreeBSD for cwdaemon ------------------------------------------------- The serial port driver is loaded by default in the GENERIC kernel. If not configured in the kernel, you can add to the kernel config and rebuild the kernel as outlined in the FreeBSD handbook. # Serial (COM) ports device sio # 8250, 16[45]50 based serial ports How cwdaemon works ------------------ After starting, the program detaches from its controlling terminal, after that the program can be controlled via its network udp input port. You can control cwdaemon by sending requests to it. Recognized requests are listed below. Skip the quotes around codes when sending actual requests. is ASCII escape character (decimal 27, hex 1B). Most of the requests are so called "escape requests", because they start with Escape character. "0" Reset to default values "2"<"speed value"> Set keying speed (5 ... 60 wpm) "3"<"tone value"> Set sidetone (300 ... 1000 Hz) "3"<"0"> Sound off "4" Abort message "5" Stop (Exit) the daemon "6" Set uninterruptable (word- ) mode for simulator "7"<"weight value"> Set weighting (-50 ... 50) "8"<"device"> Set device for keying (same as -d) "9"<"port number"> Obsolete "a"<"0|1"> PTT keying off or on "b"<"0|1"> SSB signal from microphone or soundcard "c"<"x"> Tune x seconds long (limit = 10 seconds) "d"<"delay"> PTT on delay 0..50 (0 .. 50ms) "e"<"bandindex"> Band info output on pins 2, 7, 8, 9 of the parport (pin 2 = lsb, 9 = msb, e.g. 1000 = 160m, 1001 = 10m) "f"<"sound system"> Set sound system, same as '-x' command line option. Recognized values are: c - console buzzer (PC speaker) - default system, o - OSS, a - ALSA, p - PulseAudio, n - none - no audio, s - soundcard - autoselect from OSS/ALSA/PulseAudio. You may experience few seconds of delay (~4 s) when switching from ALSA or PulseAudio to OSS audio system. This is because OSS waits until audio device stops being blocked by ALSA or PulseAudio. "g"<"volume"> Set soundcard volume (0 .. 100). h<"text"> This request must be followed by a second request containing only text to be played by cwdaemon. Once the cwdaemon finishes playing the text from second request, it replies to the client with "h"+"text" from first request. "text" is optional. The reply defined in first request is used by cwdaemon only once, i.e. only for a single text request that follows the escape request. If you want to receive a reply from the cwdaemon after playing each text request, you need to send the "h" escape request first, for every text request. Example: client sends: "hcat" client sends: "purring" server plays: "purring" server sends back: "hcat" client sends: "hdog" client sends: "barking" server plays: "barking" server sends back: "hdog" client sends: "h" client sends: "whispering" server plays: "whispering" server sends back: "h" client sends: "hdog" client sends: "barking" server plays: "barking" server sends back: "hdog" client sends: "purring" server plays: "purring" server does not send a reply - none was specified this time for "purring" Any message Send morse code message (max 1 packet!) qrz de pa0rct ++test-- In- and decrease speed on the fly in 2 wpm steps. Repeated '+' and '-' characters are allowed, in such cases increase and decrease of speed is multiple of 2 wpm. de d~l~2~w~r~j pse k Add half-space delay after each character Default startup values ---------------------- Speed = 24 wpm Tone = 800 Hz Sound = on Wordmode = off Weight = 0 UDP port = 6789 PTT delay = 0 (off) Device = parport0 Sound device = console buzzer Cwdaemon supports the following special characters -------------------------------------------------- * AR = BT < SK ( KN ! SN & AS > BK Cwdaemon parallel and serial port circuitry ------------------------------------------- See the examples in the schematics directory. Testing cwdaemon ---------------- Please review and run the test/cwtest.sh test program. It only works with netcat installed. Credits ------- Conversion to stand-alone utility, basic work, POSIX porting, integration with unixcw and initial FreeBSD support by PG4I. Networking, daemon mode and band switching by PA0R. Rework of the device handling, echo-ing and Debian init.d support by OK1ZIA. Many contributions by DL2WRJ. Unixcw library by G0FRD. FreeBSD support by Diane Bruce, VA3DB. OpenBSD and multi-platform support by Jason L. Wright, AI4JW. All of this code is distributed under the GNU GPL license. cwdaemon-0.10.1/test/0000755000175000017500000000000012326024336011347 500000000000000cwdaemon-0.10.1/test/cwtest3.pl0000755000175000017500000001162112323041133013213 00000000000000#!/usr/bin/perl # cwtest.pl - test script for cwdaemon # Copyright (C) 2012 Jenö Vágó HA5SE # Copyright (C) 2012 - 2014 Kamil Ignacak # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. use warnings; use strict; use IO::Socket::INET; use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1); # How many times to run a basic set of tests. my $cycles = 1; my $cycle = 0; # Iterator. # How long to sleep after every basic set of tests (the set is run in loop). my $in_loop_sleep = 2; my $server_port = 6789; my $input_text = 'paris '; #my $input_text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; my $cwsocket; sub INT_handler { $cwsocket->close(); exit(0); } $SIG{'INT'} = 'INT_handler'; # my @words = qw/The Linux kernel isone ofthe largest collaborative software projects inthe history ofthe world andhas almost nothing inthe wayof formalized management structure. Wehave people whohavea strong operating systems background whohavebeen contributing code andthen wehave people like me. Ihavea background infruit flygenetics and yet someone lets meget close tothe Linux kernel; this seems wrong. And then wehave people whoare genuinely kidsintheir bedroom. It'sa miracle itworks aswell asit does. We should beastonished that we're able toget itso right somuch ofthe time./; my @words = qw/eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo eoooo/; # PTT ON #print "PTT ON\n\n"; #print $cwsocket chr(27).'a1'; for ($cycle = 0; $cycle < $cycles; $cycle++) { $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM) or die "Couldn't setup udp server on port $server_port : $@\n"; # PTT ON print "PTT ON\n\n"; print $cwsocket chr(27).'a1'; my $word = @words[rand(50)]; print $cycle." sending \"".$word."\"\t"; print $cwsocket chr(27).'h'.substr($word, 0, 2); # we can add space at the end of sent string print $cwsocket $word.""; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); if ($reply ne substr($word, 0, 2)) { print("\t\tWrong reply\n"); } else { print("\t\tCorrect reply\n"); } # random sleep between sent words sleep(int(rand(2)) + 1); $cwsocket->close(); } $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM); print $cwsocket chr(27).'5'; $cwsocket->close(); # Also used as receive routine in cwtest_send_2. sub cwtest_receive { my $cwsocket = shift; my $expected_prefix = shift; my $expected_postfix = "\r\n"; my $pre_len = length($expected_prefix); my $post_len = length($expected_postfix); my $reply = <$cwsocket>; if (substr($reply, 0, $pre_len) ne $expected_prefix) { print("malformed reply, missing leading '$expected_prefix'"); return ""; } if (substr($reply, length($reply) - $post_len, $post_len) ne $expected_postfix) { print("malformed reply, missing ending '\\r\\n'"); return ""; } $reply = substr($reply, $pre_len, length($reply) - $pre_len - $post_len); print("received "); if ($pre_len) { print("'" . $expected_prefix . "' + "); } print("'" . $reply . "' + '\\r\\n'"); # At this point 'reply' may be an empty string. return $reply; } cwdaemon-0.10.1/test/hanging.c0000644000175000017500000001603611767172622013066 00000000000000/* * cwtest.c - test program for cwdaemon * Copyright (C) 2003, 2006 Joop Stakenborg * * Some of this code is taken from netkeyer.c, which is part of the tlf source, * here is the copyright: * Tlf - contest logging program for amateur radio operators * Copyright (C) 2001-2002-2003 Rein Couperus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ /* * Compile this program with "gcc -o cwtest cwtest.c" * Usage: cwtest or cwtest */ #include #include #include #include #include #include #include #include #include #include #define K_MESSAGE 1 #define K_RESET 0 #define K_SPEED 2 #define K_TONE 3 #define K_ABORT 4 #define K_STOP 5 #define K_WORDMODE 6 #define K_WEIGHT 7 #define K_DEVICE 8 #define K_TOD 9 // set txdelay (turn on delay) #define K_ADDRESS 10 // set port address of device (obsolete) #define K_SET14 11 // set pin 14 on lpt #define K_TUNE 12 // tune #define K_PTT 13 // PTT on/off #define K_SWITCH 14 // set band switch output pins 2,7,8,9 on lpt #define K_SDEVICE 15 // set sound device #define K_VOLUME 16 // volume for soundcard int netkeyer_port = 6789; char netkeyer_hostaddress[16] = "127.0.0.1"; int socket_descriptor; int close_rc; ssize_t sendto_rc; struct sockaddr_in address; struct hostent *hostbyname; int netkeyer_init (void) { hostbyname = gethostbyname (netkeyer_hostaddress); if (hostbyname == NULL) { perror ("gethostbyname failed"); return (1); } bzero (&address, sizeof(address)); address.sin_family = AF_INET; memcpy (&address.sin_addr.s_addr, hostbyname->h_addr, sizeof (address.sin_addr.s_addr)); address.sin_port = htons (netkeyer_port); socket_descriptor = socket (AF_INET, SOCK_DGRAM, 0); if (socket_descriptor == -1) { perror ("socket call failed"); return (1); } return (0); } int netkeyer_close (void) { close_rc = close (socket_descriptor); if (close_rc == -1) { perror ("close call failed"); return (-1); } return (0); } int netkeyer(int cw_op, char *cwmessage) { char buf[80]; switch (cw_op) { case K_RESET : buf[0]= 27; sprintf (buf+1,"0"); break; case K_MESSAGE : sprintf (buf, cwmessage); break; case K_SPEED : buf[0]= 27; sprintf (buf+1,"2"); sprintf (buf+2, cwmessage); break; case K_TONE : buf[0]= 27; sprintf (buf+1,"3"); sprintf (buf+2, cwmessage); break; case K_ABORT : buf[0]= 27; sprintf (buf+1,"4"); break; case K_STOP : buf[0]= 27; sprintf (buf+1,"5"); break; case K_WORDMODE : buf[0]= 27; sprintf (buf+1,"6"); break; case K_WEIGHT : buf[0]= 27; sprintf (buf+1,"7"); sprintf (buf+2, cwmessage); break; case K_DEVICE : buf[0]= 27; sprintf (buf+1,"8"); sprintf (buf+2, cwmessage); break; case K_PTT : buf[0]= 27; sprintf (buf+1,"a"); sprintf (buf+2, cwmessage); break; case K_TUNE : buf[0]= 27; sprintf (buf+1,"c"); sprintf (buf+2, cwmessage); break; case K_TOD : buf[0]= 27; sprintf (buf+1,"d"); sprintf (buf+2, cwmessage); break; case K_SDEVICE : buf[0]= 27; sprintf (buf+1,"f"); sprintf (buf+2, cwmessage); break; case K_VOLUME : buf[0]= 27; sprintf (buf+1,"g"); sprintf (buf+2, cwmessage); break; default : buf[0]='\0'; } if (buf[0] != '\0') { sendto_rc = sendto (socket_descriptor, buf, sizeof (buf), 0, (struct sockaddr *)&address, sizeof (address)); } buf[0] = '\0'; cw_op = K_RESET; if (sendto_rc == -1) { printf ("Keyer send failed...!\n"); return (1); } return(0); } static void catchint (int signal) { int result = netkeyer (K_ABORT, ""); exit (0); } int main (int argc, char **argv) { int result; result = netkeyer_init (); if (result == 1) exit (1); /* tests start here, no error handling */ if (argc > 1) { result = netkeyer (K_DEVICE, argv[1]); printf("opening port %s\n", argv[1]); } printf("first message at initial speed\n"); result = netkeyer (K_MESSAGE, "paris"); sleep (3); printf("speed 40\n"); result = netkeyer (K_SPEED, "40"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("tone 1000, speed 40\n"); result = netkeyer (K_TONE, "1000"); result = netkeyer (K_SPEED, "40"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("tone 800, weight +20\n"); result = netkeyer (K_TONE, "800"); result = netkeyer (K_WEIGHT, "20"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("weight -20\n"); result = netkeyer (K_WEIGHT, "-20"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("weight 0\n"); result = netkeyer (K_WEIGHT, "0"); printf("speed increase / decrease\n"); result = netkeyer (K_MESSAGE, "p++++++++++aris----------"); sleep (2); printf("half gap\n"); result = netkeyer (K_MESSAGE, "p~ari~s"); sleep (2); printf("tune 3 seconds\n"); result = netkeyer (K_TUNE, "3"); sleep (4); printf("test message abort\n"); result = netkeyer (K_MESSAGE, "paris paris"); sleep (1.2); result = netkeyer (K_ABORT, ""); sleep (1); printf("switch to soundcard\n"); result = netkeyer (K_SDEVICE, "s"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("volume 30\n"); result = netkeyer (K_VOLUME, "30"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("prosigns: SK BK SN AS AR\n"); result = netkeyer (K_MESSAGE, "< > ! & *"); sleep (4); printf("set volume back to 70\n"); result = netkeyer (K_VOLUME, "70"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("back to console\n"); result = netkeyer (K_SDEVICE, "c"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); printf("message with PTT on\n"); result = netkeyer (K_PTT, "1"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); result = netkeyer (K_PTT, ""); printf("same with different TOD\n"); result = netkeyer (K_TOD, "20"); result = netkeyer (K_PTT, "1"); result = netkeyer (K_MESSAGE, "paris"); sleep (2); result = netkeyer (K_PTT, ""); result = netkeyer (K_TOD, "0"); /* almost done, reset keyer */ printf("done, reset\n"); result = netkeyer (K_RESET, ""); printf("test message abort with SIGALRM"); signal (SIGALRM, catchint); result = netkeyer (K_MESSAGE, "paris paris"); alarm (2); while (1) {} printf("done"); /* end tests */ result = netkeyer_close (); if (result == 1) exit (1); exit (0); } cwdaemon-0.10.1/test/cwtest.o0000644000175000017500000007463012326006706012773 00000000000000ELF>1@@S1H0HHHD$D$ HHHtR@S s{tSHsuL=HHX(HHuH H=t1H0[ÉH=H¾1f.H=tH=1HfD$ D$ fff.SHPw&$DHH<$u71HP[H|$g$HfD$DH=1HA0PL@HH$u8H1fD0$HfD$DH|$2$HfD$pH|$3$HfD$P4$HfD$:f.5$f\$Hf.A6$HfD\$H|$A7$HfDT$fDH|$A8$HfDL$fDH|$d$HfL$c$Hf|$H|$`H|$Aa$HfDD$>fDH|$f$HfT$H1127.0.0.16789getaddrinfo(): %s Could not connect close call failedKeyer send failed (%s)! opening port %s parisspeed 4040tone 1000, speed 401000tone 800, weight +2080020weight -20-20weight 00speed increase / decreasep++++++++++aris----------half gapp~ari~stune 3 seconds3test message abortparis parisswitch to soundcardsvolume 3030prosigns: SK BK SN AS AR< > ! & *set volume back to 7070back to consolecmessage with PTT on1same with different TODalmost done, resetfirst message at initial speedtest message abort with SIGALRMUSHH~HsHs1    114intVBBBe0G ;     ( 0 8 @ H P X `  h  ;p ;t zx ^ l   % . / 0 1 2) 4; 6    ;N  G  ܙ!  ^H  H X  !)+,./23:;<0 7 9; :; ;; <; = > ? @(## U;P;U#@rv];=U T QwR %;U T1QBcyT ;D %U ;H;bufUsUsTsQPR0Y0 2U Us,UsDUs\UstUsUsUsUs  O8; ; $U4T IU0!;";"# ; U82U [U   U1T t# U3[B U  f U2T   U1T t U2[ U   U3T   U2T  , U1T tC U2[b U   U3T   U7T   U1T t U2[ U  ( U7T  L U1T tc U2[ U   U7T [ U   U1T t U2[ U  C U1T tZ U2[y U   U<T t U4[ U   U1T t U1 2 U4T tI U1[h U   U?T   U1T t U2[ U   U@T  .U1T tEU2[dU  U1T tU4[U  U@T  U1T tU2[<U  `U?T  U1T tU2[U  U=T  U1T tU2 =U=T [\U  U9T  U=T  U1T tU2 U=T  'U9T [FU  jU0T 2U U>T  U1T U2IU1  A  1 B! C; D E $$$% ;#& q;;;;& ;; #%a;;;' 4cP44% y;%d;() )N' &  ;P);*2;% 2;%j;I()[;' ;t%ee' k;+ee% U: ; I$ > $ >  I&  : ;  : ; I8 : ;I8 : ; I !I/ &I : ; (  : ;  : ;'I.?: ; 'I@B4: ; I4: ; I1B11: ; I4: ; I4: ; I.?: ; '@B 4: ; I!.?: ;'I@B": ;I#4: ;I$4: ; I?<%.?: ;'I<&.?: ; 'I<'.?: ; n'I<().?: ;'<*.?: ; 'I<+.?: ;'I<PPUUU0UTTTTTTTTTTTTTTTTTTTT00PSUUUVTS<p /usr/lib/gcc/x86_64-linux-gnu/4.8/include/usr/include/x86_64-linux-gnu/bits/usr/include/usr/include/x86_64-linux-gnu/sys/usr/include/netinetcwtest.cstddef.htypes.hstdio.hlibio.hunistd.hsocket.hsockaddr.hnetdb.hsignal.hsocket.hstring.hstdlib.hsocket_type.hin.herrno.h &ztXP[ j9i24q>r.0]f)K/y  [40hWWK &vJCM/WuY{WWKY\WWKY[WuYWKeugWeKYWeKYWWKYyXWKzXWeKYWWKY#WK Y堟堟堟堟堟堟堟堟堟堟堟堟堟堟矽 IPPROTO_ESP_shortbuf_IO_lock_tstderrIPPROTO_IP_IO_buf_endsa_datasignalsockaddrprintf_IO_write_endunsigned intnetkeyer_hostaddress_flags__socket_typeIPPROTO_IGMPstrerror_markers__builtin_fwrite__errno_locationcatchintcw_opcwmessage_posstrcpystdout_IO_save_endIPPROTO_EGPIPPROTO_NONEaddrinforesultIPPROTO_IPV6IPPROTO_MTPGNU C 4.8.2 -mtune=generic -march=x86-64 -g -O2 -std=c99/home/acerion/current/cwdaemon/git_repo/cwdaemon/testIPPROTO_MAXcwtest.c_IO_backup_base_offsetselected_addrinfofprintf_filenogai_strerrorputssize_tsa_family_tai_addr_IO_read_baseargcstdin_nextIPPROTO_UDPcharIPPROTO_IPIP_mode__builtin_strcpynetkeyer_closesendto_rc_IO_markerclose_IO_read_ptrexitIPPROTO_ROUTINGSOCK_DCCPssize_t__builtin_putsSOCK_PACKETsocket_descriptor_IO_write_baseSOCK_DGRAMlong long intperrorIPPROTO_PUP_IO_save_baseIPPROTO_AHalarmIPPROTO_ICMPai_next__sighandler_tIPPROTO_FRAGMENT__pad1__pad2__pad3__pad4__pad5ai_canonname_vtable_offsetIPPROTO_IDPargvhintsai_familyIPPROTO_RSVPSOCK_STREAM_IO_read_endshort intconnectnetkeyerlong intIPPROTO_ICMPV6IPPROTO_DSTOPTSaddrinfo_listIPPROTO_PIMIPPROTO_GREnetkeyer_initsocket__sysv_signal__ssize_tIPPROTO_SCTPnetkeyer_portSOCK_CLOEXECIPPROTO_TPsendto_locksizetypelong unsigned int_old_offset_IO_FILEIPPROTO_UDPLITESOCK_RAWIPPROTO_COMPIPPROTO_ENCAPai_protocolai_socktypeunsigned char_sbuf__socklen_t_IO_write_ptrSOCK_SEQPACKETsleepai_flagsfwriteIPPROTO_HOPOPTS__off_tIPPROTO_TCPsigned charsa_familyshort unsigned intmainSOCK_NONBLOCK_chainai_addrlenFILE_flags2socklen_tfreeaddrinfo_cur_columnIPPROTO_DCCPgetaddrinfoIPPROTO_RAW__off64_t_unused2_IO_buf_baseSOCK_RDMGCC: (Debian 4.8.2-16) 4.8.2zRx  AP@ AA @DD b J \HAD`q AI IACG .symtab.strtab.shstrtab.rela.text.data.bss.rodata.str1.1.rela.rodata.rodata.str1.8.rela.text.startup.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.rela.debug_ranges.rela.debug_line.debug_str.comment.note.GNU-stack.rela.eh_frame @X>&,(12(E@BM2@a\pD  t oQ@  f!\XqA%@HxH%0x`%x00O(0"/@/@/ yx/ 8 => &;M   _myD`H  $*8cwtest.cnetkeyer_portaddrinfo_listnetkeyer_hostaddressselected_addrinfosocket_descriptornetkeyer_initgetaddrinfosocketconnectclosestderrfwritegai_strerrorfprintfnetkeyer_closefreeaddrinfoperrornetkeyerstrcpysendto__errno_locationstrerrorprintfcatchintexitmainputssleep__sysv_signalalarm   5DNbk {     ',"A &J#o %% &'( 8 )G%g%%%7%W%y%% Q$+x0P p(08@H PX`@h`px ($1 R8)= B-G cQ$[.` ie-j rt$y c$. u- $ r$ c$. - $ $ c$. - ($- c7$A.F K-P Z$_ d-i s$}. - $.  - $. - -$. Q$. 9 - M$ c'$1.6 O;-@ YJ$O cY$c.h \m-r u|$. - $ c$. - $ c$. - $ c$.! Q+$0 5-: D$I S$X cb$l.q Q{$ $ - Q$ ) */ -$0+  _   % * /7 E YL CZ a h lo v >{     u  U ;   1 J )  ^) 6 3C dP ] j w C  Z / y           - : H O [ cg s   b  % 8 T        5 6$ N0 < ?a (g m s y z   X i    F      r b ) q S j  ]  D  $ 61 > K X xe Jr B      9!4>fKXez 0N& P`/ 9 6> H \ f Yk8Kk-E];u[}  G  ?Q%9 0D [ Xf k v &{ ?  , <R F  U c  _$  i9 iC  x] rg  c   u    r  # c-  D  Y c  }      c       , )  ;C cM  Ed  Oy   ^   h   w        : D  [  p  z           -    ) Q3  J  _ 9i   M  + c  5  ? O  NY  ]%c/ gF q[\e u    c  3= Wa {c    c  /4Q> 9S] Hw W fc p Q ( =G aQk   * -    2 y>G S\ hq } ]   !   H& < B d z   l Q      3 WJ \ b *u  G  }9T6`>{I{Q_gu}` JJP*P2j=jEpSp[fn|::@@ZZ``| | (3;Yamu     & . 9 A      }; D`` cwdaemon-0.10.1/test/cwtest3.pl~0000755000175000017500000001162112323041015013410 00000000000000#!/usr/bin/perl # cwtest.pl - test script for cwdaemon # Copyright (C) 2012 Jenö Vágó HA5SE # Copyright (C) 2012 - 2014 Kamil Ignacak # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. use warnings; use strict; use IO::Socket::INET; use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1); # How many times to run a basic set of tests. my $cycles = 1; my $cycle = 0; # Iterator. # How long to sleep after every basic set of tests (the set is run in loop). my $in_loop_sleep = 2; my $server_port = 6789; my $input_text = 'paris '; #my $input_text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; my $cwsocket; sub INT_handler { $cwsocket->close(); exit(0); } $SIG{'INT'} = 'INT_handler'; # my @words = qw/The Linux kernel isone ofthe largest collaborative software projects inthe history ofthe world andhas almost nothing inthe wayof formalized management structure. Wehave people whohavea strong operating systems background whohavebeen contributing code andthen wehave people like me. Ihavea background infruit flygenetics and yet someone lets meget close tothe Linux kernel; this seems wrong. And then wehave people whoare genuinely kidsintheir bedroom. It'sa miracle itworks aswell asit does. We should beastonished that we're able toget itso right somuch ofthe time./; my @words = qw/toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo toooo/; # PTT ON #print "PTT ON\n\n"; #print $cwsocket chr(27).'a1'; for ($cycle = 0; $cycle < $cycles; $cycle++) { $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM) or die "Couldn't setup udp server on port $server_port : $@\n"; # PTT ON print "PTT ON\n\n"; print $cwsocket chr(27).'a1'; my $word = @words[rand(50)]; print $cycle." sending \"".$word."\"\t"; print $cwsocket chr(27).'h'.substr($word, 0, 2); # we can add space at the end of sent string print $cwsocket $word.""; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); if ($reply ne substr($word, 0, 2)) { print("\t\tWrong reply\n"); } else { print("\t\tCorrect reply\n"); } # random sleep between sent words sleep(int(rand(2)) + 1); $cwsocket->close(); } $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM); print $cwsocket chr(27).'5'; $cwsocket->close(); # Also used as receive routine in cwtest_send_2. sub cwtest_receive { my $cwsocket = shift; my $expected_prefix = shift; my $expected_postfix = "\r\n"; my $pre_len = length($expected_prefix); my $post_len = length($expected_postfix); my $reply = <$cwsocket>; if (substr($reply, 0, $pre_len) ne $expected_prefix) { print("malformed reply, missing leading '$expected_prefix'"); return ""; } if (substr($reply, length($reply) - $post_len, $post_len) ne $expected_postfix) { print("malformed reply, missing ending '\\r\\n'"); return ""; } $reply = substr($reply, $pre_len, length($reply) - $pre_len - $post_len); print("received "); if ($pre_len) { print("'" . $expected_prefix . "' + "); } print("'" . $reply . "' + '\\r\\n'"); # At this point 'reply' may be an empty string. return $reply; } cwdaemon-0.10.1/test/cwtest.c0000644000175000017500000002056012263356755012764 00000000000000/* * cwtest.c - test program for cwdaemon * Copyright (C) 2003, 2006 Joop Stakenborg * Copyright (C) 2012 - 2014 Kamil Ignacak * * Some of this code is taken from netkeyer.c, which is part of the tlf source, * here is the copyright: * Tlf - contest logging program for amateur radio operators * Copyright (C) 2001-2002-2003 Rein Couperus * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ /* * Compile this program with "gcc -o cwtest cwtest.c" * Usage: cwtest or cwtest */ #define _POSIX_SOURCE /* getaddrinfo() and friends. */ #include #include #include #include #include #include #include #include #include #include #include #define K_MESSAGE 1 #define K_RESET 0 #define K_SPEED 2 #define K_TONE 3 #define K_ABORT 4 #define K_STOP 5 #define K_WORDMODE 6 #define K_WEIGHT 7 #define K_DEVICE 8 #define K_TOD 9 // set txdelay (turn on delay) #define K_ADDRESS 10 // set port address of device (obsolete) #define K_SET14 11 // set pin 14 on lpt #define K_TUNE 12 // tune #define K_PTT 13 // PTT on/off #define K_SWITCH 14 // set band switch output pins 2,7,8,9 on lpt #define K_SDEVICE 15 // set sound device #define K_VOLUME 16 // volume for soundcard static char netkeyer_port[] = "6789"; static char netkeyer_hostaddress[16] = "127.0.0.1"; static int socket_descriptor; static struct addrinfo *addrinfo_list; static struct addrinfo *selected_addrinfo; int netkeyer_init(void); int netkeyer_close(void); int netkeyer(int cw_op, const char *cwmessage); void catchint(int signal); int netkeyer_init(void) { /* Code in this function has been copied from getaddrinfo() man page. */ struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_DGRAM; /* Datagram socket */ hints.ai_flags = 0; hints.ai_protocol = IPPROTO_UDP; int rv = getaddrinfo(netkeyer_hostaddress, netkeyer_port, &hints, &addrinfo_list); if (rv) { fprintf(stderr, "getaddrinfo(): %s\n", gai_strerror(rv)); return -1; } /* getaddrinfo() returns a list of address structures. Try each address until we successfully connect(2). If socket(2) (or connect(2)) fails, we (close the socket and) try the next address. */ for (selected_addrinfo = addrinfo_list; selected_addrinfo; selected_addrinfo = selected_addrinfo->ai_next) { socket_descriptor = socket(selected_addrinfo->ai_family, selected_addrinfo->ai_socktype, selected_addrinfo->ai_protocol); if (socket_descriptor == -1) { continue; } if (connect(socket_descriptor, selected_addrinfo->ai_addr, selected_addrinfo->ai_addrlen) != -1) { break; } close(socket_descriptor); } if (!selected_addrinfo) { fprintf(stderr, "Could not connect\n"); return -1; } else { return 0; } } int netkeyer_close(void) { if (close(socket_descriptor) == -1) { perror("close call failed"); return -1; } freeaddrinfo(addrinfo_list); /* No longer needed */ return 0; } int netkeyer(int cw_op, const char *cwmessage) { char buf[80]; switch (cw_op) { case K_RESET : buf[0] = 27; sprintf(buf + 1, "0"); break; case K_MESSAGE : sprintf(buf, "%s", cwmessage); break; case K_SPEED : buf[0] = 27; sprintf(buf + 1, "2"); sprintf(buf + 2, "%s", cwmessage); break; case K_TONE : buf[0] = 27; sprintf(buf + 1, "3"); sprintf(buf + 2, "%s", cwmessage); break; case K_ABORT : buf[0] = 27; sprintf(buf + 1, "4"); break; case K_STOP : buf[0] = 27; sprintf(buf + 1, "5"); break; case K_WORDMODE : buf[0] = 27; sprintf(buf + 1, "6"); break; case K_WEIGHT : buf[0] = 27; sprintf(buf + 1, "7"); sprintf(buf + 2, "%s", cwmessage); break; case K_DEVICE : buf[0] = 27; sprintf(buf + 1, "8"); sprintf(buf + 2, "%s", cwmessage); break; case K_PTT : buf[0] = 27; sprintf(buf + 1, "a"); sprintf(buf + 2, "%s", cwmessage); break; case K_TUNE : buf[0] = 27; sprintf(buf + 1, "c"); sprintf(buf + 2, "%s", cwmessage); break; case K_TOD : buf[0] = 27; sprintf(buf + 1, "d"); sprintf(buf + 2, "%s", cwmessage); break; case K_SDEVICE : buf[0] = 27; sprintf(buf + 1, "f"); sprintf(buf + 2, "%s", cwmessage); break; case K_VOLUME : buf[0] = 27; sprintf(buf + 1, "g"); sprintf(buf + 2, "%s", cwmessage); break; default : buf[0] = '\0'; } ssize_t sendto_rc = 0; if (buf[0] != '\0') { sendto_rc = sendto(socket_descriptor, buf, sizeof (buf), 0, selected_addrinfo->ai_addr, sizeof (struct addrinfo)); } buf[0] = '\0'; cw_op = K_RESET; if (sendto_rc == -1) { printf("Keyer send failed (%s)!\n", strerror(errno)); return -1; } else { return 0; } } void catchint(__attribute__((unused)) int signal) { __attribute__((unused)) int result = netkeyer(K_ABORT, ""); exit(EXIT_SUCCESS); } int main(int argc, char **argv) { if (netkeyer_init() == -1) { exit(EXIT_FAILURE); } /* tests start here, no error handling */ int result; if (argc > 1) { result = netkeyer(K_DEVICE, argv[1]); printf("opening port %s\n", argv[1]); } printf("first message at initial speed\n"); result = netkeyer(K_MESSAGE, "paris"); sleep(3); printf("speed 40\n"); result = netkeyer(K_SPEED, "40"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("tone 1000, speed 40\n"); result = netkeyer(K_TONE, "1000"); result = netkeyer(K_SPEED, "40"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("tone 800, weight +20\n"); result = netkeyer(K_TONE, "800"); result = netkeyer(K_WEIGHT, "20"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("weight -20\n"); result = netkeyer(K_WEIGHT, "-20"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("weight 0\n"); result = netkeyer(K_WEIGHT, "0"); printf("speed increase / decrease\n"); result = netkeyer(K_MESSAGE, "p++++++++++aris----------"); sleep(2); printf("half gap\n"); result = netkeyer(K_MESSAGE, "p~ari~s"); sleep(2); printf("tune 3 seconds\n"); result = netkeyer(K_TUNE, "3"); sleep(4); printf("test message abort\n"); result = netkeyer(K_MESSAGE, "paris paris"); sleep(1.2); result = netkeyer(K_ABORT, ""); sleep(1); printf("switch to soundcard\n"); result = netkeyer(K_SDEVICE, "s"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("volume 30\n"); result = netkeyer(K_VOLUME, "30"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("prosigns: SK BK SN AS AR\n"); result = netkeyer(K_MESSAGE, "< > ! & *"); sleep(4); printf("set volume back to 70\n"); result = netkeyer(K_VOLUME, "70"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("back to console\n"); result = netkeyer(K_SDEVICE, "c"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); printf("message with PTT on\n"); result = netkeyer(K_PTT, "1"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); result = netkeyer(K_PTT, ""); printf("same with different TOD\n"); result = netkeyer(K_TOD, "20"); result = netkeyer(K_PTT, "1"); result = netkeyer(K_MESSAGE, "paris"); sleep(2); result = netkeyer(K_PTT, ""); result = netkeyer(K_TOD, "0"); /* almost done, reset keyer */ printf("almost done, reset\n"); result = netkeyer(K_RESET, ""); printf("test message abort with SIGALRM"); signal(SIGALRM, catchint); result = netkeyer(K_MESSAGE, "paris paris"); alarm(2); while (1) {} printf("done"); /* end tests */ if (netkeyer_close() == -1) { exit(EXIT_FAILURE); } else { exit(EXIT_SUCCESS); } } cwdaemon-0.10.1/test/Makefile.am0000644000175000017500000000213612263357173013335 00000000000000# Copyright (C) 2003, 2006 Joop Stakenborg # Copyright (C) 2012 - 2014 Kamil Ignacak (acerion@wp.pl) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # program(s) to be built in current dir noinst_PROGRAMS = cwtest # source code files used to build cwtest program cwtest_SOURCES = cwtest.c # target-specific preprocessor flags (#defs and include dirs) # cwtest_CPPFLAGS = # target-specific linker flags (objects to link) # cwtest_LDADD = cwdaemon-0.10.1/test/cwtest2.pl~0000755000175000017500000001142412322530201013407 00000000000000#!/usr/bin/perl # cwtest.pl - test script for cwdaemon # Copyright (C) 2012 Jenö Vágó HA5SE # Copyright (C) 2012 - 2014 Kamil Ignacak # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. use warnings; use strict; use IO::Socket::INET; use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1); # How many times to run a basic set of tests. my $cycles = 50000; my $cycle = 0; # Iterator. # How long to sleep after every basic set of tests (the set is run in loop). my $in_loop_sleep = 2; my $server_port = 6789; my $input_text = 'paris '; #my $input_text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; my $cwsocket; sub INT_handler { $cwsocket->close(); exit(0); } $SIG{'INT'} = 'INT_handler'; # my @words = qw/The Linux kernel isone ofthe largest collaborative software projects inthe history ofthe world andhas almost nothing inthe wayof formalized management structure. Wehave people whohavea strong operating systems background whohavebeen contributing code andthen wehave people like me. Ihavea background infruit flygenetics and yet someone lets meget close tothe Linux kernel; this seems wrong. And then wehave people whoare genuinely kidsintheir bedroom. It'sa miracle itworks aswell asit does. We should beastonished that we're able toget itso right somuch ofthe time./; my @words = qw/tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe/; # PTT ON #print "PTT ON\n\n"; #print $cwsocket chr(27).'a1'; for ($cycle = 0; $cycle < $cycles; $cycle++) { $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM) or die "Couldn't setup udp server on port $server_port : $@\n"; # PTT ON print "PTT ON\n\n"; print $cwsocket chr(27).'a1'; my $word = @words[rand(50)]; print $cycle." sending \"".$word."\"\t"; print $cwsocket chr(27).'h'.substr($word, 0, 2); # we can add space at the end of sent string print $cwsocket $word.""; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); if ($reply ne substr($word, 0, 2)) { print("\t\tWrong reply\n"); } else { print("\t\tCorrect reply\n"); } # random sleep between sent words sleep(int(rand(2)) + 1); $cwsocket->close(); } $cwsocket->close(); # Also used as receive routine in cwtest_send_2. sub cwtest_receive { my $cwsocket = shift; my $expected_prefix = shift; my $expected_postfix = "\r\n"; my $pre_len = length($expected_prefix); my $post_len = length($expected_postfix); my $reply = <$cwsocket>; if (substr($reply, 0, $pre_len) ne $expected_prefix) { print("malformed reply, missing leading '$expected_prefix'"); return ""; } if (substr($reply, length($reply) - $post_len, $post_len) ne $expected_postfix) { print("malformed reply, missing ending '\\r\\n'"); return ""; } $reply = substr($reply, $pre_len, length($reply) - $pre_len - $post_len); print("received "); if ($pre_len) { print("'" . $expected_prefix . "' + "); } print("'" . $reply . "' + '\\r\\n'"); # At this point 'reply' may be an empty string. return $reply; } cwdaemon-0.10.1/test/cwtest2.pl0000755000175000017500000001141712322545622013230 00000000000000#!/usr/bin/perl # cwtest.pl - test script for cwdaemon # Copyright (C) 2012 Jenö Vágó HA5SE # Copyright (C) 2012 - 2014 Kamil Ignacak # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. use warnings; use strict; use IO::Socket::INET; use IO::Handle; STDERR->autoflush(1); STDOUT->autoflush(1); # How many times to run a basic set of tests. my $cycles = 1; my $cycle = 0; # Iterator. # How long to sleep after every basic set of tests (the set is run in loop). my $in_loop_sleep = 2; my $server_port = 6789; my $input_text = 'paris '; #my $input_text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; my $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM) or die "Couldn't setup udp server on port $server_port : $@\n"; sub INT_handler { $cwsocket->close(); exit(0); } $SIG{'INT'} = 'INT_handler'; # my @words = qw/The Linux kernel isone ofthe largest collaborative software projects inthe history ofthe world andhas almost nothing inthe wayof formalized management structure. Wehave people whohavea strong operating systems background whohavebeen contributing code andthen wehave people like me. Ihavea background infruit flygenetics and yet someone lets meget close tothe Linux kernel; this seems wrong. And then wehave people whoare genuinely kidsintheir bedroom. It'sa miracle itworks aswell asit does. We should beastonished that we're able toget itso right somuch ofthe time./; my @words = qw/tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe tethe/; # PTT ON #print "PTT ON\n\n"; #print $cwsocket chr(27).'a1'; for ($cycle = 0; $cycle < $cycles; $cycle++) { # PTT ON print "PTT ON\n\n"; print $cwsocket chr(27).'a1'; my $word = @words[rand(50)]; print $cycle." sending \"".$word."\"\t"; print $cwsocket chr(27).'h'.substr($word, 0, 2); # we can add space at the end of sent string print $cwsocket $word.""; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); if ($reply ne substr($word, 0, 2)) { print("\t\tWrong reply\n"); } else { print("\t\tCorrect reply\n"); } # random sleep between sent words sleep(int(rand(2)) + 1); } print $cwsocket chr(27).'5'; $cwsocket->close(); # Also used as receive routine in cwtest_send_2. sub cwtest_receive { my $cwsocket = shift; my $expected_prefix = shift; my $expected_postfix = "\r\n"; my $pre_len = length($expected_prefix); my $post_len = length($expected_postfix); my $reply = <$cwsocket>; if (substr($reply, 0, $pre_len) ne $expected_prefix) { print("malformed reply, missing leading '$expected_prefix'"); return ""; } if (substr($reply, length($reply) - $post_len, $post_len) ne $expected_postfix) { print("malformed reply, missing ending '\\r\\n'"); return ""; } $reply = substr($reply, $pre_len, length($reply) - $pre_len - $post_len); print("received "); if ($pre_len) { print("'" . $expected_prefix . "' + "); } print("'" . $reply . "' + '\\r\\n'"); # At this point 'reply' may be an empty string. return $reply; } cwdaemon-0.10.1/test/cwtest0000755000175000017500000005305112326006706012533 00000000000000ELF>d @@0?@8@%"@@@@@@@@@   `` ((`(`@@DDPtd88@8@TTQtd/lib64/ld-linux-x86-64.so.2GNU GNUعL2q39K:c~ i+2w?" \`libc.so.6socketstrcpyexitgai_strerrorperrorconnectputsgetaddrinfo__errno_locationstderralarm__sysv_signalfwriteclosefprintfsendtosleepfreeaddrinfo__libc_start_main__gmon_start__GLIBC_2.2.5ui ` `` `(`0`8`@`H`P`X` `` h` p` x` ````````HH HtH5 % @% h% h% h% h% h% h% h% hp% h`% h P% h @% h 0% h %z h %r h%j h%b h%Z h%R h%J h%B hUSHH~HsHs@1@@q@g@@?@5@@w@h@4@E1@6@'8@?@@C@J@L@hf@O@E@,@"@ s @@P@7@@@@@@i@_@F@<@@~@ (@[@L*@>@ )@@ @@1@ >@ @`@ J@ X@8@1@10@@b81I^HHPTI@H @Hǀ @#f`UH-`HHw]øHt]``UH-`HHHH?HHu]úHt]Hƿ`= uUH~] @H= tHtU `H]{sS1`H0HHH``D$D$ Hh HHV tR@S s{I tSHsAuL=. H HX(HH uH @H= t1H0[É7H= H¾@1qf.H= 1tH= 1Hf@D$ RD$ fff.SHPw&$p@DHHm<$u71HP[H|$g$HfD$5DH = 1HA0PL@JHH$u8@H1fD0$HfD$DH|$2$HfD$pH|$3$HfD$P4$HfD$:f.5$f\$Hf.A6$HfD\$H|$A7$HfDT$fDH|$A8$HfDL$fDH|$d$HfL$c$Hf|$H|$`H|$Aa$HfDD$s>fDH|$f$HfT$MH@1fDAWAAVIAUIATL% UH- SL)1HHHtLLDAHH9uH[]A\A]A^A_ff.HHgetaddrinfo(): %s Could not connect close call failedKeyer send failed (%s)! opening port %s tone 1000, speed 401000tone 800, weight +20800weight -20weight 0speed increase / decreasep++++++++++aris----------half gapp~ari~stune 3 seconds3test message abortparis parisswitch to soundcardvolume 30prosigns: SK BK SN AS AR< > ! & *set volume back to 70back to consolecmessage with PTT on1same with different TODalmost done, reseth@@@@@@@ @H@p@@@@@@@@first message at initial speedtest message abort with SIGALRM;T HP,p(x8pXzRx *zRx $@`FJ w?;*3$"$DHAP@ AA l0DD b J $`HAD`q AI IACG DpeBEE E(H0H8M@l8A0A(B BBB4 @@ @ @``o`@@@ `@@0 o@oo@(`6@F@V@f@v@@@@@@@@@ @ @& @6 @F @V @f @v @127.0.0.16789GCC: (Debian 4.8.2-16) 4.8.2<P@ @$]\4intV!{BBYB(3e0G d; h    ?( P0 *8 3@ H P X `  h  ;p ;t zx ^ l   % P. W/ ^0 e1 l2) -4; !6 ] * - ;N  G  [ܙ5!s7M ~ ^GH  ?H X (k  ! )z+?,.*/2 3:;<c 0 7 b 9;  :;  ;;  <;  =  > s ? ( @(##0 U;6P;P@U#@rv];@=U `T `QwR `@@@%@;U @T1QB9@cO@yT @D;`@D o@%@@U @;@H;6bufSY@Us @Us6@TsQPR0Y0H@ O@^@2U @@Us@,Us=@DUse@\Us@tUs@Us@Us@Us  O@8R; ;@ $U4T @@IU0!; @" ;"&# ; @ @ U8 @2U @ @[U @ @  U1T @ @t# U3 @[B U @ @ f U2T @ @  U1T @ @t U2 @[ U @* @  U3T @9 @  U2T @H @ , U1T @R @tC U2\ @[b U @k @  U3T 4@z @  U7T 1@ @  U1T @ @t U2 @[ U 8@ @ ( U7T ?@ @ L U1T @ @tc U2 @[ U C@ @  U7T J@ @[ U L@ @  U1T f@ @t U2 @[ U @ @ C U1T @$ @tZ U2. @[y U @= @  U<T @G @t U4Q @[ U @` @  U1T @j @t U1y @ 2 U4T @ @tI U1 @[h U @ @  U?T @ @  U1T @ @t U2 @[ U @ @  U@T @ @ .U1T @ @tEU2 @[dU @ @ U1T @ @tU4 @[U @# @ U@T @2 @ U1T @< @tU2F @[<U @U @ `U?T (@d @ U1T @n @tU2x @[U *@ @ U=T >@ @ U1T @ @tU2 @ =U=T @ @[\U @@ @ U9T 1@ @ U=T >@ @ U1T @ @tU2 @ U=T @ @ 'U9T J@ @[FU X@$ @ jU0T @0 @2U @? @U>T @N @ U1T @X @U2d @IU1  pA ` 1 ^B! `C; `D `E `$$$!% ;#&D q;;;;& ;; #%Ma;;;' 4cP44% y;%d;() )N'3 =&  ;P);*2;% 2;%j;I()u[;' ;t%\ee'R kK;+ee% U: ; I$ > $ >  I&  : ;  : ; I8 : ;I8 : ; I !I/ &I : ; (  : ;  : ;'I.?: ; 'I@B4: ; I4: ; I1B11: ; I4: ; I4: ; I.?: ; '@B 4: ; I!.?: ;'I@B": ;I#4: ;I$4: ; I?<%.?: ;'I<&.?: ; 'I<'.?: ; n'I<().?: ;'<*.?: ; 'I<+.?: ;'I<p /usr/lib/gcc/x86_64-linux-gnu/4.8/include/usr/include/x86_64-linux-gnu/bits/usr/include/usr/include/x86_64-linux-gnu/sys/usr/include/netinetcwtest.cstddef.htypes.hstdio.hlibio.hunistd.hsocket.hsockaddr.hnetdb.hsignal.hsocket.hstring.hstdlib.hsocket_type.hin.herrno.h P@&ztXP[ j9i24q>r.0]f)K/y  [40hWWK &vJCM/WuY{WWKY\WWKY[WuYWKeugWeKYWeKYWWKYyXWKzXWeKYWWKY#WK  @Y堟堟堟堟堟堟堟堟堟堟堟堟堟堟矽 IPPROTO_ESP_shortbuf_IO_lock_tstderrIPPROTO_IP_IO_buf_endsa_datasockaddr_IO_write_endnetkeyer_hostaddress__socket_typeIPPROTO_IGMP_markers__builtin_fwrite__errno_locationcatchintcw_opcwmessage_posstdout_IO_save_endIPPROTO_EGPIPPROTO_NONEresultIPPROTO_IPV6IPPROTO_MTPGNU C 4.8.2 -mtune=generic -march=x86-64 -g -O2 -std=c99/home/acerion/current/cwdaemon/git_repo/cwdaemon/testIPPROTO_MAXcwtest.c_IO_backup_baseselected_addrinfofprintf_filenogai_strerrorsa_family_tai_addr_IO_read_baseargcstdinIPPROTO_UDPIPPROTO_IPIP_mode__builtin_strcpynetkeyer_closesendto_rc_IO_marker_IO_read_ptrexitIPPROTO_ROUTINGSOCK_DCCP__builtin_putsSOCK_PACKETsocket_descriptor_IO_write_baseSOCK_DGRAMlong long intperrorIPPROTO_PUP_IO_save_baseIPPROTO_AHalarmIPPROTO_ICMPai_next__sighandler_tIPPROTO_FRAGMENT__pad1__pad2__pad3__pad4__pad5ai_canonname_vtable_offsetIPPROTO_IDPargvhintsai_familyIPPROTO_RSVPSOCK_STREAM_IO_read_endshort intconnectnetkeyerIPPROTO_ICMPV6IPPROTO_DSTOPTSaddrinfo_listIPPROTO_PIMIPPROTO_GREnetkeyer_initsocket__sysv_signal__ssize_tIPPROTO_SCTPnetkeyer_portSOCK_CLOEXECIPPROTO_TPsendto_locksizetypelong unsigned int_old_offset_IO_FILEIPPROTO_UDPLITESOCK_RAWIPPROTO_COMPIPPROTO_ENCAPai_protocolai_socktypeunsigned char_sbuf__socklen_t_IO_write_ptrSOCK_SEQPACKETsleepai_flagsIPPROTO_HOPOPTS__off_tIPPROTO_TCPsa_familyshort unsigned intmainSOCK_NONBLOCK_chainai_addrlen_flags2freeaddrinfo_cur_columnIPPROTO_DCCPgetaddrinfoIPPROTO_RAW__off64_t_unused2_IO_buf_baseSOCK_RDM@@P2@8@P@@U@@U@A@UA@b@0b@@U@@T@@T@ @T @b@Tb@@T@@T@@T@@T@<@T<@B@TB@d@Td@j@Tj@@T@@T@@T@@T@@T@@T@@T@@T@@0 @=@0=@G@PG@b@S@@U@@U @ @U @d @V @ @T @d @SP@@ @d @.symtab.strtab.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.init_array.fini_array.jcr.dynamic.got.got.plt.data.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line.debug_str.debug_loc.debug_ranges@#@ 1<@<$Do`@`$N @(V@^o@.ko@ z@0@ @ @ ` @  @ @8@8T@|`` ` (`(```%`(0@B#.f1c1=04@HA:\S=0=apH` $9 QY@@<@`@@@@@ @ @ @ @ @@@8@@`` `(````` ! ``&`;`M`_j `w @ @ @`` @`_@$ `0`A(`J`]`s @  ``@)=Pc` `@ P@ @ @e` d @ @H&`2 @7K _ `@Dn`  @1`Ecwtest.cnetkeyer_portaddrinfo_listnetkeyer_hostaddressselected_addrinfosocket_descriptorcrtstuff.c__JCR_LIST__deregister_tm_clonesregister_tm_clones__do_global_dtors_auxcompleted.6361__do_global_dtors_aux_fini_array_entryframe_dummy__frame_dummy_init_array_entry__FRAME_END____JCR_END____init_array_end_DYNAMIC__init_array_start_GLOBAL_OFFSET_TABLE___libc_csu_fini__errno_location@@GLIBC_2.2.5_ITM_deregisterTMCloneTabledata_startstrcpy@@GLIBC_2.2.5puts@@GLIBC_2.2.5_edata_finiprintf@@GLIBC_2.2.5gai_strerror@@GLIBC_2.2.5sendto@@GLIBC_2.2.5alarm@@GLIBC_2.2.5close@@GLIBC_2.2.5__libc_start_main@@GLIBC_2.2.5__data_startfprintf@@GLIBC_2.2.5__gmon_start____dso_handle_IO_stdin_used__sysv_signal@@GLIBC_2.2.5netkeyer_initcatchint__libc_csu_init_end_startnetkeyer__bss_startmainperror@@GLIBC_2.2.5_Jv_RegisterClassesnetkeyer_closeexit@@GLIBC_2.2.5connect@@GLIBC_2.2.5fwrite@@GLIBC_2.2.5__TMC_END___ITM_registerTMCloneTablegetaddrinfo@@GLIBC_2.2.5strerror@@GLIBC_2.2.5sleep@@GLIBC_2.2.5_initfreeaddrinfo@@GLIBC_2.2.5stderr@@GLIBC_2.2.5socket@@GLIBC_2.2.5cwdaemon-0.10.1/test/cwtest.sh0000755000175000017500000000026410350336110013130 00000000000000#!/bin/sh old_tty_settings=$(stty -g) stty -icanon trap 'stty "$old_tty_settings"; exit 0' INT echo "Press (CTRL-C) to interrupt..." while true; do nc -u localhost 6789 done cwdaemon-0.10.1/test/cwtest.pl0000775000175000017500000002360712316031765013155 00000000000000#!/usr/bin/perl # cwtest.pl - test script for cwdaemon # Copyright (C) 2012 Jenö Vágó HA5SE # Copyright (C) 2012 - 2014 Kamil Ignacak # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Library General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. use warnings; use strict; use IO::Socket::INET; # How many times to run a basic set of tests. my $cycles = 50000; my $cycle = 0; # Iterator. # How long to sleep after every basic set of tests (the set is run in loop). my $in_loop_sleep = 2; my $server_port = 6789; my $input_text = 'paris '; #my $input_text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; my $cwsocket = IO::Socket::INET->new(PeerAddr => "localhost", PeerPort => $server_port, Proto => "udp", Type => SOCK_DGRAM) or die "Couldn't setup udp server on port $server_port : $@\n"; # Number of tokens (tX) and errors (eX) in cwtest_send_X(). my $global_t1 = 0; my $global_e1 = 0; my $global_t2 = 0; my $global_e2 = 0; my $global_t3 = 0; my $global_e3 = 0; my $global_t4 = 0; my $global_e4 = 0; my $global_t5 = 0; my $global_e5 = 0; sub INT_handler { print "\n"; cwtest_print_stats($cycle, $cycles); $cwsocket->close(); exit(0); } $SIG{'INT'} = 'INT_handler'; for ($cycle = 0; $cycle < $cycles; $cycle++) { print("\n--- Test 1: \"h\\r\\n\" ---\n"); # PTT ON print "PTT ON\n\n"; print $cwsocket chr(27).'a1'; cwtest_send_1($cwsocket, $input_text); print("\n--- Test 2: \"h\\r\\n\" ---\n"); # PTT still ON cwtest_send_2($cwsocket, $input_text); print("\n--- Test 3: \"h\\r\\n\" ---\n"); # PTT still ON cwtest_send_3($cwsocket, $input_text); print("\n--- Test 4: \"^\" ---\n"); # PTT OFF print "PTT OFF\n\n"; print $cwsocket chr(27).'a0'; cwtest_send_4($cwsocket, $input_text); print("\n--- Test 5: \"^\" ---\n"); # PTT still OFF cwtest_send_5($cwsocket, $input_text); cwtest_print_stats($cycle, $cycles); } $cwsocket->close(); # ========================================================================== # subs # ========================================================================== # This function sends following request to the server: # "h" # "" # # This function expects the following reply from the server: # "h\r\n" sub cwtest_send_1 { my $cwsocket = shift; my $txt = shift; for (my $i = 0; $i < length($txt); $i++) { # cwdaemon allows 'expected' to be empty string, # this will be tested in cwtest_send_2. my $expected = "reply"; my $text = substr($txt, $i, 1); print "sending '" . $text . "'\n"; # Use "h" request to define reply expected from the server. print $cwsocket chr(27) . "h" . $expected; # Send text to be played by server. print $cwsocket $text; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); $global_t1++; if ($reply ne $expected) { $global_e1++; die "die 1, incorrect reply: '$reply' != '$expected'\n"; } print "\n"; # To clearly separate pairs of send/reply from each other. sleep $in_loop_sleep; } } # This function sends following to the server: # "h" # "" # # This function expects the following reply from the server: # "h\r\n" sub cwtest_send_2 { my $cwsocket = shift; my $txt = shift; for (my $i = 0; $i < length($txt); $i++) { # cwdaemon allows 'expected' to be empty string, # so let's test this here. my $expected = ""; my $text = substr($txt, $i, 1); print "sending '" . $text . "'\n"; # Use "h" request to define reply expected from the server. print $cwsocket chr(27) . "h" . $expected; # Send text to be played by server. print $cwsocket $text; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); $global_t2++; if ($reply ne $expected) { $global_e2++; die "die 2, incorrect reply: '$reply' != '$expected'\n"; } print "\n"; # To clearly separate pairs of send/reply from each other. sleep $in_loop_sleep; } } # This function sends following requests to the server: # "h" # "" # # This function expects the following reply from the server: # "h\r\n" sub cwtest_send_3 { my $cwsocket = shift; my $txt = shift; my @tokens = split(/ /, $txt); foreach (@tokens) { my $expected = "ack"; my $text = $_; print "sending '" . $text . "'\n"; # Use "h" request to define reply expected from the server. print $cwsocket chr(27) . "h" . $expected; # Send text to be played by server. print $cwsocket $text; # Leading 'h' will be stripped from reply by cwtest_receive(). my $reply = cwtest_receive($cwsocket, "h"); $global_t3++; if ($reply ne $expected) { $global_e3++; die "die 3, incorrect reply: '$reply' != '$expected'\n";; } print "\n"; # To clearly separate pairs of send/reply from each other. sleep $in_loop_sleep; } } # This function sends following to the server: # "^" # # This function expects the following reply from the server: # "\r\n" sub cwtest_send_4 { my $cwsocket = shift; my $txt = shift; for (my $i = 0; $i < length($txt); $i++) { my $text = substr($txt, $i, 1); print "sending '" . $text . "'\n"; # "^" after the text tells the server to use text from the request # as a text of reply. print $cwsocket $text . '^'; my $reply = cwtest_receive($cwsocket, ""); $global_t4++; if ($reply ne $text) { $global_e4++; die "die 4, incorrect text in reply: '$reply' != '$text'\n"; } print "\n"; # To clearly separate pairs of send/reply from each other. sleep $in_loop_sleep; } } # This function sends following request to the server: # "^" # # This function expects the following reply from the server: # "\r\n" sub cwtest_send_5 { my $cwsocket = shift; my $txt = shift; my @tokens = split(/ /, $txt); foreach (@tokens) { my $text = $_; print "sending '" . $text . "'\n"; # "^" after the text tells the server to use text from the request # as a text of reply. print $cwsocket $text . '^'; my $reply = cwtest_receive($cwsocket, ""); $global_t5++; if ($reply ne $text) { $global_e5++; die "die 5, incorrect text in reply: '$reply' != '$text'\n"; } print "\n"; # To clearly separate pairs of send/reply from each other. sleep $in_loop_sleep; } } # Also used as receive routine in cwtest_send_2. sub cwtest_receive { my $cwsocket = shift; my $expected_prefix = shift; my $expected_postfix = "\r\n"; my $pre_len = length($expected_prefix); my $post_len = length($expected_postfix); my $reply = <$cwsocket>; if (substr($reply, 0, $pre_len) ne $expected_prefix) { print("malformed reply, missing leading '$expected_prefix'"); return ""; } if (substr($reply, length($reply) - $post_len, $post_len) ne $expected_postfix) { print("malformed reply, missing ending '\\r\\n'"); return ""; } $reply = substr($reply, $pre_len, length($reply) - $pre_len - $post_len); print("received "); if ($pre_len) { print("'" . $expected_prefix . "' + "); } print("'" . $reply . "' + '\\r\\n'\n"); # At this point 'reply' may be an empty string. return $reply; } sub cwtest_print_stats { my $cycle = shift; my $cycles = shift; printf("\n=================================================\n"); printf("Finished cycle " . ($cycle + 1) . " / $cycles\n"); printf("Stats 1: $global_e1 errors / $global_t1 tokens ("); if ($global_t1) { printf("%.4f%%", 1.0 * $global_e1 / $global_t1); } else { printf("%.4f%%", 0.0); } printf(")\n"); printf("Stats 2: $global_e2 errors / $global_t2 tokens ("); if ($global_t2) { printf("%.4f%%", 1.0 * $global_e2 / $global_t2); } else { printf("%.4f%%", 0.0); } printf(")\n"); printf("Stats 3: $global_e3 errors / $global_t3 tokens ("); if ($global_t3) { printf("%.4f%%", 1.0 * $global_e3 / $global_t3); } else { printf("%.4f%%", 0.0); } printf(")\n"); printf("Stats 4: $global_e4 errors / $global_t4 tokens ("); if ($global_t4) { printf("%.4f%%", 1.0 * $global_e4 / $global_t4); } else { printf("%.4f%%", 0.0); } printf(")\n"); printf("Stats 5: $global_e5 errors / $global_t5 tokens ("); if ($global_t5) { printf("%.4f%%", 1.0 * $global_e5 / $global_t5); } else { printf("%.4f%%", 0.0); } printf(")\n"); printf("=================================================\n\n"); } cwdaemon-0.10.1/test/Makefile0000644000175000017500000003747412326006362012745 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # test/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. # Copyright (C) 2003, 2006 Joop Stakenborg # Copyright (C) 2012 - 2014 Kamil Ignacak (acerion@wp.pl) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/cwdaemon pkgincludedir = $(includedir)/cwdaemon pkglibdir = $(libdir)/cwdaemon pkglibexecdir = $(libexecdir)/cwdaemon am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = cwtest$(EXEEXT) subdir = test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_cwtest_OBJECTS = cwtest.$(OBJEXT) cwtest_OBJECTS = $(am_cwtest_OBJECTS) cwtest_LDADD = $(LDADD) AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I. -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_$(V)) am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_$(V)) am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(cwtest_SOURCES) DIST_SOURCES = $(cwtest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = aclocal-1.14 AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AUTOCONF = autoconf AUTOHEADER = autoheader AUTOMAKE = automake-1.14 AWK = gawk CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -Wall -W -pedantic -Wfloat-equal -Wpointer-arith -Wcast-qual -Wwrite-strings -Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations -Wredundant-decls -std=c99 CPP = gcc -E CPPFLAGS = CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps ECHO_C = ECHO_N = -n ECHO_T = EGREP = /bin/grep -E EXEEXT = GREP = /bin/grep INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s LDFLAGS = LIBOBJS = LIBS = LTLIBOBJS = MAINT = # MAKEINFO = makeinfo MKDIR_P = /bin/mkdir -p OBJEXT = o PACKAGE = cwdaemon PACKAGE_BUGREPORT = acerion@wp.pl PACKAGE_NAME = cwdaemon PACKAGE_STRING = cwdaemon 0.10.1 PACKAGE_TARNAME = cwdaemon PACKAGE_URL = PACKAGE_VERSION = 0.10.1 PATH_SEPARATOR = : PKG_CONFIG = /usr/bin/pkg-config PKG_CONFIG_LIBDIR = PKG_CONFIG_PATH = RPMBUILD = rpmbuild SET_MAKE = SHELL = /bin/bash STRIP = UNIXCW_CFLAGS = UNIXCW_LIBS = -lcw VERSION = 0.10.1 abs_builddir = /home/acerion/current/cwdaemon/git_repo/cwdaemon/test abs_srcdir = /home/acerion/current/cwdaemon/git_repo/cwdaemon/test abs_top_builddir = /home/acerion/current/cwdaemon/git_repo/cwdaemon abs_top_srcdir = /home/acerion/current/cwdaemon/git_repo/cwdaemon ac_ct_CC = gcc am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build_alias = builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} host_alias = htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /home/acerion/current/cwdaemon/git_repo/cwdaemon/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../ top_builddir = .. top_srcdir = .. # source code files used to build cwtest program cwtest_SOURCES = cwtest.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: # $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: # $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): # $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) cwtest$(EXEEXT): $(cwtest_OBJECTS) $(cwtest_DEPENDENCIES) $(EXTRA_cwtest_DEPENDENCIES) @rm -f cwtest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cwtest_OBJECTS) $(cwtest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c include ./$(DEPDIR)/cwtest.Po .c.o: $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CC)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ # $(AM_V_CC_no)$(COMPILE) -c -o $@ $< .c.obj: $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po # $(AM_V_CC)source='$<' object='$@' libtool=no \ # DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \ # $(AM_V_CC_no)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # target-specific preprocessor flags (#defs and include dirs) # cwtest_CPPFLAGS = # target-specific linker flags (objects to link) # cwtest_LDADD = # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cwdaemon-0.10.1/test/Makefile.in0000644000175000017500000004012112326006126013327 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ # Copyright (C) 2003, 2006 Joop Stakenborg # Copyright (C) 2012 - 2014 Kamil Ignacak (acerion@wp.pl) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : noinst_PROGRAMS = cwtest$(EXEEXT) subdir = test DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = PROGRAMS = $(noinst_PROGRAMS) am_cwtest_OBJECTS = cwtest.$(OBJEXT) cwtest_OBJECTS = $(am_cwtest_OBJECTS) cwtest_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(cwtest_SOURCES) DIST_SOURCES = $(cwtest_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RPMBUILD = @RPMBUILD@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UNIXCW_CFLAGS = @UNIXCW_CFLAGS@ UNIXCW_LIBS = @UNIXCW_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ # source code files used to build cwtest program cwtest_SOURCES = cwtest.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu test/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu test/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) cwtest$(EXEEXT): $(cwtest_OBJECTS) $(cwtest_DEPENDENCIES) $(EXTRA_cwtest_DEPENDENCIES) @rm -f cwtest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(cwtest_OBJECTS) $(cwtest_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cwtest.Po@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) installdirs: install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic clean-noinstPROGRAMS mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ clean-noinstPROGRAMS cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-tags distdir dvi \ dvi-am html html-am info info-am install install-am \ install-data install-data-am install-dvi install-dvi-am \ install-exec install-exec-am install-html install-html-am \ install-info install-info-am install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am # target-specific preprocessor flags (#defs and include dirs) # cwtest_CPPFLAGS = # target-specific linker flags (objects to link) # cwtest_LDADD = # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cwdaemon-0.10.1/cwdaemon.spec.in0000644000175000017500000000306712263357260013401 00000000000000# cwdaemon.spec # # Copyright (C) 2003 - 2004 Joop Stakenborg pg4i@amsat.org # Copyright (C) 2012 - 2014 Kamil Ignacak # %define name cwdaemon %define version @VERSION@ %define release 1 # required items Name: %{name} Version: %{version} Release: %{release} Copyright: GPL Group: Daemons Prefix: /usr BuildRoot: /var/tmp/%{name}-%{version} Summary: Morse daemon for the parallel or serial port Vendor: Kamil Ignacak URL: http://cwdaemon.sourceforge.net/ Packager: Kamil Ignacak Source: %{name}-%{version}.tar.gz %description Cwdaemon is a small daemon which uses the pc parallel or serial port and a simple transistor switch to output morse code to a transmitter from a text message sent to it via the udp internet protocol. %prep %setup -q %build export RPM_OPT_FLAGS="-O2 -march=i386" export CFLAGS="-O2" %configure make %install rm -rf $RPM_BUILD_ROOT mkdir -p $RPM_BUILD_ROOT make DESTDIR=$RPM_BUILD_ROOT install %clean rm -rf $RPM_BUILD_ROOT %files %defattr(-,root,root) %doc ChangeLog /usr/sbin/cwdaemon /usr/share/man/man8/cwdaemon.8.gz /usr/share/cwdaemon/README /usr/share/cwdaemon/parallelport_circuit.ps /usr/share/cwdaemon/serialport_circuit.ps /usr/share/cwdaemon/parallelport_circuit.jpg /usr/share/cwdaemon/serialport_circuit.jpg /usr/share/cwdaemon/cwtest.sh /usr/share/cwdaemon/cwsetup.sh /usr/share/cwdaemon/cwtest.c /usr/share/cwdaemon/cwdaemon.png %changelog * Sat Jan 18 2003 Joop Stakenborg - Initial spec file * Tue Jul 03 2012 Kamil Ignacak - Updating the file after taking the project over by new maintainer. cwdaemon-0.10.1/AUTHORS0000644000175000017500000000066611774534455011406 00000000000000Contributions from the following people: Joop Stakenborg, PG4I (Code Maintainer) Rein Couperus, PA0R Wolf-Ruediger Juergens, DL2WRJ Ladislav Vaiz, OK1ZIA Simon Baldwin, G0FRD (unixcw libraries) Diane Bruce, VA3DB (FreeBSD support) Jason L. Wright, AI4JW (OpenBSD support) Jenö Vágó, HA5SEcwdaemon-0.10.1/cwsetup.sh0000755000175000017500000000156511737345114012355 00000000000000#!/bin/sh PATH="/bin:/sbin:/usr/bin:/usr/bin:/usr/local/bin:/usr/local/sbin:." # check if we are root if [ "$(id -u)" != "0" ]; then echo "You must run this script as root..." exit 1 fi job=0 echo "Checking what needs to be done" # check for parport devices if [ ! -c /dev/parport0 ]; then echo "Creating parport devices" DIR=`pwd` cd /dev MAKEDEV parport cd $DIR job=1 fi # check for kernel modules if ! lsmod|grep parport > /dev/null; then echo "Loading parport modules" modprobe parport_pc modprobe parport job=1 fi if lsmod|grep lp|grep " 0 " > /dev/null; then echo "Unloading lp module" rmmod lp job=1 fi if ! lsmod|grep ppdev > /dev/null; then echo "Loading ppdev module" modprobe ppdev job=1 fi if [ $job -eq 1 ]; then echo "Setup is ready" else echo "Nothing to do, your setup is okay" fi echo "Please run \"cwdaemon -n\" (as root) for diagnosis" cwdaemon-0.10.1/config.sub0000755000175000017500000007577710376045043012323 00000000000000#! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-07-08' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32r | m32rle | m68000 | m68k | m88k | maxq | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | ms1 \ | msp430 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b \ | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m32c) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | ms1-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; m32c-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cwdaemon-0.10.1/aclocal.m40000644000175000017500000014210612326006124012147 00000000000000# generated automatically by aclocal 1.14.1 -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, [m4_warning([this file was generated for autoconf 2.69. You have another version of autoconf. It may work, but is not guaranteed to. If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) # pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- # serial 1 (pkg-config-0.24) # # Copyright © 2004 Scott James Remnant . # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # PKG_PROG_PKG_CONFIG([MIN-VERSION]) # ---------------------------------- AC_DEFUN([PKG_PROG_PKG_CONFIG], [m4_pattern_forbid([^_?PKG_[A-Z_]+$]) m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) fi if test -n "$PKG_CONFIG"; then _pkg_min_version=m4_default([$1], [0.9.0]) AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) PKG_CONFIG="" fi fi[]dnl ])# PKG_PROG_PKG_CONFIG # PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) # # Check to see whether a particular set of modules exists. Similar # to PKG_CHECK_MODULES(), but does not set variables or print errors. # # Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) # only at the first occurence in configure.ac, so if the first place # it's called might be skipped (such as if it is within an "if", you # have to call PKG_CHECK_EXISTS manually # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_EXISTS], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl if test -n "$PKG_CONFIG" && \ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then m4_default([$2], [:]) m4_ifvaln([$3], [else $3])dnl fi]) # _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) # --------------------------------------------- m4_define([_PKG_CONFIG], [if test -n "$$1"; then pkg_cv_[]$1="$$1" elif test -n "$PKG_CONFIG"; then PKG_CHECK_EXISTS([$3], [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` test "x$?" != "x0" && pkg_failed=yes ], [pkg_failed=yes]) else pkg_failed=untried fi[]dnl ])# _PKG_CONFIG # _PKG_SHORT_ERRORS_SUPPORTED # ----------------------------- AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], [AC_REQUIRE([PKG_PROG_PKG_CONFIG]) if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then _pkg_short_errors_supported=yes else _pkg_short_errors_supported=no fi[]dnl ])# _PKG_SHORT_ERRORS_SUPPORTED # PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], # [ACTION-IF-NOT-FOUND]) # # # Note that if there is a possibility the first call to # PKG_CHECK_MODULES might not happen, you should be sure to include an # explicit call to PKG_PROG_PKG_CONFIG in your configure.ac # # # -------------------------------------------------------------- AC_DEFUN([PKG_CHECK_MODULES], [AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl pkg_failed=no AC_MSG_CHECKING([for $1]) _PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) _PKG_CONFIG([$1][_LIBS], [libs], [$2]) m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS and $1[]_LIBS to avoid the need to call pkg-config. See the pkg-config man page for more details.]) if test $pkg_failed = yes; then AC_MSG_RESULT([no]) _PKG_SHORT_ERRORS_SUPPORTED if test $_pkg_short_errors_supported = yes; then $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` else $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` fi # Put the nasty error message in config.log where it belongs echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD m4_default([$4], [AC_MSG_ERROR( [Package requirements ($2) were not met: $$1_PKG_ERRORS Consider adjusting the PKG_CONFIG_PATH environment variable if you installed software in a non-standard prefix. _PKG_TEXT])[]dnl ]) elif test $pkg_failed = untried; then AC_MSG_RESULT([no]) m4_default([$4], [AC_MSG_FAILURE( [The pkg-config script could not be found or is too old. Make sure it is in your PATH or set the PKG_CONFIG environment variable to the full path to pkg-config. _PKG_TEXT To get pkg-config, see .])[]dnl ]) else $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS $1[]_LIBS=$pkg_cv_[]$1[]_LIBS AC_MSG_RESULT([yes]) $3 fi[]dnl ])# PKG_CHECK_MODULES # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_AUTOMAKE_VERSION(VERSION) # ---------------------------- # Automake X.Y traces this macro to ensure aclocal.m4 has been # generated from the m4 files accompanying Automake X.Y. # (This private macro should not be called outside this file.) AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version='1.14' dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to dnl require some minimum version. Point them to the right macro. m4_if([$1], [1.14.1], [], [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl ]) # _AM_AUTOCONF_VERSION(VERSION) # ----------------------------- # aclocal traces this macro to find the Autoconf version. # This is a private macro too. Using m4_define simplifies # the logic in aclocal, which can simply ignore this definition. m4_define([_AM_AUTOCONF_VERSION], []) # AM_SET_CURRENT_AUTOMAKE_VERSION # ------------------------------- # Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. # This function is AC_REQUIREd by AM_INIT_AUTOMAKE. AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], [AM_AUTOMAKE_VERSION([1.14.1])dnl m4_ifndef([AC_AUTOCONF_VERSION], [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl _AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) # AM_AUX_DIR_EXPAND -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets # $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to # '$srcdir', '$srcdir/..', or '$srcdir/../..'. # # Of course, Automake must honor this variable whenever it calls a # tool from the auxiliary directory. The problem is that $srcdir (and # therefore $ac_aux_dir as well) can be either absolute or relative, # depending on how configure is run. This is pretty annoying, since # it makes $ac_aux_dir quite unusable in subdirectories: in the top # source directory, any form will work fine, but in subdirectories a # relative path needs to be adjusted first. # # $ac_aux_dir/missing # fails when called from a subdirectory if $ac_aux_dir is relative # $top_srcdir/$ac_aux_dir/missing # fails if $ac_aux_dir is absolute, # fails when called from a subdirectory in a VPATH build with # a relative $ac_aux_dir # # The reason of the latter failure is that $top_srcdir and $ac_aux_dir # are both prefixed by $srcdir. In an in-source build this is usually # harmless because $srcdir is '.', but things will broke when you # start a VPATH build or use an absolute $srcdir. # # So we could use something similar to $top_srcdir/$ac_aux_dir/missing, # iff we strip the leading $srcdir from $ac_aux_dir. That would be: # am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` # and then we would define $MISSING as # MISSING="\${SHELL} $am_aux_dir/missing" # This will work as long as MISSING is not called from configure, because # unfortunately $(top_srcdir) has no meaning in configure. # However there are other variables, like CC, which are often used in # configure, and could therefore not use this "fixed" $ac_aux_dir. # # Another solution, used here, is to always expand $ac_aux_dir to an # absolute PATH. The drawback is that using absolute paths prevent a # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_CONDITIONAL(NAME, SHELL-CONDITION) # ------------------------------------- # Define a conditional. AC_DEFUN([AM_CONDITIONAL], [AC_PREREQ([2.52])dnl m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl AC_SUBST([$1_TRUE])dnl AC_SUBST([$1_FALSE])dnl _AM_SUBST_NOTMAKE([$1_TRUE])dnl _AM_SUBST_NOTMAKE([$1_FALSE])dnl m4_define([_AM_COND_VALUE_$1], [$2])dnl if $2; then $1_TRUE= $1_FALSE='#' else $1_TRUE='#' $1_FALSE= fi AC_CONFIG_COMMANDS_PRE( [if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then AC_MSG_ERROR([[conditional "$1" was never defined. Usually this means the macro was only invoked conditionally.]]) fi])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be # written in clear, in which case automake, when reading aclocal.m4, # will think it sees a *use*, and therefore will trigger all it's # C support machinery. Also note that it means that autoscan, seeing # CC etc. in the Makefile, will ask for an AC_PROG_CC use... # _AM_DEPENDENCIES(NAME) # ---------------------- # See how the compiler implements dependency checking. # NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". # We try a few techniques and use that to set a single cache variable. # # We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was # modified to invoke _AM_DEPENDENCIES(CC); we would have a circular # dependency, and given that the user is not expected to run this macro, # just rely on AC_PROG_CC. AC_DEFUN([_AM_DEPENDENCIES], [AC_REQUIRE([AM_SET_DEPDIR])dnl AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl AC_REQUIRE([AM_MAKE_INCLUDE])dnl AC_REQUIRE([AM_DEP_TRACK])dnl m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], [$1], [CXX], [depcc="$CXX" am_compiler_list=], [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], [$1], [UPC], [depcc="$UPC" am_compiler_list=], [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], [depcc="$$1" am_compiler_list=]) AC_CACHE_CHECK([dependency style of $depcc], [am_cv_$1_dependencies_compiler_type], [if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then # We make a subdir and do the tests there. Otherwise we can end up # making bogus files that we don't know about and never remove. For # instance it was reported that on HP-UX the gcc test will end up # making a dummy file named 'D' -- because '-MD' means "put the output # in D". rm -rf conftest.dir mkdir conftest.dir # Copy depcomp to subdir because otherwise we won't find it if we're # using a relative directory. cp "$am_depcomp" conftest.dir cd conftest.dir # We will build objects and dependencies in a subdirectory because # it helps to detect inapplicable dependency modes. For instance # both Tru64's cc and ICC support -MD to output dependencies as a # side effect of compilation, but ICC will put the dependencies in # the current directory while Tru64 will put them in the object # directory. mkdir sub am_cv_$1_dependencies_compiler_type=none if test "$am_compiler_list" = ""; then am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` fi am__universal=false m4_case([$1], [CC], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac], [CXX], [case " $depcc " in #( *\ -arch\ *\ -arch\ *) am__universal=true ;; esac]) for depmode in $am_compiler_list; do # Setup a source with many dependencies, because some compilers # like to wrap large dependency lists on column 80 (with \), and # we should not choose a depcomp mode which is confused by this. # # We need to recreate these files for each test, as the compiler may # overwrite some of them when testing with obscure command lines. # This happens at least with the AIX C compiler. : > sub/conftest.c for i in 1 2 3 4 5 6; do echo '#include "conftst'$i'.h"' >> sub/conftest.c # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with # Solaris 10 /bin/sh. echo '/* dummy */' > sub/conftst$i.h done echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf # We check with '-c' and '-o' for the sake of the "dashmstdout" # mode. It turns out that the SunPro C++ compiler does not properly # handle '-M -o', and we need to detect this. Also, some Intel # versions had trouble with output in subdirs. am__obj=sub/conftest.${OBJEXT-o} am__minus_obj="-o $am__obj" case $depmode in gcc) # This depmode causes a compiler race in universal mode. test "$am__universal" = false || continue ;; nosideeffect) # After this tag, mechanisms are not by side-effect, so they'll # only be used when explicitly requested. if test "x$enable_dependency_tracking" = xyes; then continue else break fi ;; msvc7 | msvc7msys | msvisualcpp | msvcmsys) # This compiler won't grok '-c -o', but also, the minuso test has # not run yet. These depmodes are late enough in the game, and # so weak that their functioning should not be impacted. am__obj=conftest.${OBJEXT-o} am__minus_obj= ;; none) break ;; esac if depmode=$depmode \ source=sub/conftest.c object=$am__obj \ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ >/dev/null 2>conftest.err && grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && grep $am__obj sub/conftest.Po > /dev/null 2>&1 && ${MAKE-make} -s -f confmf > /dev/null 2>&1; then # icc doesn't choke on unknown options, it will just issue warnings # or remarks (even with -Werror). So we grep stderr for any message # that says an option was ignored or not supported. # When given -MP, icc 7.0 and 7.1 complain thusly: # icc: Command line warning: ignoring option '-M'; no argument required # The diagnosis changed in icc 8.0: # icc: Command line remark: option '-MP' not supported if (grep 'ignoring option' conftest.err || grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else am_cv_$1_dependencies_compiler_type=$depmode break fi fi done cd .. rm -rf conftest.dir else am_cv_$1_dependencies_compiler_type=none fi ]) AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) AM_CONDITIONAL([am__fastdep$1], [ test "x$enable_dependency_tracking" != xno \ && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) ]) # AM_SET_DEPDIR # ------------- # Choose a directory name for dependency files. # This macro is AC_REQUIREd in _AM_DEPENDENCIES. AC_DEFUN([AM_SET_DEPDIR], [AC_REQUIRE([AM_SET_LEADING_DOT])dnl AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl ]) # AM_DEP_TRACK # ------------ AC_DEFUN([AM_DEP_TRACK], [AC_ARG_ENABLE([dependency-tracking], [dnl AS_HELP_STRING( [--enable-dependency-tracking], [do not reject slow dependency extractors]) AS_HELP_STRING( [--disable-dependency-tracking], [speeds up one-time build])]) if test "x$enable_dependency_tracking" != xno; then am_depcomp="$ac_aux_dir/depcomp" AMDEPBACKSLASH='\' am__nodep='_no' fi AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) AC_SUBST([AMDEPBACKSLASH])dnl _AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl AC_SUBST([am__nodep])dnl _AM_SUBST_NOTMAKE([am__nodep])dnl ]) # Generate code to set up dependency tracking. -*- Autoconf -*- # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_OUTPUT_DEPENDENCY_COMMANDS # ------------------------------ AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], [{ # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`AS_DIRNAME("$mf")` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`AS_DIRNAME(["$file"])` AS_MKDIR_P([$dirpart/$fdir]) # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ])# _AM_OUTPUT_DEPENDENCY_COMMANDS # AM_OUTPUT_DEPENDENCY_COMMANDS # ----------------------------- # This macro should only be invoked once -- use via AC_REQUIRE. # # This code is only required when automatic dependency tracking # is enabled. FIXME. This creates each '.P' file that we will # need in order to bootstrap the dependency handling code. AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], [AC_CONFIG_COMMANDS([depfiles], [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) ]) # Do all the work for Automake. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This macro actually does too much. Some checks are only needed if # your package does certain things. But this isn't really a big deal. dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC]) [_AM_PROG_CC_C_O ]) # AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) # AM_INIT_AUTOMAKE([OPTIONS]) # ----------------------------------------------- # The call with PACKAGE and VERSION arguments is the old style # call (pre autoconf-2.50), which is being phased out. PACKAGE # and VERSION should now be passed to AC_INIT and removed from # the call to AM_INIT_AUTOMAKE. # We support both call styles for the transition. After # the next Automake release, Autoconf can make the AC_INIT # arguments mandatory, and then we can depend on a new Autoconf # release and drop the old call support. AC_DEFUN([AM_INIT_AUTOMAKE], [AC_PREREQ([2.65])dnl dnl Autoconf wants to disallow AM_ names. We explicitly allow dnl the ones we care about. m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl AC_REQUIRE([AC_PROG_INSTALL])dnl if test "`cd $srcdir && pwd`" != "`pwd`"; then # Use -I$(srcdir) only when $(srcdir) != ., so that make's output # is not polluted with repeated "-I." AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl # test to see if srcdir already configured if test -f $srcdir/config.status; then AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) fi fi # test whether we have cygpath if test -z "$CYGPATH_W"; then if (cygpath --version) >/dev/null 2>/dev/null; then CYGPATH_W='cygpath -w' else CYGPATH_W=echo fi fi AC_SUBST([CYGPATH_W]) # Define the identity of the package. dnl Distinguish between old-style and new-style calls. m4_ifval([$2], [AC_DIAGNOSE([obsolete], [$0: two- and three-arguments forms are deprecated.]) m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl AC_SUBST([PACKAGE], [$1])dnl AC_SUBST([VERSION], [$2])], [_AM_SET_OPTIONS([$1])dnl dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. m4_if( m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), [ok:ok],, [m4_fatal([AC_INIT should be called with package and version arguments])])dnl AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl _AM_IF_OPTION([no-define],, [AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl # Some tools Automake needs. AC_REQUIRE([AM_SANITY_CHECK])dnl AC_REQUIRE([AC_ARG_PROGRAM])dnl AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) AM_MISSING_PROG([AUTOCONF], [autoconf]) AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) AM_MISSING_PROG([AUTOHEADER], [autoheader]) AM_MISSING_PROG([MAKEINFO], [makeinfo]) AC_REQUIRE([AM_PROG_INSTALL_SH])dnl AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl AC_REQUIRE([AC_PROG_MKDIR_P])dnl # For better backward compatibility. To be removed once Automake 1.9.x # dies out for good. For more background, see: # # AC_SUBST([mkdir_p], ['$(MKDIR_P)']) # We need awk for the "check" target. The system "awk" is bad on # some platforms. AC_REQUIRE([AC_PROG_AWK])dnl AC_REQUIRE([AC_PROG_MAKE_SET])dnl AC_REQUIRE([AM_SET_LEADING_DOT])dnl _AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], [_AM_PROG_TAR([v7])])]) _AM_IF_OPTION([no-dependencies],, [AC_PROVIDE_IFELSE([AC_PROG_CC], [_AM_DEPENDENCIES([CC])], [m4_define([AC_PROG_CC], m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_CXX], [_AM_DEPENDENCIES([CXX])], [m4_define([AC_PROG_CXX], m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJC], [_AM_DEPENDENCIES([OBJC])], [m4_define([AC_PROG_OBJC], m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], [_AM_DEPENDENCIES([OBJCXX])], [m4_define([AC_PROG_OBJCXX], m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl ]) AC_REQUIRE([AM_SILENT_RULES])dnl dnl The testsuite driver may need to know about EXEEXT, so add the dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. AC_CONFIG_COMMANDS_PRE(dnl [m4_provide_if([_AM_COMPILER_EXEEXT], [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl # POSIX will say in a future version that running "rm -f" with no argument # is OK; and we want to be able to make that assumption in our Makefile # recipes. So use an aggressive probe to check that the usage we want is # actually supported "in the wild" to an acceptable degree. # See automake bug#10828. # To make any issue more visible, cause the running configure to be aborted # by default if the 'rm' program in use doesn't match our expectations; the # user can still override this though. if rm -f && rm -fr && rm -rf; then : OK; else cat >&2 <<'END' Oops! Your 'rm' program seems unable to run without file operands specified on the command line, even when the '-f' option is present. This is contrary to the behaviour of most rm programs out there, and not conforming with the upcoming POSIX standard: Please tell bug-automake@gnu.org about your system, including the value of your $PATH and any error possibly output before this message. This can help us improve future automake versions. END if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then echo 'Configuration will proceed anyway, since you have set the' >&2 echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 echo >&2 else cat >&2 <<'END' Aborting the configuration process, to ensure you take notice of the issue. You can download and install GNU coreutils to get an 'rm' implementation that behaves properly: . If you want to complete the configuration process using your problematic 'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM to "yes", and re-run configure. END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi fi ]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further dnl mangled by Autoconf and run in a shell conditional statement. m4_define([_AC_COMPILER_EXEEXT], m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) # When config.status generates a header, we must update the stamp-h file. # This file resides in the same directory as the config header # that is generated. The stamp files are numbered to have different names. # Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the # loop where config.status creates the headers, so we can generate # our stamp files there. AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], [# Compute $1's index in $config_headers. _am_arg=$1 _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_SH # ------------------ # Define $install_sh. AC_DEFUN([AM_PROG_INSTALL_SH], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl if test x"${install_sh}" != xset; then case $am_aux_dir in *\ * | *\ *) install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; *) install_sh="\${SHELL} $am_aux_dir/install-sh" esac fi AC_SUBST([install_sh])]) # Copyright (C) 2003-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # Check whether the underlying file-system supports filenames # with a leading dot. For instance MS-DOS doesn't. AC_DEFUN([AM_SET_LEADING_DOT], [rm -rf .tst 2>/dev/null mkdir .tst 2>/dev/null if test -d .tst; then am__leading_dot=. else am__leading_dot=_ fi rmdir .tst 2>/dev/null AC_SUBST([am__leading_dot])]) # Add --enable-maintainer-mode option to configure. -*- Autoconf -*- # From Jim Meyering # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAINTAINER_MODE([DEFAULT-MODE]) # ---------------------------------- # Control maintainer-specific portions of Makefiles. # Default is to disable them, unless 'enable' is passed literally. # For symmetry, 'disable' may be passed as well. Anyway, the user # can override the default with the --enable/--disable switch. AC_DEFUN([AM_MAINTAINER_MODE], [m4_case(m4_default([$1], [disable]), [enable], [m4_define([am_maintainer_other], [disable])], [disable], [m4_define([am_maintainer_other], [enable])], [m4_define([am_maintainer_other], [enable]) m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])]) AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles]) dnl maintainer-mode's default is 'disable' unless 'enable' is passed AC_ARG_ENABLE([maintainer-mode], [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode], am_maintainer_other[ make rules and dependencies not useful (and sometimes confusing) to the casual installer])], [USE_MAINTAINER_MODE=$enableval], [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes])) AC_MSG_RESULT([$USE_MAINTAINER_MODE]) AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes]) MAINT=$MAINTAINER_MODE_TRUE AC_SUBST([MAINT])dnl ] ) # Check to see how 'make' treats includes. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MAKE_INCLUDE() # ----------------- # Check to see how make treats includes. AC_DEFUN([AM_MAKE_INCLUDE], [am_make=${MAKE-make} cat > confinc << 'END' am__doit: @echo this is the am__doit target .PHONY: am__doit END # If we don't find an include directive, just comment out the code. AC_MSG_CHECKING([for style of include used by $am_make]) am__include="#" am__quote= _am_result=none # First try GNU make style include. echo "include confinc" > confmf # Ignore all kinds of additional output from 'make'. case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=include am__quote= _am_result=GNU ;; esac # Now try BSD make style include. if test "$am__include" = "#"; then echo '.include "confinc"' > confmf case `$am_make -s -f confmf 2> /dev/null` in #( *the\ am__doit\ target*) am__include=.include am__quote="\"" _am_result=BSD ;; esac fi AC_SUBST([am__include]) AC_SUBST([am__quote]) AC_MSG_RESULT([$_am_result]) rm -f confinc confmf ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_MISSING_PROG(NAME, PROGRAM) # ------------------------------ AC_DEFUN([AM_MISSING_PROG], [AC_REQUIRE([AM_MISSING_HAS_RUN]) $1=${$1-"${am_missing_run}$2"} AC_SUBST($1)]) # AM_MISSING_HAS_RUN # ------------------ # Define MISSING if not defined so far and test if it is modern enough. # If it is, set am_missing_run to use it, otherwise, to nothing. AC_DEFUN([AM_MISSING_HAS_RUN], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([missing])dnl if test x"${MISSING+set}" != xset; then case $am_aux_dir in *\ * | *\ *) MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; *) MISSING="\${SHELL} $am_aux_dir/missing" ;; esac fi # Use eval to expand $SHELL if eval "$MISSING --is-lightweight"; then am_missing_run="$MISSING " else am_missing_run= AC_MSG_WARN(['missing' script is too old or missing]) fi ]) # -*- Autoconf -*- # Obsolete and "removed" macros, that must however still report explicit # error messages when used, to smooth transition. # # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. AC_DEFUN([AM_CONFIG_HEADER], [AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should use the 'AC][_CONFIG_HEADERS' macro instead.])dnl AC_CONFIG_HEADERS($@)]) AC_DEFUN([AM_PROG_CC_STDC], [AC_PROG_CC am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc AC_DIAGNOSE([obsolete], ['$0': this macro is obsolete. You should simply use the 'AC][_PROG_CC' macro instead. Also, your code should no longer depend upon 'am_cv_prog_cc_stdc', but upon 'ac_cv_prog_cc_stdc'.])]) AC_DEFUN([AM_C_PROTOTYPES], [AC_FATAL([automatic de-ANSI-fication support has been removed])]) AU_DEFUN([fp_C_PROTOTYPES], [AM_C_PROTOTYPES]) # Helper functions for option handling. -*- Autoconf -*- # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_MANGLE_OPTION(NAME) # ----------------------- AC_DEFUN([_AM_MANGLE_OPTION], [[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) # _AM_SET_OPTION(NAME) # -------------------- # Set option NAME. Presently that only means defining a flag for this option. AC_DEFUN([_AM_SET_OPTION], [m4_define(_AM_MANGLE_OPTION([$1]), [1])]) # _AM_SET_OPTIONS(OPTIONS) # ------------------------ # OPTIONS is a space-separated list of Automake options. AC_DEFUN([_AM_SET_OPTIONS], [m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) # _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) # ------------------------------------------- # Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. AC_DEFUN([_AM_IF_OPTION], [m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) # Copyright (C) 1999-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_CC_C_O # --------------- # Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC # to automatically call this. AC_DEFUN([_AM_PROG_CC_C_O], [AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl AC_LANG_PUSH([C])dnl AC_CACHE_CHECK( [whether $CC understands -c and -o together], [am_cv_prog_cc_c_o], [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) # Make sure it works both with $CC and with simple cc. # Following AC_PROG_CC_C_O, we do the test twice because some # compilers refuse to overwrite an existing .o file with -o, # though they will create one. am_cv_prog_cc_c_o=yes for am_i in 1 2; do if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ && test -f conftest2.$ac_objext; then : OK else am_cv_prog_cc_c_o=no break fi done rm -f core conftest* unset am_i]) if test "$am_cv_prog_cc_c_o" != yes; then # Losing compiler, so override with the script. # FIXME: It is wrong to rewrite CC. # But if we don't then we get into trouble of one sort or another. # A longer-term fix would be to have automake use am__CC in this case, # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" CC="$am_aux_dir/compile $CC" fi AC_LANG_POP([C])]) # For backward compatibility. AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_RUN_LOG(COMMAND) # ------------------- # Run COMMAND, save the exit status in ac_status, and log it. # (This has been adapted from Autoconf's _AC_RUN_LOG macro.) AC_DEFUN([AM_RUN_LOG], [{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ac_status=$? echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD (exit $ac_status); }]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SANITY_CHECK # --------------- AC_DEFUN([AM_SANITY_CHECK], [AC_MSG_CHECKING([whether build environment is sane]) # Reject unsafe characters in $srcdir or the absolute working directory # name. Accept space and tab only in the latter. am_lf=' ' case `pwd` in *[[\\\"\#\$\&\'\`$am_lf]]*) AC_MSG_ERROR([unsafe absolute working directory name]);; esac case $srcdir in *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; esac # Do 'set' in a subshell so we don't clobber the current shell's # arguments. Must try -L first in case configure is actually a # symlink; some systems play weird games with the mod time of symlinks # (eg FreeBSD returns the mod time of the symlink's containing # directory). if ( am_has_slept=no for am_try in 1 2; do echo "timestamp, slept: $am_has_slept" > conftest.file set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` if test "$[*]" = "X"; then # -L didn't work. set X `ls -t "$srcdir/configure" conftest.file` fi if test "$[*]" != "X $srcdir/configure conftest.file" \ && test "$[*]" != "X conftest.file $srcdir/configure"; then # If neither matched, then we have a broken ls. This can happen # if, for instance, CONFIG_SHELL is bash and it inherits a # broken ls alias from the environment. This has actually # happened. Such a system could not be considered "sane". AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken alias in your environment]) fi if test "$[2]" = conftest.file || test $am_try -eq 2; then break fi # Just in case. sleep 1 am_has_slept=yes done test "$[2]" = conftest.file ) then # Ok. : else AC_MSG_ERROR([newly created file is older than distributed files! Check your system clock]) fi AC_MSG_RESULT([yes]) # If we didn't sleep, we still need to ensure time stamps of config.status and # generated files are strictly newer. am_sleep_pid= if grep 'slept: no' conftest.file >/dev/null 2>&1; then ( sleep 1 ) & am_sleep_pid=$! fi AC_CONFIG_COMMANDS_PRE( [AC_MSG_CHECKING([that generated files are newer than configure]) if test -n "$am_sleep_pid"; then # Hide warnings about reused PIDs. wait $am_sleep_pid 2>/dev/null fi AC_MSG_RESULT([done])]) rm -f conftest.file ]) # Copyright (C) 2009-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_SILENT_RULES([DEFAULT]) # -------------------------- # Enable less verbose build rules; with the default set to DEFAULT # ("yes" being less verbose, "no" or empty being verbose). AC_DEFUN([AM_SILENT_RULES], [AC_ARG_ENABLE([silent-rules], [dnl AS_HELP_STRING( [--enable-silent-rules], [less verbose build output (undo: "make V=1")]) AS_HELP_STRING( [--disable-silent-rules], [verbose build output (undo: "make V=0")])dnl ]) case $enable_silent_rules in @%:@ ((( yes) AM_DEFAULT_VERBOSITY=0;; no) AM_DEFAULT_VERBOSITY=1;; *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; esac dnl dnl A few 'make' implementations (e.g., NonStop OS and NextStep) dnl do not support nested variable expansions. dnl See automake bug#9928 and bug#10237. am_make=${MAKE-make} AC_CACHE_CHECK([whether $am_make supports nested variables], [am_cv_make_support_nested_variables], [if AS_ECHO([['TRUE=$(BAR$(V)) BAR0=false BAR1=true V=1 am__doit: @$(TRUE) .PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then am_cv_make_support_nested_variables=yes else am_cv_make_support_nested_variables=no fi]) if test $am_cv_make_support_nested_variables = yes; then dnl Using '$V' instead of '$(V)' breaks IRIX make. AM_V='$(V)' AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' else AM_V=$AM_DEFAULT_VERBOSITY AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY fi AC_SUBST([AM_V])dnl AM_SUBST_NOTMAKE([AM_V])dnl AC_SUBST([AM_DEFAULT_V])dnl AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl AC_SUBST([AM_DEFAULT_VERBOSITY])dnl AM_BACKSLASH='\' AC_SUBST([AM_BACKSLASH])dnl _AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl ]) # Copyright (C) 2001-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # AM_PROG_INSTALL_STRIP # --------------------- # One issue with vendor 'install' (even GNU) is that you can't # specify the program used to strip binaries. This is especially # annoying in cross-compiling environments, where the build's strip # is unlikely to handle the host's binaries. # Fortunately install-sh will honor a STRIPPROG variable, so we # always use install-sh in "make install-strip", and initialize # STRIPPROG with the value of the STRIP variable (set by the user). AC_DEFUN([AM_PROG_INSTALL_STRIP], [AC_REQUIRE([AM_PROG_INSTALL_SH])dnl # Installed binaries are usually stripped using 'strip' when the user # run "make install-strip". However 'strip' might not be the right # tool to use in cross-compilation environments, therefore Automake # will honor the 'STRIP' environment variable to overrule this program. dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. if test "$cross_compiling" != no; then AC_CHECK_TOOL([STRIP], [strip], :) fi INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" AC_SUBST([INSTALL_STRIP_PROGRAM])]) # Copyright (C) 2006-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_SUBST_NOTMAKE(VARIABLE) # --------------------------- # Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. # This macro is traced by Automake. AC_DEFUN([_AM_SUBST_NOTMAKE]) # AM_SUBST_NOTMAKE(VARIABLE) # -------------------------- # Public sister of _AM_SUBST_NOTMAKE. AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) # Check how to create a tarball. -*- Autoconf -*- # Copyright (C) 2004-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # _AM_PROG_TAR(FORMAT) # -------------------- # Check how to create a tarball in format FORMAT. # FORMAT should be one of 'v7', 'ustar', or 'pax'. # # Substitute a variable $(am__tar) that is a command # writing to stdout a FORMAT-tarball containing the directory # $tardir. # tardir=directory && $(am__tar) > result.tar # # Substitute a variable $(am__untar) that extract such # a tarball read from stdin. # $(am__untar) < result.tar # AC_DEFUN([_AM_PROG_TAR], [# Always define AMTAR for backward compatibility. Yes, it's still used # in the wild :-( We should find a proper way to deprecate it ... AC_SUBST([AMTAR], ['$${TAR-tar}']) # We'll loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar], [# The POSIX 1988 'ustar' format is defined with fixed-size fields. # There is notably a 21 bits limit for the UID and the GID. In fact, # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 # and bug#13588). am_max_uid=2097151 # 2^21 - 1 am_max_gid=$am_max_uid # The $UID and $GID variables are not portable, so we need to resort # to the POSIX-mandated id(1) utility. Errors in the 'id' calls # below are definitely unexpected, so allow the users to see them # (that is, avoid stderr redirection). am_uid=`id -u || echo unknown` am_gid=`id -g || echo unknown` AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) if test $am_uid -le $am_max_uid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) if test $am_gid -le $am_max_gid; then AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) _am_tools=none fi], [pax], [], [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Go ahead even if we have the value already cached. We do so because we # need to set the values for the 'am__tar' and 'am__untar' variables. _am_tools=${am_cv_prog_tar_$1-$_am_tools} for _am_tool in $_am_tools; do case $_am_tool in gnutar) for _am_tar in tar gnutar gtar; do AM_RUN_LOG([$_am_tar --version]) && break done am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' am__untar="$_am_tar -xf -" ;; plaintar) # Must skip GNU tar: if it does not support --format= it doesn't create # ustar tarball either. (tar --version) >/dev/null 2>&1 && continue am__tar='tar chf - "$$tardir"' am__tar_='tar chf - "$tardir"' am__untar='tar xf -' ;; pax) am__tar='pax -L -x $1 -w "$$tardir"' am__tar_='pax -L -x $1 -w "$tardir"' am__untar='pax -r' ;; cpio) am__tar='find "$$tardir" -print | cpio -o -H $1 -L' am__tar_='find "$tardir" -print | cpio -o -H $1 -L' am__untar='cpio -i -H $1 -d' ;; none) am__tar=false am__tar_=false am__untar=false ;; esac # If the value was cached, stop now. We just wanted to have am__tar # and am__untar set. test -n "${am_cv_prog_tar_$1}" && break # tar/untar a dummy directory, and stop if the command works. rm -rf conftest.dir mkdir conftest.dir echo GrepMe > conftest.dir/file AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) rm -rf conftest.dir if test -s conftest.tar; then AM_RUN_LOG([$am__untar /dev/null 2>&1 && break fi done rm -rf conftest.dir AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) AC_MSG_RESULT([$am_cv_prog_tar_$1])]) AC_SUBST([am__tar]) AC_SUBST([am__untar]) ]) # _AM_PROG_TAR cwdaemon-0.10.1/cwdaemon.png0000644000175000017500000000040010350336107012602 00000000000000PNG  IHDR..mwtPLTE;Mה pHYsgRtIME #6*tEXtCommentCreated with The GIMPd%ndIDATxڵ DÒѴ\,-r쬓8*"_$t ^E#` ;KWR8!537?0x Ox.3wCIENDB`cwdaemon-0.10.1/doc/0000755000175000017500000000000012326024336011135 500000000000000cwdaemon-0.10.1/doc/schematics/0000755000175000017500000000000012326024336013260 500000000000000cwdaemon-0.10.1/doc/schematics/parallelport_circuit.ps0000644000175000017500000003427310350336110017767 00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%Title: /home/aba/Projects/cwdaemon/cwdaemon-0.9/schematics/parallelport_circuit.ps %%Creator: Xcircuit v3.1 %%CreationDate: Fri Apr 30 09:44:09 2004 %%Pages: 1 %%BoundingBox: 68 68 560 568 %%DocumentNeededResources: font Helvetica font Times-Roman font Symbol %%EndComments %%BeginProlog % % PostScript prolog for output from xcircuit % Version: 2.4 % % Electrical circuit (and otherwise general) drawing program % % Written by Tim Edwards 8/5/93--1/15/03 (tim@bach.ece.jhu.edu) % The Johns Hopkins University % %%BeginResource: procset XCIRCproc 2.4 2 % supporting definitions --- these are the primary xcircuit types. /XCIRCsave save def /topmat matrix currentmatrix def /fontslant { /slant exch def [1 0 slant 1 0 0] exch findfont exch makefont dup length dict /ndict exch def { 1 index /FID ne { ndict 3 1 roll put } { pop pop } ifelse } forall ndict definefont pop} def /ul { dup type /stringtype eq showflag 1 eq and { gsave currentpoint topmat setmatrix 0 0 moveto 2 index stringwidth pop (_) false charpath flattenpath pathbbox grestore exch pop 1 index sub setlinewidth exch pop currentpoint 3 -1 roll add moveto 0 rlineto stroke moveto } if } def /ol { dup type /stringtype eq showflag 1 eq and { gsave gsave currentpoint topmat setmatrix 2 index stringwidth pop 3 index true charpath flattenpath pathbbox grestore exch pop exch pop topmat setmatrix (_) true charpath pathbbox grestore exch pop 1 index sub setlinewidth exch pop currentpoint exch 4 1 roll exch sub add moveto pop 0 rlineto stroke moveto } if } def /stW { gsave currentpoint newpath moveto true charpath flattenpath pathbbox pop exch pop sub grestore } def /Ts {mark Tabs aload pop counttomark 1 add array astore /Tabs exch def Tabs 0 currentpoint pop put} def /Tbn {mark Tabs aload pop counttomark dup 2 add 1 roll cleartomark 1 sub} def /Tb { 0 1 Tbn {Tabs exch get dup currentpoint pop lt {currentpoint exch pop moveto exit} {pop} ifelse } for } def /Tf { Tbn -1 0 {Tabs exch get dup currentpoint pop gt {currentpoint exch pop moveto exit} {pop} ifelse } for } def /qS { (aa) stW (a a) stW sub 4 div 0 Kn } def /hS { qS qS } def /pspc 0 def /cf0 { scalefont setfont } bind def /Kn { dup kY add /kY exch def rmoveto } bind def /ss { /fscale fscale 0.67 mul def currentfont 0.67 cf0 0 fscale0 fscale mul 0.33 mul neg Kn} def /Ss { /fscale fscale 0.67 mul def currentfont 0.67 cf0 0 fscale0 fscale mul 0.67 mul Kn } def /ns { 0 kY neg Kn /kY 0 def /fscale 1.0 def xfont0 1.0 cf0 } def /CR { ns 0 /Bline Bline fscale0 neg add def Bline moveto } def /cf { dup type /realtype ne {1.0} if exch findfont exch kY 0 eq { 40 mul dup /fscale0 exch def cf0 /xfont0 currentfont def} {fscale0 mul fscale mul cf0} ifelse } def /ctmk { counttomark dup 2 add -1 roll pop } bind def /label { gsave translate 0 0 moveto dup scale neg /rotval exch def /just exch def just 16 and 0 gt {gsave rotval rotate 0 1 dtransform gsave pagemat setmatrix idtransform exch grestore 1 0 dtransform gsave pagemat setmatrix idtransform exch grestore dup abs 1e-9 lt {pop mul 0 gt} {3 1 roll pop pop 0 lt} ifelse grestore {-1 /rotval rotval neg def /just just dup 3 and 1 ne {3 xor} if def} {1} ifelse exch -1e-9 lt {-1 /rotval rotval neg def /just just dup 12 and 4 ne {12 xor} if def} {1} ifelse scale } if /showflag 0 def /fspc pspc def /Bline 0 def /Tabs 0 array def /fscale 1.0 def /kY 0 def gsave dup 1 add copy 0 exch 1 0 dtransform exch atan rotate {exch dup type /stringtype eq {true charpath flattenpath} {exec} ifelse } repeat pop pathbbox grestore 3 -1 roll pop 3 1 roll just 1 and 0 gt {just 2 and 0 gt {exch pop neg fspc sub} {exch sub 0.5 mul neg} ifelse} {pop neg fspc add} ifelse exch Bline exch just 4 and 0 gt {just 8 and 0 gt {exch pop neg fspc sub} {add 0.5 mul neg} ifelse} {pop neg fspc add} ifelse rotval rotate Kn currentpoint translate /showflag 1 def /Bline 0 def /Tabs 0 array def /fscale 1.0 def /kY 0 def {dup type /stringtype eq {show}{exec} ifelse} repeat grestore } def /pinlabel { 4 index 32 and 0 ne hlevel 0 eq or { /pspc 10 def label /pspc 0 def } { pop pop pop pop pop {pop} repeat } ifelse } def /pinglobal { pinlabel } def /infolabel { pinlabel } def /scb { setrgbcolor } bind def /sce { defColor aload pop scb } bind def /cRedef {/defColor currentcolor 3 array astore def} def /begingate { /hlevel hlevel 1 add def /defColor currentcolor sce 3 array astore def gsave sce translate 0 0 moveto neg rotate dup abs scale } bind def /makeparm {3 string cvs dup length 1 add string /tstr exch def tstr exch 1 exch putinterval tstr 0 (v) putinterval tstr cvn} bind def /beginparm { -1 1 {makeparm exch def} for dup type /arraytype eq { aload length -1 1 {makeparm exch def} for } if begingate } bind def /endgate { /hlevel hlevel 1 sub def grestore defColor aload pop cRedef scb} bind def /hlevel 0 def /tmpa [1 0 0 1 0 0] def /gar {8 8 true tmpa {} imagemask} bind {8 8 true tmpa {<30 70 60 02 03 07 06 20>} imagemask} bind {8 8 true tmpa {<0c 1e 1e 0c c0 e1 e1 c0>} imagemask} bind {8 8 true tmpa {<0f 0f 0f 0f f0 f0 f0 f0>} imagemask} bind {8 8 true tmpa {<3f f3 e1 e1 f3 3f 1e 1e>} imagemask} bind {8 8 true tmpa {} imagemask} bind {8 8 true tmpa {} imagemask} bind 7 array astore def /ppaint { gsave clip tmpa dup setmatrix pathbbox neg exch neg 4 2 roll neg 4 -1 roll 2 copy gt {exch} if 8 div ceiling 8 mul 4 2 roll neg 2 copy gt {exch} if 8 div ceiling 8 mul 3 -1 roll -8 5 -1 roll { 3 index exch 5 exch put dup -8 3 index { 3 index exch 4 exch put 3 index exec } for } for pop pop pop pop grestore } bind def /setstyles { currentlinewidth mul setlinewidth /style exch def style 1 and 0 gt not {closepath} if style 2 and 0 gt {currentlinewidth 4 mul dup 2 array astore 0 setdash} if style 4 and 0 gt {0.5 currentlinewidth 4 mul 2 array astore 0 setdash} if gsave style 16 and 0 gt { style 224 and -5 bitshift style 256 and 0 gt { 7 exch sub 8 div dup 1 exch sub currentrgbcolor 3 array astore {3 copy mul add 4 1 roll pop} forall pop pop setrgbcolor eofill} {dup 7 lt {gar exch get ppaint} {pop eofill} ifelse} ifelse} {style 256 and 0 gt {1 setgray eofill} if} ifelse grestore style 8 and 0 gt style 512 eq or {newpath} {stroke} ifelse grestore} def /polygon { gsave /num exch def moveto num 1 sub {lineto} repeat setstyles } def /xcarc { gsave newpath arc setstyles } def /elb { matrix currentmatrix 7 -1 roll 7 -1 roll translate 5 1 roll 4 -1 roll 3 index div 1 scale } def /ele { 0 4 1 roll 0 4 1 roll } bind def /ellipse { gsave elb newpath ele arc setmatrix setstyles } def /pellip { elb ele arc setmatrix } def /nellip { elb ele arcn setmatrix } def /spline { gsave moveto curveto setstyles } def /polyc { {lineto} repeat } bind def /beginpath { gsave moveto } bind def /endpath { setstyles } bind def /bop { 1 setlinecap 0 setlinejoin 6 setmiterlimit 0 0 0 scb cRedef } def /psinsertion {/PSobj save def /showpage {} def bop rotate translate dup scale} def /end_insert {PSobj restore} def /setpagemat {/pagemat matrix currentmatrix def} def /inchscale {setpagemat 0.375 mul dup scale} def /cmscale {setpagemat 0.35433071 mul dup scale} def %%EndResource %%EndProlog % XCircuit output starts here. /arrowhead { % trivial begingate 8 -28 beginpath 3 -18 3 -15 0 0 curveto -3 -15 -3 -18 -8 -28 curveto -2 -26 2 -26 8 -28 curveto 249 1.00 endpath endgate } def /npn { begingate 1 1.00 -48 0 -64 0 2 polygon 1 1.00 -48 48 -48 -48 2 polygon 1 1.00 0 48 -48 22 2 polygon 1 1.00 0 48 0 64 2 polygon 1 1.00 0 -48 -48 -22 2 polygon 1 1.00 0 -48 0 -64 2 polygon 1.00 120 0 -48 arrowhead 1.000 0.000 0.000 scb (C) {/Times-Roman cf} 2 9 0 1.00 0 64 pinlabel (B) {/Times-Roman cf} 2 7 0 1.00 -64 0 pinlabel (E) {/Times-Roman cf} 2 13 0 1.00 0 -64 pinlabel 0.159 0.540 0.349 scb (spice:Q%i %pC %pB %pE npn) {/Times-Roman cf} 2 4 0 1.00 -244 -139 infolabel (sim:b %pB %pE %pC) {/Times-Roman cf} 2 4 0 1.00 -244 -187 infolabel endgate } def /Resistor { (1.0) (k) (?) 20 0 5 beginparm 1 1.00 0 64 0 36 2 polygon 1 1.00 0 -64 0 -36 2 polygon 1 1.00 0 -36 14 -30 -14 -18 14 -6 -14 6 14 18 -14 30 0 36 8 polygon 1.000 0.000 0.000 scb (1) {/Times-Roman cf} 2 9 0 1.00 0 64 pinlabel (2) {/Times-Roman cf} 2 13 0 1.00 0 -64 pinlabel 0.159 0.540 0.349 scb mark v2 v1 ( %p1 %p2 ) v3 (spice:R) {/Times-Roman cf} ctmk 4 0 1.00 -208 -160 infolabel (sim:r %p1 %p2) {/Times-Roman cf} 2 4 0 1.00 -208 -208 infolabel sce mark (W) {/Symbol cf} v2 {hS} v1 {/Times-Roman cf} ctmk v4 v5 1.00 32 0 label 0.159 0.540 0.349 scb mark v3 (pcb:R) {/Times-Roman cf} ctmk 20 0 1.00 -208 -256 infolabel endgate } def /circle { % trivial begingate 1 1.00 16 0 6 0.00 360.00 xcarc 1 1.00 0 0 10 0 2 polygon 1.000 0.000 0.000 scb (out) {/Times-Roman cf} 2 4 0 1.00 16 0 pinlabel (out) {/Times-Roman cf} 2 7 0 1.00 0 0 pinlabel endgate } def /dot { % trivial begingate 248 1.00 0 0 6 0.00 360.00 xcarc 1.000 0.000 0.000 scb (x) {/Times-Roman cf} 2 29 0 1.00 0 0 pinlabel endgate } def /diode { begingate 248 1.00 -18 -16 0 16 18 -16 3 polygon 1 1.00 0 -48 0 -16 2 polygon 1 1.00 0 48 0 16 2 polygon 1 1.00 -18 16 18 16 2 polygon 1.000 0.000 0.000 scb (d.m) {/Times-Roman cf} 2 9 0 1.00 0 48 pinlabel (d.p) {/Times-Roman cf} 2 13 0 1.00 0 -48 pinlabel endgate } def /switch { % trivial begingate 1 1.30 32 32 2 -43 2 polygon 1 0.60 0 -48 57 49.00 90.00 xcarc -1.00 90 0 -64 circle 0.60 270 -12 8 arrowhead 1.00 90 0 48 circle 1.000 0.000 0.000 scb (sw.1) {/Times-Roman cf} 2 9 0 1.00 0 48 pinlabel (sw.2) {/Times-Roman cf} 2 13 0 1.00 0 -64 pinlabel endgate } def %%Page: 1 1 %%PageOrientation: Portrait /pgsave save def bop % 688 1142 offsets 1.0000 inchscale 5.2000 setlinewidth 1.00 0 864 1430 npn 1 1.00 864 1366 864 1286 2 polygon 1.00 270 656 1430 [(1) (k) (?) 17 90 ] Resistor 1 1.00 720 1430 800 1430 2 polygon 1 1.00 720 1222 784 1222 2 polygon 1 1.00 784 1222 800 1222 2 polygon -1.00 0 512 1334 circle 1 1.00 512 1334 864 1334 2 polygon 1.00 0 864 1334 dot 1 1.00 864 1494 960 1494 2 polygon (SELECT IN) {/Helvetica cf} 2 16 0 1.00 240 1430 label (\(pin 17\)) {/Helvetica cf} 2 16 0 1.00 288 1398 label (STROBE) {/Helvetica cf} 2 16 0 1.00 272 1334 label (\(pin 1\)) {/Helvetica cf} 2 16 0 1.00 304 1302 label -1.00 180 864 1222 npn 1.00 0 864 822 npn 1.00 270 656 1222 [(1) (k) (?) 17 90 ] Resistor 1.00 270 656 822 [(1) (k) (?) 17 90 ] Resistor 1 1.00 512 822 592 822 2 polygon 1 1.00 720 822 800 822 2 polygon -1.00 0 512 822 circle -1.00 0 512 678 circle 1 1.00 512 678 960 678 2 polygon 1 1.00 864 758 864 678 2 polygon 1.00 0 864 678 dot 1.00 90 944 838 diode 1 1.00 864 886 864 950 912 950 3 polygon 1 1.00 864 870 864 838 896 838 3 polygon 1 1.00 960 950 1008 950 1008 838 992 838 4 polygon 1 1.00 912 934 960 966 2 polygon 0 1.00 912 998 912 902 960 902 960 998 4 polygon 1 1.00 960 678 1056 678 2 polygon 1.00 0 1056 678 circle 1.00 0 1056 1494 circle 1 1.00 960 1494 1056 1494 2 polygon 1.00 0 864 870 dot 1.00 0 1008 870 dot 1.00 0 1056 870 circle 1 1.00 1008 870 1056 870 2 polygon -1.00 180 863 1033 circle -1.00 180 864 1097 circle -1.00 0 1008 1062 circle 1 3.00 992 1062 880 1094 2 polygon 1 1.00 512 1222 592 1222 2 polygon -1.00 0 512 1222 circle 1 1.00 864 1158 1056 1158 2 polygon -1.00 0 512 1094 circle -1.00 0 512 1030 circle 1 1.00 560 1094 496 1094 2 polygon 1 1.00 560 1030 512 1030 2 polygon 3 1.00 928 998 928 1110 2 polygon (INIT) {/Helvetica cf} 2 16 0 1.00 320 1222 label (\(pin 16\)) {/Helvetica cf} 2 16 0 1.00 304 1190 label (AUTOLF) {/Helvetica cf} 2 16 0 1.00 288 822 label (\(pin 14\)) {/Helvetica cf} 2 16 0 1.00 304 790 label (GROUND) {/Helvetica cf} 2 16 0 1.00 288 662 label (\(pin 18\)) {/Helvetica cf} 2 16 0 1.00 320 630 label 1 1.00 544 1094 864 1094 2 polygon 1 1.00 544 1030 864 1030 2 polygon 1.00 0 1056 1158 circle 1.00 0 1056 1062 circle 1 1.00 1008 1062 1056 1062 2 polygon (TRX-A) {/Helvetica cf} 2 16 0 1.00 288 1078 label (TRX-B) {/Helvetica cf} 2 16 0 1.00 288 1014 label (CW out to TRX) {/Helvetica cf} 2 16 0 1.00 1104 1478 label (PTT out to TRX) {/Helvetica cf} 2 16 0 1.00 1104 1142 label (TRX) {/Helvetica cf} 2 16 0 1.00 1104 1046 label (GROUND) {/Helvetica cf} 2 16 0 1.00 1200 662 label (+Ucc) {/Helvetica cf} 2 16 0 1.00 1104 854 label (T1) {/Helvetica cf} 2 16 0 1.00 880 1414 label (T2) {/Helvetica cf} 2 16 0 1.00 880 1206 label (T3) {/Helvetica cf} 2 16 0 1.00 800 886 label (1N4148 etc) {/Helvetica cf} 2 16 0 1.00 880 790 label (T1,T2,T3:) {/Helvetica cf} 2 16 0 1.00 1040 1366 label (BC547, 2N2222, etc) {/Helvetica cf} 2 16 0 1.00 976 1318 label -1.00 0 512 1430 circle 1 1.00 512 1430 608 1430 2 polygon -1.00 0 512 230 circle 1 1.00 512 230 608 230 2 polygon -1.00 0 512 294 circle 1 1.00 512 294 608 294 2 polygon -1.00 0 512 358 circle 1 1.00 512 358 608 358 2 polygon -1.00 0 512 422 circle 1 1.00 1056 294 960 294 2 polygon 1 1.00 1056 230 960 230 2 polygon 1.00 0 1056 358 circle 1.00 0 1056 294 circle 1.00 0 1056 230 circle 1.00 0 1056 422 circle 1 1.00 1056 358 960 358 2 polygon 1 1.00 1056 422 960 422 2 polygon 1 1.00 512 422 608 422 2 polygon 1 1.00 960 422 592 422 2 polygon 1 1.00 960 358 608 358 2 polygon 1 1.00 960 294 608 294 2 polygon 1 1.00 960 230 608 230 2 polygon (Data bit 0) {/Helvetica cf} 2 16 0 1.00 272 230 label (\(pin 2\)) {/Helvetica cf} 2 16 0 1.00 304 198 label (Data bit 5) {/Helvetica cf} 2 16 0 1.00 272 294 label (\(pin 7\)) {/Helvetica cf} 2 16 0 1.00 304 262 label (Data bit 6) {/Helvetica cf} 2 16 0 1.00 272 358 label (\(pin 8\)) {/Helvetica cf} 2 16 0 1.00 304 326 label (Data bit 7) {/Helvetica cf} 2 16 0 1.00 272 422 label (\(pin 9\)) {/Helvetica cf} 2 16 0 1.00 304 390 label (Bandswitch 1 \(LSB\)) {/Helvetica cf} 2 16 0 1.00 1120 214 label (Bandswitch 2) {/Helvetica cf} 2 16 0 1.00 1120 278 label (Bandswitch 4) {/Helvetica cf} 2 16 0 1.00 1120 342 label (Bandswitch 8 \(MSB\)) {/Helvetica cf} 2 16 0 1.00 1120 406 label -1.00 0 512 550 circle 1 1.00 512 550 608 550 2 polygon 1 1.00 1056 550 960 550 2 polygon 1 1.00 960 550 608 550 2 polygon (ERROR/FAULT) {/Helvetica cf} 2 16 0 1.00 192 550 label (\(pin 15\)) {/Helvetica cf} 2 16 0 1.00 304 518 label (Footswitch) {/Helvetica cf} 2 16 0 1.00 1200 534 label 1.00 270 1104 550 switch 1.00 270 656 598 [(10) (k) (?) 17 90 ] Resistor 1 1.00 720 598 720 550 2 polygon 1.00 0 720 550 dot 1.00 0 592 822 dot 1 1.00 1168 550 1168 678 1072 678 3 polygon 1 1.00 592 822 592 598 2 polygon pgsave restore showpage %%Trailer XCIRCsave restore %%EOF cwdaemon-0.10.1/doc/schematics/serialport_circuit.ps0000644000175000017500000002574110350336110017452 00000000000000%!PS-Adobe-3.0 EPSF-3.0 %%Title: tmp/serialport_circuit.ps %%Creator: Xcircuit v3.1 %%CreationDate: Tue May 13 20:53:13 2003 %%Pages: 1 %%BoundingBox: 68 68 598 337 %%DocumentNeededResources: font Helvetica font Times-Roman %%EndComments %%BeginProlog % % PostScript prolog for output from xcircuit % Version: 2.4 % % Electrical circuit (and otherwise general) drawing program % % Written by Tim Edwards 8/5/93--1/15/03 (tim@bach.ece.jhu.edu) % The Johns Hopkins University % %%BeginResource: procset XCIRCproc 2.4 2 % supporting definitions --- these are the primary xcircuit types. /XCIRCsave save def /topmat matrix currentmatrix def /fontslant { /slant exch def [1 0 slant 1 0 0] exch findfont exch makefont dup length dict /ndict exch def { 1 index /FID ne { ndict 3 1 roll put } { pop pop } ifelse } forall ndict definefont pop} def /ul { dup type /stringtype eq showflag 1 eq and { gsave currentpoint topmat setmatrix 0 0 moveto 2 index stringwidth pop (_) false charpath flattenpath pathbbox grestore exch pop 1 index sub setlinewidth exch pop currentpoint 3 -1 roll add moveto 0 rlineto stroke moveto } if } def /ol { dup type /stringtype eq showflag 1 eq and { gsave gsave currentpoint topmat setmatrix 2 index stringwidth pop 3 index true charpath flattenpath pathbbox grestore exch pop exch pop topmat setmatrix (_) true charpath pathbbox grestore exch pop 1 index sub setlinewidth exch pop currentpoint exch 4 1 roll exch sub add moveto pop 0 rlineto stroke moveto } if } def /stW { gsave currentpoint newpath moveto true charpath flattenpath pathbbox pop exch pop sub grestore } def /Ts {mark Tabs aload pop counttomark 1 add array astore /Tabs exch def Tabs 0 currentpoint pop put} def /Tbn {mark Tabs aload pop counttomark dup 2 add 1 roll cleartomark 1 sub} def /Tb { 0 1 Tbn {Tabs exch get dup currentpoint pop lt {currentpoint exch pop moveto exit} {pop} ifelse } for } def /Tf { Tbn -1 0 {Tabs exch get dup currentpoint pop gt {currentpoint exch pop moveto exit} {pop} ifelse } for } def /qS { (aa) stW (a a) stW sub 4 div 0 Kn } def /hS { qS qS } def /pspc 0 def /cf0 { scalefont setfont } bind def /Kn { dup kY add /kY exch def rmoveto } bind def /ss { /fscale fscale 0.67 mul def currentfont 0.67 cf0 0 fscale0 fscale mul 0.33 mul neg Kn} def /Ss { /fscale fscale 0.67 mul def currentfont 0.67 cf0 0 fscale0 fscale mul 0.67 mul Kn } def /ns { 0 kY neg Kn /kY 0 def /fscale 1.0 def xfont0 1.0 cf0 } def /CR { ns 0 /Bline Bline fscale0 neg add def Bline moveto } def /cf { dup type /realtype ne {1.0} if exch findfont exch kY 0 eq { 40 mul dup /fscale0 exch def cf0 /xfont0 currentfont def} {fscale0 mul fscale mul cf0} ifelse } def /ctmk { counttomark dup 2 add -1 roll pop } bind def /label { gsave translate 0 0 moveto dup scale neg /rotval exch def /just exch def just 16 and 0 gt {gsave rotval rotate 0 1 dtransform gsave pagemat setmatrix idtransform exch grestore 1 0 dtransform gsave pagemat setmatrix idtransform exch grestore dup abs 1e-9 lt {pop mul 0 gt} {3 1 roll pop pop 0 lt} ifelse grestore {-1 /rotval rotval neg def /just just dup 3 and 1 ne {3 xor} if def} {1} ifelse exch -1e-9 lt {-1 /rotval rotval neg def /just just dup 12 and 4 ne {12 xor} if def} {1} ifelse scale } if /showflag 0 def /fspc pspc def /Bline 0 def /Tabs 0 array def /fscale 1.0 def /kY 0 def gsave dup 1 add copy 0 exch 1 0 dtransform exch atan rotate {exch dup type /stringtype eq {true charpath flattenpath} {exec} ifelse } repeat pop pathbbox grestore 3 -1 roll pop 3 1 roll just 1 and 0 gt {just 2 and 0 gt {exch pop neg fspc sub} {exch sub 0.5 mul neg} ifelse} {pop neg fspc add} ifelse exch Bline exch just 4 and 0 gt {just 8 and 0 gt {exch pop neg fspc sub} {add 0.5 mul neg} ifelse} {pop neg fspc add} ifelse rotval rotate Kn currentpoint translate /showflag 1 def /Bline 0 def /Tabs 0 array def /fscale 1.0 def /kY 0 def {dup type /stringtype eq {show}{exec} ifelse} repeat grestore } def /pinlabel { 4 index 32 and 0 ne hlevel 0 eq or { /pspc 10 def label /pspc 0 def } { pop pop pop pop pop {pop} repeat } ifelse } def /pinglobal { pinlabel } def /infolabel { pinlabel } def /scb { setrgbcolor } bind def /sce { defColor aload pop scb } bind def /cRedef {/defColor currentcolor 3 array astore def} def /begingate { /hlevel hlevel 1 add def /defColor currentcolor sce 3 array astore def gsave sce translate 0 0 moveto neg rotate dup abs scale } bind def /makeparm {3 string cvs dup length 1 add string /tstr exch def tstr exch 1 exch putinterval tstr 0 (v) putinterval tstr cvn} bind def /beginparm { -1 1 {makeparm exch def} for dup type /arraytype eq { aload length -1 1 {makeparm exch def} for } if begingate } bind def /endgate { /hlevel hlevel 1 sub def grestore defColor aload pop cRedef scb} bind def /hlevel 0 def /tmpa [1 0 0 1 0 0] def /gar {8 8 true tmpa {} imagemask} bind {8 8 true tmpa {<30 70 60 02 03 07 06 20>} imagemask} bind {8 8 true tmpa {<0c 1e 1e 0c c0 e1 e1 c0>} imagemask} bind {8 8 true tmpa {<0f 0f 0f 0f f0 f0 f0 f0>} imagemask} bind {8 8 true tmpa {<3f f3 e1 e1 f3 3f 1e 1e>} imagemask} bind {8 8 true tmpa {} imagemask} bind {8 8 true tmpa {} imagemask} bind 7 array astore def /ppaint { gsave clip tmpa dup setmatrix pathbbox neg exch neg 4 2 roll neg 4 -1 roll 2 copy gt {exch} if 8 div ceiling 8 mul 4 2 roll neg 2 copy gt {exch} if 8 div ceiling 8 mul 3 -1 roll -8 5 -1 roll { 3 index exch 5 exch put dup -8 3 index { 3 index exch 4 exch put 3 index exec } for } for pop pop pop pop grestore } bind def /setstyles { currentlinewidth mul setlinewidth /style exch def style 1 and 0 gt not {closepath} if style 2 and 0 gt {currentlinewidth 4 mul dup 2 array astore 0 setdash} if style 4 and 0 gt {0.5 currentlinewidth 4 mul 2 array astore 0 setdash} if gsave style 16 and 0 gt { style 224 and -5 bitshift style 256 and 0 gt { 7 exch sub 8 div dup 1 exch sub currentrgbcolor 3 array astore {3 copy mul add 4 1 roll pop} forall pop pop setrgbcolor eofill} {dup 7 lt {gar exch get ppaint} {pop eofill} ifelse} ifelse} {style 256 and 0 gt {1 setgray eofill} if} ifelse grestore style 8 and 0 gt style 512 eq or {newpath} {stroke} ifelse grestore} def /polygon { gsave /num exch def moveto num 1 sub {lineto} repeat setstyles } def /xcarc { gsave newpath arc setstyles } def /elb { matrix currentmatrix 7 -1 roll 7 -1 roll translate 5 1 roll 4 -1 roll 3 index div 1 scale } def /ele { 0 4 1 roll 0 4 1 roll } bind def /ellipse { gsave elb newpath ele arc setmatrix setstyles } def /pellip { elb ele arc setmatrix } def /nellip { elb ele arcn setmatrix } def /spline { gsave moveto curveto setstyles } def /polyc { {lineto} repeat } bind def /beginpath { gsave moveto } bind def /endpath { setstyles } bind def /bop { 1 setlinecap 0 setlinejoin 6 setmiterlimit 0 0 0 scb cRedef } def /psinsertion {/PSobj save def /showpage {} def bop rotate translate dup scale} def /end_insert {PSobj restore} def /setpagemat {/pagemat matrix currentmatrix def} def /inchscale {setpagemat 0.375 mul dup scale} def /cmscale {setpagemat 0.35433071 mul dup scale} def %%EndResource %%EndProlog % XCircuit output starts here. /resistor { begingate 1 1.00 0 64 0 36 2 polygon 1 1.00 0 -64 0 -36 2 polygon 1 1.00 0 -36 14 -30 -14 -18 14 -6 -14 6 14 18 -14 30 0 36 8 polygon 1.000 0.000 0.000 scb (r.1) {/Times-Roman cf} 2 9 0 1.00 0 64 pinlabel (r.2) {/Times-Roman cf} 2 13 0 1.00 0 -64 pinlabel 0.180 0.545 0.341 scb (spice:R%i %pr.1 %pr.2 1.0K) {/Times-Roman cf} 2 0 0 1.00 -208 -160 infolabel (sim:r %pr.1 %pr.2) {/Times-Roman cf} 2 0 0 1.00 -208 -208 infolabel endgate } def /diode { begingate 248 1.00 -18 -16 0 16 18 -16 3 polygon 1 1.00 0 -48 0 -16 2 polygon 1 1.00 0 48 0 16 2 polygon 1 1.00 -18 16 18 16 2 polygon 1.000 0.000 0.000 scb (d.m) {/Times-Roman cf} 2 9 0 1.00 0 48 pinlabel (d.p) {/Times-Roman cf} 2 13 0 1.00 0 -48 pinlabel endgate } def /arrowhead { % trivial begingate 8 -28 beginpath 3 -18 3 -15 0 0 curveto -3 -15 -3 -18 -8 -28 curveto -2 -26 2 -26 8 -28 curveto 249 1.00 endpath endgate } def /npn { begingate 1 1.00 -48 0 -64 0 2 polygon 1 1.00 -48 48 -48 -48 2 polygon 1 1.00 0 48 -48 22 2 polygon 1 1.00 0 48 0 64 2 polygon 1 1.00 0 -48 -48 -22 2 polygon 1 1.00 0 -48 0 -64 2 polygon 1.00 120 0 -48 arrowhead 1.000 0.000 0.000 scb (C) {/Times-Roman cf} 2 9 0 1.00 0 64 pinlabel (B) {/Times-Roman cf} 2 7 0 1.00 -64 0 pinlabel (E) {/Times-Roman cf} 2 13 0 1.00 0 -64 pinlabel 0.180 0.545 0.341 scb (spice:Q%i %pC %pB %pE npn) {/Times-Roman cf} 2 4 0 1.00 -244 -139 infolabel (sim:b %pB %pE %pC) {/Times-Roman cf} 2 4 0 1.00 -244 -187 infolabel endgate } def /circle { % trivial begingate 1 1.00 16 0 6 0.00 360.00 xcarc 1 1.00 0 0 10 0 2 polygon 1.000 0.000 0.000 scb (out) {/Times-Roman cf} 2 4 0 1.00 16 0 pinlabel (out) {/Times-Roman cf} 2 7 0 1.00 0 0 pinlabel endgate } def %%Page: 1 1 %%PageOrientation: Portrait /pgsave save def bop % 912 544 offsets 1.0000 inchscale 5.2000 setlinewidth (DTR) {/Helvetica cf} 2 16 0 1.00 320 736 label (GROUND) {/Helvetica cf} 2 16 0 1.00 272 608 label (\(pin 4\)) {/Helvetica cf} 2 16 0 1.00 304 704 label (\(pin 5\)) {/Helvetica cf} 2 16 0 1.00 304 576 label (CW out to TRX) {/Helvetica cf} 2 16 0 1.00 1296 800 label (GROUND) {/Helvetica cf} 2 16 0 1.00 1296 608 label (DIODES: 1N4148 etc) {/Helvetica cf} 2 16 0 1.00 656 192 label 1.00 270 576 736 resistor (4k7) {/Helvetica cf} 2 16 0 1.00 544 768 label 1.00 0 720 672 diode 1 1.00 640 736 896 736 2 polygon 1.00 0 816 672 resistor (4k7) {/Helvetica cf} 2 16 0 1.00 832 656 label 1.00 0 960 736 npn 1 1.00 960 800 1200 800 2 polygon 1.00 0 1104 672 diode 1.00 0 1232 800 circle 1 1.00 1232 800 1200 800 2 polygon 1 1.00 1104 720 1104 800 2 polygon 1 1.00 512 608 1200 608 2 polygon 1 1.00 1232 608 1200 608 2 polygon 1.00 0 1232 608 circle 1 1.00 960 672 960 608 2 polygon 1 1.00 1104 624 1104 608 2 polygon 1 1.00 720 720 720 736 2 polygon 1 1.00 720 624 720 608 2 polygon -1.00 0 480 608 circle 1 1.00 480 608 512 608 2 polygon 1 1.00 480 736 512 736 2 polygon -1.00 0 480 736 circle 1.00 270 576 400 resistor (4k7) {/Helvetica cf} 2 16 0 1.00 544 432 label 1.00 0 720 336 diode 1 1.00 640 400 896 400 2 polygon 1.00 0 816 336 resistor (4k7) {/Helvetica cf} 2 16 0 1.00 832 320 label 1.00 0 960 400 npn 1 1.00 960 464 1200 464 2 polygon 1.00 0 1104 336 diode 1.00 0 1232 464 circle 1 1.00 1232 464 1200 464 2 polygon 1 1.00 1104 384 1104 464 2 polygon 1 1.00 960 336 960 272 2 polygon 1 1.00 1104 288 1104 272 2 polygon 1 1.00 720 384 720 400 2 polygon 1 1.00 720 288 720 272 2 polygon 1 1.00 480 400 512 400 2 polygon -1.00 0 480 400 circle 1 1.00 496 608 496 272 512 272 3 polygon 1 1.00 512 272 1104 272 2 polygon (PTT out to TRX) {/Helvetica cf} 2 16 0 1.00 1296 448 label (RTS) {/Helvetica cf} 2 16 0 1.00 320 416 label (\(pin 7\)) {/Helvetica cf} 2 16 0 1.00 304 384 label (DB9 connector) {/Helvetica cf} 2 16 0 1.00 192 272 label (T1) {/Helvetica cf} 2 16 0 1.00 976 720 label (T2) {/Helvetica cf} 2 16 0 1.00 976 384 label (T1, T2: BC547, 2N2222 etc) {/Helvetica cf} 2 16 0 1.00 592 864 label pgsave restore showpage %%Trailer XCIRCsave restore %%EOF cwdaemon-0.10.1/doc/schematics/parallelport_circuit.jpg0000644000175000017500000020463410350336110020125 00000000000000JFIFddC  !"$"$ " i   !"1W2#AQVXv7BU $%3489aq5CGbwRr'(6EFHTdg&Ic?t)JR)JR)JR)JR)JR)JR)JRԭH4 ISS-FIi\tCiRG`TH*R0G.ff7CRRq$nPR粶ؔJNʤٔ\s1Os]\YG. FL!nR#|h퉭N/f՜WpQ1Ƥ6Ė=VB)+=;ΰZ[#.ĮR\C}tWH_Zfsb.: 2`2S /AJJ|`J0{M{cN}.I_[[r}{viJ4gorloǚGtCbv>Eڬy+K5s~ܜi -7ݚ%@FyԚSjV2.ݣ9ZJzK?6qtNd{xMPՌnAwxWҊp VW.J;mknfL>iϻ+|-HW†JRl[Wn!8 6&oX *^KoPwQҀUIpm׆ӫ/J2>4R_v4&.$-)A)!I^*x5{-WݗΌۋqQA!IHǞ۞)JR)JR)JR)JR)JT kYVݳ[J4)R\rmvQuRqeemH\ v.:ӨA杏H;Rtm%KV @>a1|kG^|{Cz<~GOOWH ݭQ]q!HVA؀ {iJR)Y0ډ5lb0-L9OD%NxޤޮNf')g2~rNf')g2~rNf')g2~rNf')g2~rNf')g2~rNf')g2~rSmCrw:\#tx)8\K)ZzmqԩN-[%*JJIZTlnZyZ2LQov9,KQi,Zq ۇmxO3Tga0mCwkul[+]n`x.$,4F{Nt Lnfu}2,2*(LW"Ԟ<^'yOM?ÑE௽jR_wK[SCb>BGU}rvt2mZj%Ep_yJ#8% =P$,nbّj~A˹ݮ01M&>.y'ZIH%$eQ,_Fc[)hR5+Z-P}BGۛJk|>tc@ike5I4i$I7c 5ky`xu]8 ! k֖Ӻo.Wx]}Îq_7K1}lȵ? eyL~蘦mnE}/cocvVTڇLsr7Q&3R S!e#%b(itxYty<%LEHH3Ps.¶)JR)JR)JR)JR)JRI7ɛuHg- _ZJH1Iq|%ojJVRA*#j\U2e^.a3 \a qHJJ95؛6ap4J>S1qXքaK(-!)1R] Vcq{&/8gVː[\Zi]ò]uCഒ@ iҔ)YC.w܀3RqQ& %D'd$lV.,2'NXSϾ Ե(% I>@ zږ*[S1z +. op[8YR~ݙtT-zz}WB7ŷA;[NȎ:2)JR)J2x=Ynx5jaA*䥫QUE!Dr%Fg-e\n{>iHuB6JRoQ>+6-Z{H.j^`q2P  =#^^$fkUVMZDy]GGkXCA<UU6O/eL3&ݸ*5uJxyJ2Ϻ}{1!zY&"pZdFS/eJGtE8{4{ɮV[JIu+-E J[m @wGin2i2ȧ=pmK܇N4Rӷ.E)!Zin,g!w ,wLiםȴjaamRj 2Qd3<2mۂMWQ 'g܍$nJQU,/0{>8sZid(,r\VNq]` @q(u )$ۂ7Ƙ.5q._ZSn`A A J_xoR5:*vm16-V-- X ZTI)I*$~o Z/5]~g(TN y$t,%A;hvԃ,Ʊ[G9j!$V;n@v> yt{X%D^aqBZTI  Բ8݇JoX%sKv۬@n)h3*Hn')H$Fl]1pqu߮P͵ik}+PJ!!W7#ӝFĶ~n`pq#A!DJx=xδK5MWYK"%AEcqά̲nr% _C VH[$*k^eȝ# ԅ}T'gpUL\kdsyȖ/M} \RAZA l '{⶜ o7!C HP7ؑ5ӥ)JR|g2#-nҐ $l%C9%Cqfi| uD 5yly!mr(.> L!AGBO}=j3?~Du{h߻0 조Qav_ƠCZ ]=цdkKIJەR⾃-VgOISo.^|MUjӻ"ɯ߾ʾMLUJI#̟$ )JxEҍi8Ʈy\%.$HRRXq Bʈ}Z!ֽ{Fk,s.a˖JHRX*RZZSV(OKlu.)if*CHDe 2f!o8+VYygq}۫zFh 8 SBrvK @RVϫf¼>>|6WsX׮Hu-!Vkx>)>`TgR٦ffce6WNے=uBQh% Sv-t'6߻7Mv3ͻU'".gFfTI92<[nQT$)$>D^3ʔ6NMc,YM)"cǢ؎u;[l=Vl샯P{'z%wKNhCI!\KjHC`QԟtO-1񫧇$):~!I^Hqcl^cP4˘ۑf8Q KnZyl<5)JR{&ZmS;A}]]S%NH:k#trHF֦*}N.ͯP2NdV 7{ԤԾce;I?~Nv孛J5f])PӜTRx.vP }2f0:s?!6R?{vJI:R)JR)JR)JR)JR)J_p/9K3e5I4JVA lAݭ/aXrnf3c1Ȕ6$$G^@V6K7}1IvTγNV>H$^CbJJ}_\1|̖+7Y:VB,e1qVARҤl8R4RXK&c>%[kѨ;'v׺p6 mg2nk֛ղ1Xe`qI-)a1SJBVOV,Crl $0bbi _H)VLa:)mq@yV":)j6&#;1 )+m+~Ty P#obF># OmfFix$E_"Ipm)wI33RtDxޟ9wwoEmxlum=͡a<ҽD~3;խ:,8]yu8lV %yo+);yG٭=fDcl{:jP-u>E> {{DXis*|)"D+b5d B)>'~; b_=E<4sfߎ~[?ʺJ>*eBߏ1D$)(aRt _$7N7OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>Nڣ9m]X !{]F챲A;n^ [Q2&յ]gwmL;k+a㤏s9FdiwE1 ( KDZP}n`2{8}?yj :nSꐒ[ =D9-J[mr 8|+WiշB{\v忞 ϱ|M2-=|qP-wH$۞D_'i;)܆|ҕ %Y+S۞sS!O\{LJR)JR)JR)JR)JR)JW3,Eq[99Ǜu'ġ(@V;nyz{8&B, pl-'1]m;TQȮmO7;ƞ۝h7"Wن q)ȧq\Th_I?N'{ǸϏ;ZzsS!O\{L?Fk^k8[֝>Pvm[\Y/If<^v+m2!`}UpZI>*?'v6oy ?%1[w'T('fңPyZ= y75:jV? #*EǮuiRP:-_Gvq\rlm߁-Jb? DYN3'2k{JRm}d(m_ϭ<ɛL Ƨ"Gin4CLqH$ҡpvK> yd*$[nCt*JIGԥ)JR)JR)JRe^Yl1Q_CKRB-JRAFĚҔ+>$YdAQ$_au ) IRH$|5)JR)JR)JRQ0,=^6!V{Nwd(.becrɔa]9Il+Th>,%Ji!CsIf}tk1e`nxEӢJvBBР%9rOġh s`+ٳ4(Z|mF[/m IZ'h.xTck_}??zRCz/ajuWS:Ksp~5ԝO]ơYlgC$S셒o6V"vڣ: gj&z'wK#qa2x}.Ȇ6  *K`nKlX덫z@ϥf.Ү3m҆#,^( V$S^i@8M;%ȫ ivAluO&GSl6XΔ)JR)JR)JR7BlwGwOcV,˫ $HR7 }fowtK]hʹ2rO6총ӸC},igļ3omPOtL#"\^ua ߃ 졸;} g.9m^[.Lq((ԑr? {rLADlDq-R$ )d`1\rlm߁-Jb? s/zZy3lYVuI 7In=y %yۥZ$6 AR [)'o~~,igļ3o72X+_-Y[%CiX vGᮝ)JR)JR)JR)YO?lV)JR*0X1" c'[ujc`$r/v*|*k!=t^+Hc ǻbk7텫~A"x_ICe%JQ67Rԣ䔀 $)\Yc΃%Q$}u iPRH <5)JR)JR)JRs2l+vA=i: јHZ Rv)RxuVP((J\(N䱫^jM_;H"ݢWwR<~z_j?QM>l֜}s$6Vĥ.8)NNDJViZ0ߥuqߩm=}U^zqy/78_3%M h%$;l7QRx5+}7u~m;8uzM)|9lxm;o5խGuzyobKYKAv8RA!;۬(8&?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'TΐU;C?%,A.`0 H*;SI9F)JU3kزU3s0NgX zϓ;Yb S@ZGHm~6t&=\NэȀG~}o*2BԇeiPO_*\>wKġo˓3X-R*<6R֒wT*֫lBa|#HbcxX.nm+qBB/{ +ghTBgKi5F=Ga]YˮUۣ![ZԵ6[@!\%( YQ;W@n~c4\xA-`PЀFes_.G:=Vw rKqaeܮ2 <=%j !;Uyj<6{w䩊e-[;ԔTB+30Cxw|oQ.]!snRC(kJ\5;'p7f2^㚜ͻ2 ්D锆ʉgz*FW/ T~u>뤚Jq%ə0qb1<4RVHJDoÚRmn&dkjLo z3|[Sb{c =+mefȱXF?>|u1_V.ݓhy|J$-jIh{AjA)NJ\)JR)JR)J42ܴS[rgw$uKBRb H+ )䵬"Q Z]mqR1jDsBX":|%iPpm(*UI܋d8-XupD9mrCFR q)!#dVϥri8BHnl _4ȡ+\A=:*ko *AnV]U'U%g j|8e<Ԥ(E8zIqTГ)U7vxz üC_ym[4)JR)JR)JVfj??զiJRYůX3ݦw^,2=߆_3yGcu5zKy[zPn7QKhq%K_m=d>j;#kY9!H\ TU rR8ONsLS(;@bGglj $q2*iSe~Ji.f[y,Z\;'36 1],6A.lO<MI&EXpܦ~f *+!K% mqPad1B3Q}iNknov8-:.{% m ׋mKKi4ψ$V6_)!;|j `af-HHq](Zˮ $v%*q+mvi4IZf"I ;>iHHkf +q85FcYqNHi,P <[nȄ`>j%_95I1C~^l8\Xl>=jJ5qrKvnR2KϴRN#c>6Bl %HCs d&];t[.1.0޾2%Ī0J]܉S|sܩ3f=j+#Q;7|Ff4߈;Ը<98l o]KchnV얘Nΰd6>[UUb۶ifMoִ|_ĤuP^*PײHR(샷TzN8xdYT yJK*%;@ݔ)JR)JR)JR)YO?lV)JR)JWDH^̼WKaJee AZ ൧q粔=ڔ)JR,g3,)JXBP>! 씏p)JR)JR)JR&w6aL:RO4 Zy H1;$\k\yȖ,ao\R@BJl )Jޱ 55Dzyˎ<Դ[sh2R8W-Gbx)JR)JR)JR)JR63Q6wn3JR)JR)JR)JR)JR)JR)JR)JR)JR󐽩ޮ/MTo>C(m䔀>(|z6LJuۚ 3El%N(w'vgZ7!ԫ+Y-KdGiNPx.R8*v`iexTt M&Co])TE߳}ug+WDq.2WYqlݒSe|@<X)JTgq<cn?nww[q\XdN%#4}i jQJ@|tRfyq;ݷ F K)?O4( pH YJR)JR)JR)JR)JR)JR)JR)JR)JR%PdLy/)SK,H܄jJA$MS=vÝf-3+em莖k u( 5=\s\KT$2ˏi [K[emJ r6S|Kbj3-V(r魉ĭ͈J j 'noOOէz7|.Ow+spq{]Mva6v^jӬDZ֘E&^-kXt(씄j )3ػ>LOfkزUJRc{?[9*SMj A;OଛE7I׹zi5w&B6;'qD)(R8"nZ= y74Пǟ3OZ= y74Пǟ3OZ= y74Пǟ3OZ= y75uIL&3}3w Z6JT|~}-ƣ>׀$)\i|fJ2c[G^RG-ܔTg}7&سޱjynLZBP7ܟ=S9ELfiwzS94:I)p[ $TwQd/99܅dۥE8PD,{܀HPJm:R)JR)JR)JR)JR)JR|K' MX+RC|J+OD:8+RUq\O$'*3]i=gCv+FnVY9Q*Zl.c.uÚDĭH-v+u(\y 8fAٯyoȏHSeJS~䔬53xָ%юȲq%+N HdS{x\ߣw.z{y}t֌'φg(O},i~'φg(O},i~'φg(O},i~'φg(YVYq-[qe^?wcƅne׃E)JR:d ^l-gW&Y\urR+yN {r;DSITp!k)mJZ"!%I! =CZZ-8!LJE) P%! )`$ݮ_3Mlʘ~A$ł[f<hQ"u31bF 2Cm!2')IH)J{#m [rK1Qi#e9kc3'uM 2OEĕ T->e[L !I\P8 NZRڐĨgJR)JR)JR)JR)JR)JRt+¿dܻς_C⾍k?w˼u ΧSϖyu xas03cWI[Z@(y*$L*3bJc6mT+][ A :G!^iݲ@*\b}+>{ŦmzMu XB)ߞ$:z2σfTI:vyp-PJҡ䤐Ayj)JR+6׶z.qݒnD`ͫ -X ddGkt){7VnQ?~4)JR>1v䶌I֯.)#"XB4e@HP$%;;"M8vV K;s>w)wlԾ)#v2)JR)JR)JR)JR)JR)JRNyE:f";ͭ!cgwZd%a Ԟ)ILn!#!q[mLvjC 6CTFTxǮ.lSf" !((J;}!n${7MSL$RlD.0C{ 4G)❆#out.jttl"}ܥ:TnxY@b7FMkz{BV,NqPPǼ\i6FqΜXSg3qșپaRPI@y-¾Õ#=o{ˁ|Zwèm53)JR)JR)JR M?yR N칁db.=,:hG BTĴ%+:z ta /Zf-RmЗVWbtfj~7.Ӽ~ DZ%$ %JjgJR)JR)JR)JR)JR)JR)JR)JR)JR)JR)J'/zܧ2{N+Q Y kCi5|gċ> 33*$<[nCe!I>JIΊX,o=CmQ6tua#)JR)JUgqg$vlSP-͡ hn: ZBQqw;Y1_s7s*<ۉPP$Xۂ {5LrIFY!} zj);I ٌŒȱ6l2ۨ8Ɇڤ}Vˬt]JJDlw5%|:$}&DcE4yhLvH;]y{S[m3^_JG=I[ &+fܼI0_],8)N (+_s̝ei#lfRc4=YGP_I$:R6RˍJR)JR)JR)JR)JR)JR)JRR쿀&wqow|H)dZ0˜(P.u_J;ιzn{Ga+' 4tT9ks qت4:FhIAI>^j?^ݻq'8tÏmjwM_nKd+d3yCa,K+H2RH-bF:#Zyi2kMّg[׊ȴ!rynF+(u5w +O3{oRlHX% cqfvuI|!ޚD+;lj#SGozOi2q`&sNHi4q. A't^K3[/"Ŏ#JC1i i8B96@eқC찯mc&Ӊ)qI q)IIPA Sє)JR)JR)JR)JR)JR)JR)JR)JR+,_| t{IuZۨOe;$mvkhŬV[nR:W_JS$d 潗\ }xpYMsRz8tF$n?+\ woXsRm6'uNnI?9U͔q9ec#*) AKOt_K! NZT[Qot@#;޲˦ E)%]W"7P)!d;.:3 <6?U -h6R) Do55s;4's]%/'LIgKA.[ &37\aA1O)SK9|W!#r6Tyy% |&6[-mjeNn5cq(S: KV #V JGw䕾8XYRRA!JMUgibxS7swf3 RʒfzqEp+Y 2Z|$uS RKyս! mc;K9JX&njĞ -P=' W$6 AeV/=oVNǼxtcxǗ[rV?,7.Ym_[IАZy42Rڈ*; B_+Qm+ͺh~.JKK)P[G% u̺iŲ-# ]4*B<}4lTB$5)JR)JR)JR)JR)JR)Q _3W1"j'6ss I;$ )aVD.8uD..֔tq*J@p|mt$\cyX/B}lJABIl&`n/6Ecȕ2JkK x)J=r P2mW\oR-p^smS*t<Рy4ǎF<~R3fœOut 듗+g`0КN2";KuۡJ!]5 y%%1aҝQT# m=Qc]T>veLإWbEJ;y+kfǝK2Ii/0.7Jҡ䤐AykJW3$lN4G ,B@**;{Sl,/F,!J H I;{#N˯i;Uxj%"y-^G'G%cFv kLYoiΣX"Ym.xͺ@*i6SBN1qv> yt{X%D^aqBZTI  fnamuZaC1IgZOq젵!$$iPIEp yʬi+KVM)clvu IC%kAqF (RT=NJ7D:R)JR)JR)JR)JR)JR)JR)JR)JRͨ ӏͷk@d+wI-r#.[r'S32u7'/Xضqu}./-^dnBFI&۱{܌fe#5û1%a{$]nI9y?{R)JRsS!O\{v=] >U#-o}%|Ì{OWQώwsT7h%XI3$GqpS%kecpJ ΢U,HTI3lHw,3aÉ%[Ie Ug?I?}?ܫfz'VF}~,aeoiolg[z'VF}~,aeoiolg[z'VF}~,aeoiolg[z'VF}~,aeoiolg[z'VF}~,aeoiolg[z'VF}~,aeoj?u^cׅmLgIW 2CMғRy(QQe.<͊mzzNDgnHSV>HOV$4G"ҫ̥)JR)JR)JR)JR)JR)P̷O3_ފNϽw__m禮IZaw¼S¼G>9'}moؽ(z/mt)9m}V?M;s:⮱[`2k< YZm߂]-yg(E^>!PKZRpt%VS9I>kjעN&Gϐ[ckKt~533e&'1 %*P֞DyJRڼs|2wnߺ \]Mpqm޽)JR)JR)JRfmCHf~mZf)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRg{RƵɦmw[@SҰ# 673;p;nL1ܖŇ7ĈC.ym&˶O|3Ms=1EqD+4L&S)IDS!v5)JR)JR)JR)JR)JR)JR)JR)JR)JR)JR)YPo֙fn~~r`֙)JR)JR)JR)JR)JR)JR)JR)JR)JR)JRfmCHf~mZf3ŁDY3Jyp!$I'X]uWN:Qg$98RR&H.IeAD UȤ$T)JR)JR)JR)JR)JR)JR)JR)JR)JR)JVyԞїkW/Zwi5.ji .) i Hae)ԧ}ovW3?T&<=cOcJOͯn, <.[6yYq&:9JԟqᤵX0}+jmpTPZOFD$Mf=:=)qMZrG*HVX 6By}oGrMN 0.N[iͻ:RTE@{$'H&XS?ғt?ɏ3)?'\̓iAD쏳Af㡔?>kR$ )q@**;{V)JR)JR)JR)JR)JR)JR)JR)JR)JR)YO?lVc> лPlG7q[sbBGK~xG{1=/˗9c&:p!*'NO wBWZ27k@90kLҳ7G 7#I3JR)JR)JR)JR)JR)JR)JR)JR)JR)JR63Q6wn3Jڇ8{ƴ+3v +3tw~r14)JR)JR)JR)JR)JR)JR)JR)JR)JR3O8 7[IBvu4\Ch}x'A4|5S?{ _]&pp|vʫszF+f=[a]Feb:%YBO Z jmYxJ Sc Ͷ۫LҲiLէ}pll[u $}e#TWK?3?zgg81U^+:ߣ^Q<#$kx-#VL^$[nKhۋV i]l)xHi)n;e)D(O$y&`^nːtEXeMƍmaeD/b!r㌳bJun;Zsu-PvtJ@?`~1]G=Ci3jzYxaJ|K}J J1QǼ)}xJ<:_%GZoóګC!nVZ$nPԒ˅4YJҡy*n[6 Z}xd׋բHQSn79 eE RZX*Q>RA^KZK+vEi:EIQZRwQR8h{Bb9&Eḛe٥ɋ}ˁj RSRBR)JR)JR)JR)JR)JR)_"t,ʼn<8HHKRR$3NC`;S`[%Kݮ,0̴-b!)u4I,{$}qT*ni5[,5wS YBi}H[)q,Q\SP6t7}5"^M؝'JFS*Pm(-e(}ȥ\;>Z}'[zw/nG/کodl;z~*'wnZ)TO4,88 Xݔ)JVf7 uKuǴ̿rlCj‘Z!jJ-< <׹N4 'h axJI~U^4 zuaMjݽ3llJےhƒ:m)KHS֖^pR֒J$I5'φg(O},i~ծ^^ͶV-oVKX첞eml!KRzg IIQ>~hҫ]JM/=v*{Jnk$)JRIۊSfVY7SW:\W.5-ּQe`1Fd2fLg5 ΋o0KMqCoiE\@'`y+IM41^6|[_[R!m#,7܀v ;ڟh_g[r%/{!3 XA$8 y7Rx"jޖធ!$dfBnsOm.9H/lHig\tRzevr\S!-XJI\8Jk$ JXQ$oyҔ)JR)JR)JR]Kz'cqZ^Izv%y!5(JVo5\g7fudܞʜҡ樏U.cͷI#bH4b\=Ν%R}+qժ: 5(I'̓T]U/zxVU][e(-ϐ$WEzkū,]>dO6K䃺#vTQtWɲ YJJsִm [ak[I+IIHI6Z}f.i\,ęu&:)]ZR\m)BE*Z'>-u/?G!ëߏ>>-}[@t/EC-1Ry@A`8%`Fg2DH 7}m%N7`]R)XQW1;%~I 2:V̙(C|Q KjxV= Gn9 mS|ZXRHqI⍉NEdnm:gcv#mܝS0TiQQmVϭ<ɛzO왿ɧ<ɛ;kk6&[,vIsؽ)ƻxIV6= 5it&ҋxΒd< #dl s=>ϵG2kLcXokwfdEm 1HR9%{ԳNO왿ɧ<ɛ;kk6&[,vIsؽ)ƻxIV6)JR)JR)JR)JR)JR3ŁDY3Jyp!$I'YOB1XIuϨz]r<"x,[V,mcQN>Jw }^6EN{36`5K̴pB7ShYR&RR"'h'Ï_oYlNxTDJcl ,-%>҂wgBw߂ޯiO.t=ĥKy޳G[QT(u(I'̓V+~@xJ+i*ZH$N+-zE?^/t?oګcK>%៯c>4^7cK>%៯c>4^7cK>%៯cA+3CGgd4]R3-;A$3ZO6 yN$i./]e7HZ?4NɨX ͮɜc79Eua\⒣ Q'dN gG&zltfvﶴgU*V]ZlŖ-,4 ,Q` ! RJT |Ou4D֡jx7SK>a>7Vyax֏Zgc?f@+~)εg>|4?QF }gL3o>|4?QF Ҕ)JR)JR)JR)JR)JIJ}@ɤ޻-7˔MCZJR%]7I{H蒮>֓|4:Jޟl9rPw R@Qg=$V S~vSWY)OU).l7({2{H蒮>֓|4:Jޟl9rPw R@j{Y=Gr cS\sB,3!qAPQKJ3 #%`ҿ] XswG |g%Jwi-[$vH'` PheqS dIic2O24llȡEDS}>}D~vG(*GMp4x>қ*R$g +~X.wE5'Ӊ)ZwInF+&_Qޏo뾥BPBC%PHRKpm(˅D>Zo깡?ߵ:Zo깡?ߵ:Zo5}jY13m2jZt.)YKdO|쫡Ѡǎ"Zi(\6+PCHQ)H<;GT~ r>%osǥg'/O.SuwODW%zX~(ԸԧK,TMw|z#\1bVR4cecRM[ H'ˈWi:vJw"^NA\w/ń 锒JPÅj;,\^KSe딸}uPѺkAZVHpZACM7Hmđ슳ge鳤L{e.ZYJeTw!(C(OR+깡?ߵ:Zo깡?ߵ:Zo깡?ߵ:Zo깡?ߵ:v=S%{f,V]6~jPI;$$ԥWשF1q7&ƒ+\Nx[wUJǎ?/#>elý;2  r{3nO u15j 'CtnBIJФI)G ErsM}1n@a2{#l[9ϝs4[ejǭVX׏st<0FS!@6ʥMqһfḩeeVW˒ jR\!$ Oi2 FܧTu BBаy$)$yL)JR)JR)JR)JR^ |=<_۫>Gn^|8}OLX&lLdqQrf%sCiZO9 R7 $0/k_ww]Nu:|}ċ ه+4BJ~*ֲ)DQ'֟gVwD?ܑ^.5*_Bu1r 2p(iIKHR*I7΂YӺu^#~5asG [&\Yu6t,ʉ'Q.0.)ZT< " ])JR_MyZf3j̱ -{gq)*Fr[)$ޯecd[7+\ԮM% D@O4pu\m[YuD))iKӻ NĥA>$YdAQ$_au ) IRH$|5ӬB́aVGCɷ[(h7TG9KRvv R)Jf_uVz󊿔2 Z*JR\68x :jl)}eikK`lM2G/ R%|t\\?˥*y8ZIemC5?6?9P$?mDKBXqGnbiZ,LgRkR$ggydӌRmǐM{n@ur}jROY.6 n'iiC>ͅWkfm񼴩 )G $/*SW$چq>?b_m'M5vj <ȂA*}-({Gٰ5jlc-67!!%(Q,b ~ʵv \={e^*nbݴr[u-nn=rL/\g#Y^&R=ܳHqimm(spO=HFnVjwWio7KQ.I=TGvIJ[@(BlcY{4kb1ېسw r$ L2za;Pnl;`cfGqE0E5e)T-H?sJ Wn@ i8ybx"7Jpt Z)<\ެR)JR)JR)JR)JR;ޝ͛{6NCd>܇wqiT6[RxU&=3Ơa Um[ڑ1 ;% 0IR ;q!S5NZK7E*(xDz7N92leKMs Pxvl8ӯMe ]r SMdnIy!kFls*KmE6iB:^*H;$rP +J19R;Ǽ*}ũx)<:_DxM !xOvǠåۏ>m$Xc#4Xai % HJ@<5pqKbDGmK  JFWxBn;A=˟K.;i][!OrQ./ya.tFG x;6#smx&;ᐼ[wNOxrmˇ/koƽ|=t{zZy8$rZI *M\lr65en]`#n\yߊw߰X&&XliSnv"!#NmR0.N;cYb^nrʣ2ȕ)W07Mt얛Uͮll.Xl%䢣 I;y&)JR)JR)JR)JR)JR)JR)Yߠ_5iJR)JRӍ/`yV_&\ߗNgSSm٠$Q?~^6] =XK9AC;(7 eŬX_n\` Lv1|3iըMj*6Xwp)ߒT&mOuBw3"܈ZyX䒤\M{p ՚zAq76I] O7H⣺!;~SmW*âGs:-[鐢N}|ţ!62&2$+d6.R I*BJ@y@ kA\;wۡ r:$3J.#}oi,u918U4ɸaB#9BåǸT RAF~/N1=ӸˇK˗>^mMJR_MyZf)JR)JR63Q6wn3JR)JR&C`ƠvG|Y8eϖdVQ߰?C``v9|^b6eo `PT@VI߱t)JTYuW|uS%.BL6P)#AJ$RA##"YO9tuMGS6mʔ\$'u lByDV5VէwK ^;_{rc.)VV>IQ;mQ{DcqFl)DV D۪JR9;>{l< L_R7“{fML[mzlJ{[r@HJLg6o6 My-Te`tRAHSD%<ҭzb::js^.-7vĴBTJ!~¼J yXԥ)JR)JUWO*V|%&:?uq+qdǚPY%jﲵ c:E/X[e0%qvJ#pj1VXҏK/P.97zn n$BUm_r+d?2ŰZcbCɊì;-wպ.'q !ˁmZ)ZT< " ]`vݛ7f$`(`J}қKK*;*QW$k;n=b.-#S}Ғۜ D n<5bnߧt&gWz䄮R}% %h;%*Yp$N7OŌ3= c +#OC{dX>?0ϲ47OŌ3T`:1^]1YJ[#st<'+I7OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3Uv2`ޥr2,9l@ Qh@B ;#fpm?C{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#T7k,]`iu>Si-lƷm eSq ( MF;vtlw[ir.IZ ej@$HE* = c +#OC{dX>?0ϲ47OŌ3= c +#Rn9YYs7oحgIaR>w?UTeP%v]opeY)HJf9%ShF>f9E~3`A/KI:^e-\Xd6} |a)GwVw\Xv)T!De>~je_f:a8UAJǾF?!G RN+JB"l`un-!-UIDۑP# ˣ;r*%)[E*K )㷞{Ӹ)ڟJ&QNàg=X寻I6g+n,hIPZRwEGclʠlMۯ)pJRI@ 'IRRlm%9o?r]x%P"v҇L]nn5)ANC r:\l+n^#HJR)JRS7I:zyb" -:.TJ#qIBG4*W1Q"d6֤30ȂL>M! GJRU:je=J̥M06Li"թJgtjRQ( ҭޙʲQr&Cلrж_P׶T\:YXrHƻڹ[֧ז6B9X˗F :{nW\M 2i;4JYBR"TR ;% G2م"NMS{ ^.>=*P))_`[lHi+fˍdysZߝ)=7'Ti_A;[@-n ,oN(·܊4`XUm/9ŕ(kQRԥ`$)JVf}7! i]/keeqeZ'w$SRTvRAe;=nze[Paņ2JVYBRRwۊN; !Ǯ,msǐV=|ҠA$ Ex|`ΙLzKP'9od6Vڐ;{26)B@oqՒO5\=YJTB `kT0n3m!5yJw!<2[l8N pI*3)JR)JR)JR)JVf!yhզjM.S}c?]VJv2oHVJNI VlCsgsk1XcAOxOKxI>eӹ 1/>>&3c \LV* IJ 6Ay~OZ诤}ӽu35 $Wl*nyUpiQS>R -ƊV,4Z7VJSrJR)JRG*+Ӭ#.KZ%Ma[ReKHP7؃@d_~s\1.4ٓl/wo}᪘֣&1iM|iFQet*76qPiRR'R Co(*/4fk@+Ul械Jv$},y7ٖ߬X5VJݶ9 &WJPHsfzk9x'=iS7WW{îw{W-:@ݞ1; 8}ǣ-\&C \){鐣Bh%gIQ GN=2z]ɛȫ^..ʶdJoenVRv:bݒZqkxZVi{)ŞJ%^~)JVf}7! iuktCFnrЉy# {ErbqxSJ); I k}4ٯ@+u $]y─D'}O7/ϰLK-vޤnwᛥ !#I  Cxeڹ9w9"CaAJP/r)RA{{jmqx2nLfV"x}+I`!ޚCcRݔ)JR)JR)JR)J/?)JR)JR)JR)JW3,Eq[99Ǜu'ġ(@V;nyz{8&B, pl-'1]m;TQȮmO7;ƞ۝h7"Wن q)ȧq\Tl(7}Ux kxw=J"ߟwocmiG]XO+l>%ݔ>K˗fT3-|S;ӻ]8qry{ŬZm߂]-yg(E^>!PKZRpt%Q6rw5WU.n\5m}PቅḂz,[o0sh{ǜeȮ pKAB)JKKj_T[)JR7k@90kLgUj~7-Ѯ;#~Zw))[n}=u;.wma1&XY]h./=l=M;O_.KNI-|R~";{JZ}V+HdhV粈xxK]}"DtIV[lqgZ-y{ whe]i~a8YVR  Nd*nz'n9\A#u$wIJR)JR)JR)JR78 #F3JR)JR)JR)JRe^Yl1Q_CKRB-JRAFĚҔ+>$YdAQ$_au ) IRH$|5)JRo/C433L:$gzeܓ& ꍱ)RJҤJXSg2NIUT7fuoS~C.%\iIhnҠCk%j kUsJ٫K)fek.% K%NJTZMIlRHP1;\p[yX,aJ@ZB$lč)JR)JR)JR)JR78 #F3JR)JR)JR)JR)JR)JRgxFVdzw3y~kzKM6[AAn $g]~jof-ku5o`d2SmŭK=4ppI[~˪ly!['z2WiIkڠ2H(LMIy*uBd#sR>]$R.lэGi[BVW <˒O_/Zc;ʉ.uɐ5{ R)JR)JR)JR^95iR)JR)JRj޺^pՕ1|9-Ds TgcK>%៯ctfowtK]hʹ2rO6총ӸC5 ]3f=](Rv!dN.gqܹez lÊRKV%AE JJv٢|r %9o?r]?mT*xh,# 9G3ޓy7mH[qVO.I❎#ou|t'Op>3 n߼)6S.|[￞ճJR)JRC5?6?9PĿň}~jR)JR)JRWZqzGB3FԬ6[BH+e;+kg+ر}6*V6˜"IPR iԳM"ی֞ )iĂY)3mRP:gj_[,fFͲe6˲J(BQKWmK#A؝ӥfoqBGvZf&oS#4!&c@XJ NPݸ?o䳗̶/-&d8YJHNHݹ)J]n֫OtK(J"E/߃HG%cFvx]S.q.pOVJO&trH$nW)JUgڏc8v{~SKW6JT|~"kX_^ܛ2Z3hsr|ivL4%-o.Ӓy 忐5SfWfoS>M h<@|-}׸=GW~oyۏ*kN9]'q+379vqBcǒik Rҥ(7#-F~+Zc9K+f[d:}ɋ(U\uEv*; JWV_TlG3⸜l[&?>RxuVP((J\(NδuTk#uT}JDh c=ΰn$Z "RU![]B%_W>dtV=n^Z"ba|ߚ 6JZr@Kt>ǥwoB)iWMBVH;($~ 5WJzrKӛҔiLٮ;%76eQpLtWyv׈,&꒩pJ ^tNZfxfs0j yxjq-q=PCXPPRH =_m-MU1X"l3S15K}ǐx}~@ )uNK^zG\/1fO'&RBM\@W؁YyfeK+y-p?5#mO]; >]'ϱf%d1쐢kUutn |w^SWҗÖǎvcX&k,X-BmwuiqIBeZe-+R*?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'OXS?ғt?ɏ3)?'Pk#=5CX7[$uP Yor#r?ُ_LoM:Gs:$x)< u(ehH $~1'gR~N1'gR~N1'gR~N1'gR~N1'gR~N1'gR~N1'gR~N1'gR~N1'gR~N1'gR~N1':{i"coi,nLۻCIi.ueJԧRP T$*_K|p,7SBY)TSjRJRf}[nպߴ%]QA*ꞓ@;$’܊g{^/~>՚tG\[,D !i Yyւ糺Q2jͧ-1 XӝrS2[yquY#>E1\c+Iܮ2meҝ[T`)5K%#Ґ_)3s/{mZ9f1/R"J %׍|VQi+%.l I.%.)x۟hP ,G1&/+S$:gu\V|QX;& /;}Ld[?KUK1[OQ純`lI'[5)JR)JRCiei| 0!EYp }^anlA6AJ^/;7[rK) OhZRF H0+4|FCZr]Tyd 6AJ@\Jd*ӥV~_}i5?B|ʦy݋Ҍ{OKґώܷqT4(Z+G]l~*Eݿ1h:#)Jh?)IJw@C5GsӼIZ-МѨ.tGh%h;rGSnf >]VSFm*f3 qiHrZ‹dSo\gnxGnMݤB[)C7dKl')RIq )]1ǯ83Xྮڥ>6]|ABUH۔3=NkBSٞ2 \(ndBYx~gmAJ)O" gI+^h-jw)^/M)QF(nTO"Fr5's=-zIœc5T5k{[qaN%;#p$r)a^4 Jq"w Y^}JZ$;Ԧ┤ Ώaf=Z{YƲ7M;Bk|H ۠X@={PWz}7=x*Co0*̥)JR)JR3ZdG1h7=ɷ !)y)*!IVۍX 2٦#I3;卷i6%&Զ$2@lZ$>7ʱXE SWس8˂:Aw'`7܀@'jj=R9szN?eeV-rB\RǥmwoM WMZ;(~qw^E|ɮ>m9314<,)Q؆C}J~ѩeƤY]vDèq )M\ ^\t<ȑbk3n4[W5P ;I"%XtK'`/0Pd}Bx)m7^z藎x?лyߟ.;}.rᷞyճYFMa i^>猜KO07oqjIy !\dv)V&3{5%oj6,7+mc<\Lt>8aG<띣To5BT7)nZڍ)!e5)͊wI{z437Ct]/}[&ꌼ{4-~l2VGxluPjߥ)JR)JR)JR)JR)JR)JR)JR)JR)JRC5?6?9Pm3 -4+]=v?ofLf!-2 8T@NbNhAˁm Ҵy)$ADݖ2}oͮ6XHrL_!\$95^ʒ-s. %u%#Z1kg~%ŎF%%<ҭ}J$i}VeYqW;VK*΢]u.! (YO%EO(VV6f04O/YVmkuJy''{OEwԼ\\us%,uma0<d, W| ȝ:K1bFiO>67Rԣ䔀 $+3@fy5?!Lo/!I*򔺥pI*XωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~tXωxgO,~uծ^ Ͷ.-ϯWWK0 amlHRQQI^H*;zneԥ VQPAHAI;yZt焍gKs.׬@e 4X^DŦTWVw$S>ϙe_M{.a^u FJlR7܂{ChOB칣/\g;ьӰ} q('rHr@,6X'Jvb\I%y- !\I⭥GH>_wxpߎm˟/c>~ܼg\lٖiNgn.ݚx8D!ED);@M2$] b4]ؙId'Fi4y xĕONRJT@erBJ Y᧗-@uqdd t%->o7G1Jlg9eju[r$8+Q<%E%;}Ft}5eyi[K7v#Ő[#86Y+ v^g>d͗cKx8RcZy"RR>*?vcxŻ(ϡzK&c8e/o A锄2_v[D6kpuw PggKn^,lGjK'mGۭ:ۻDb؎#rf>9idDEmN*DTK&;EAMR;9Fi~[9ΰ^Re%$RJwCW-gxgg"Ì Jf=\cN#PI)[`uBׁx}%ݍai)O9]-jW%tϏi=-26$+Cx,[Z\-%>@^whm["5ҎFqBО a !\JH9eY̍=Ğj+ErIejYBGkZ[GMPMI̯X Ƭ)6㷄@} B!H JAH{%rxY+ׂkmeYY*/G4ar}6lֵ lTi_-oZvW8Ř^i* A@kJW3,Eq[99Ǜu'ġ(@V;n;,4v6H<}-͎ہ<<]Cee\tC9)^{=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMu=W4'SsBkMuAҭy,{8}ԹokZw eɻ2ʲ;[.U^Q(O'xlD 敎q IlRCkSwK]aӛQs+k,xTh{8)*!㒭ʱ"vNDfS-D2ZPPyJK  V͒bgw lWf݋y*.+ܩ t$i^UTnl˷9q~ОGZo!EZO%}ʿ[v'm6I٫3&sS+iAWZBT98hmMWg>C+N!6z+"%RbhY6 7u(UI4iaeld9ȬFYڞ$>4J V_%Ln1 +[c+ /Us -GimM0gNCkyA-(pP]6;6ċ ه+4BJ~*ֲ)DQ'֟MX4>/Vcyǯl+[mz,CP{Kn\gIe+yk=+S绖z--:nI@I+5ܼ[xqCok.mʪ 9=dFe7y0)n.lZ~Sug;{[*vvLX-rܖ~<^O7?U[)֒96vJB]R2Ym`,I.sU W6ێ)=>́JE4Sy+q?%L&Ȏww}e*W`܁h *Թ/f *-%$ <̹mofve٠=x=qe3g!VKfZ!oLhHVq܅HJ+RJ t#mJR+,Wϥۗ{j7ð +S"YTk\\PVB|M%I }-dxN?k-r}A"l6af3J) 6e-JQ>TI5w..dPma2'<m`uքp%j @ WWr&M%acf棩%9pLʹ#mm~\Ҕ)JR)JR)JR)JR)JR*'?L|i%*\TfZZQI$I,z V9leSN2sQnVxlyFi {&#ΡXhᵭA )RC0M. |r ojn; x}[ѫ/e^﯅DzψcaWJan(qh)H⥡)Jؐ >9㾃>-{~;_>S.|[￞O$Ǭ,AvF!!V J'F=`FX^Yqr"%@)ҿ KMu%y} KziQ`n)$ y Du&ǁpحZKRzjQ;/#pv>bOحxՖg>44/iHJ$} qɖ;d*Zm۝ob3su) vHn} UrBbׇsK z˓D<9sȎVt hZVBoxz5etO\x}k{=ȖZz m [I#fԁ䒝Gj+wI-r#.[r'S1⸿xg;Z\9m[oO-6:D{J%n2y*IYRBÅA H)*viA}\q̫YZv×&!R +JIRx!kۈ;aV!s"|zu!ɜc8l!@Nzqu8M-6mB7BDq)m6UgZ`^?>%^>9=S^e+Bp{#p{i`~7}[4/WKN0.%m;<\BR6.Xνnvφ.Rvޗ-0Ci!E$/SŽE!V6j]7f=GNL+5t_4%Eo(@ܒmIiwrxiW<= ψMHJ#rJBcR)JR)JR)JR)JR)JR)JR)JR)JR)JRgwݜ]V>ϘMsl7mʘYiQH ϼYwHE?"gZ姿53ˏܭGu CX$6]Of;yy \., }\ԥ)JR)JR)JR)JR*:}]taiք)mE(I Ry i6ạcr;w]AnDE<\ArIR JT&tu4eG&m6mD_ACeNR|jqͱ`"ޱ]bYz=bI;MH ǘd| Xd\[2̬ t+Uȝ\kVo^r|=!׎ߜ)]4%Jv IibΘ#5\lK٥vﭦ<8u8A;oMZ2Yo m!#ILvX.[WpvPn x-Ro1y^3 %`v. 6~K-CJY_\AܐGz*6m&u M&BmZKfC5%DkPHXӥ)JR)JRW\ }xpYMsRz8tF$n?oU F7`fb b7z. ,?Lll}`dôH2X{M"R ^JmN)(/$n᛽b.qI[li KABR8nvU̓"mS4Vvڎ *xV:PSe6%`JZXp,; |fki;vHrI5VˡϳlhRAZ]jgV`)1ꦚE+~g7vԦ K R +QȤp%'md lv7gz}.JG>;[rm{`e~lQ?8UU#|=J3doVol*푾^ZY7ԫK??Fzzigg/OR,U#|=J3doVol*푾^ZY7ԫK??Fzzigg/OR,U#|=J3doVol*푾^ZY7ԫK??Fzzigg/OR,U#|=J3doVol*푾^ZY7ԫK??Fzzigg/OR,U#|=J3doVol*푾^=k?O$Y372KNN\XLV OMʼ=J->OVcqo.clH+.}&ʒpҒ#b TcSHZ/=:RR8ylN}7FiͿq(]Ӄ7 %S;';%T (WQ1JOF=u 8-!I3>:}WWX<(v x4%IJCN oO 3/x~i~z׃^^|B -F:pIk)(Jmg <;UT%7qۆmPBB/EtejZvh uN.)Пd2SSK'z_fӼՌ}oANks AvK}I16O}ꊣyT$mU{Ib\/2V\JimqJ4B^pZmW:k!\?V,NqHP {5Ci-fn&}|vꇂZn";L | )76zi=b=enZw:L$GBetҎ] e%,jQj^`~/J%R] ]}u]eh#d+Y_ctSg8HHJmqjdXkSrDrs;tzdS6|V61Z,)TUg QD%yxymqZC$]R)JR)J>ˏ 2ޕt`'JL%PRv%[l6$·bwʶJkl w]ZFmKLN=RtR*BIlPzxVKh mpK4!PH$vܓ54{"[uF 75f,X9t_akr0H@ J[Bh;(GzU4s.:W$~rZAqHtPIe-en(ɵ[#dbũ#V곶ylz<+J\(v*")JR)JR)JR)JR)JR)JRkg _'oxpNqEKVt;5K4ק/ jg3&R%jqD+<Ď)&̺.=']CQJ.YwS !$RlWb+P{ܞNՔG=x{)#o *?#HNFә/c]/GL _Q*oHWmkfŒ%>]l4Jy%[ O3ջDs={y_rۡp/ ʦzbzcfɘ|NS)ìu)RBmI?Ujo)q;ue#GM=0PII#+JR)JRq=&-'w~I/-mƩ^9F#vw2*32L̇]iВ%.#nN:l˱uŢq*(Z?󒴩'bA#pHؚ[s˥15d_1g[ipC$#K/s1, P,-bndzK=6a6i+mi|T-D-aytT،v-c-!3Q6mGʾ./4̙֕snN IPJ ywv;%}%i5 xtoῸm몳,nNZݫٱ,ncY2F۠@"Qu/PR[ˎ/4K\+ne") j*[,8 Z*tlM٫j[t^#rj-:^%j@RI ^-8M/ZuFTwHIOM+wY{)JR)JR)JR)JR)JR)JR)JR)JR)JRC5?6?9M 0?ͻwm8MˤYdjswF=}."WNjaHge(<*&ݢ4~oz?&MkQ婹! Rz_\ƙ̴_*^mz4BEPzlQC)NnuTJwO%F~/N1=ӸˇK˗>^mMJR)JR)JR)JR)JR&C`ƠvG|Y8eϖdVQ߰?C``v9|^b6eo `PT@VI߱tfOhKW^v5\JiL~*v  zi^f\vEP;o &$ۉ܀Nܶ;(%Fr,c\:\yHIiuΡ*n6+߷ԥq/D*/z+spۊ<6,c3g>#Ze`(ly/qqVm"Z52qHij UNې7☝.Kr8-Kf%-!@PbF|N̫6c~2 -5 KmcނRJwv f|fTI-%eBZT< " }JR)JR,r\VNq]` @q(u )$ۂ7Ʃlq5;TRl  xO6q{si|V mK2.$$B}J]B^PQ%e[BbU_oNsӻ9q!; L' -JJMy6V$M=y r=h2uZV V%JIm }#ˆQ푡h[]I;L4PRJQr Rolp-}lkIHOQ9-[nܒjscΣZmo4&ą{Kl+)o7v;sV3x wMDg#5oZ:X)s Zc3Ҩn7}&m33bۻ=bR2Z)$qlԛXz:lc6a )\Iؔ}d6 yӍ'awDzɲK oUːI_A>ynyv[~ئ leuTA4QtFۏ:g??əoc޹!+TIE=-BZJ\ ?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3= c +#OC{dX>?0ϲ47OŌ3Tꕛ*r~wuH|2PY 6jqN ѲT^;=&wY"ͳ7Y%4)LJPu IRWKf+,Gj ]?;_9q<8=}a]eV_?]2^Ƒ7ev>۩M8Psp8O&춨(Y:k6Im䐡=quyG7-@D3=4òMLj$Ƭ7BL~RT%$d53GWI^Crӄ$ g CcB<E fwKX^\SnKL\RTCl-$>71l ~[nkj;ýZu²8P9̯ur$+nHJ1 &Yj%,AjAw~"\PJOy!w6Gg>I9ܫ z/I\I2v S*H* ${j]sF^Ϫ5_9vDZm!jm%*JRRyRJ"ص@Yx%9SiuJ7CrZ_%6[s@RSGeGa'Nft{Ne%-RSJK!D@dﰜҔ)JR)JVmKgd|Q^^7.0+CJa (%%pR8}]a#T]Y2򨖆v-ipKeEai[a[+s>5 Eᶫ(ط>dR22kJ[ڧ6 JlQRQ@`"VzylhJKvBJ*g(:]a$-)kl}޻#3^':>Yl%O7%)o)! ;w)JR)JR)JR)JR)JR)JUF*|%0/W!z-OMչG$쐔v~3ML!.w2u)Kaq9 T8x} =6]ltbmluR@oJž!I2Oܾq*vg/Gq<19|ؗNKm9 XmM)9 m*IWNݢyDA{e2ys;yŚc2lfwt> R 0=߂32NI|^pE1#i.Jm S|T}.;+xi=i]̷r<0o @yZjJk+vY;A/wkUsl䠑j @yxYќ{{LJNjGKypQmc+JR)JR)JR)JR)JR)JR)JR)JR)JR)Jk!~mvrZIi_;>a6ݲݷc y8iC;(7 TGpȱ vl.׷m6A $(ai^,76/&;5_՘7h774n;-dK-u.V'd )h.);@D63hWknd?b {(WtC>ݴp<3x<=WJPHEm*S.8R%jjXRo6ec>϶m|mtsHV6`wuZ;ikuR*-JJR#}udՌ=N*rgw45<3-DV^HprS)@n]6U7VըyM&N=-KRy6:i'̤Wge.Y/^y,9n 2Wl8ځJ\Xr&W\:}v#Yl+(Dxu Ea[eZ)JR)JR)JR)JR)JRT1cO]3.>%ȲjڊVe7S4u#xfnSdT!ihX B@<&AJWح9=NݯcAn@H>viJZ2'c6k~렭hrH''oejZٺY.ppҕ ӜTRx$cRtcϽ-) WMTlI 'Rt|. OQl$׶2%ŌfdIee:Y SRW-[=̝~Bȭ76z+MqĔ3è))m#e 8Sb6/WMuwNt8fL\60Xu ۘKIRA*Nrɱ[)ad8śs]X>ǸT RA)JRԫ$N\r .h Hm+u!%DBwP`Nx3n;Rڰ+v#eietOhL\ jl;ѷ|tg$dϰؽ?[L ह$q̋jet1gam;!v< qRK}R 8"MqVjLsCv].<" 7\^y$Vm[RTm[6ղWqYiܣ}{Ȱ+v]܄s\y1i[Z;8$$-Ff%WdյF,y6r]͔\@ղV+.tBhv )λiJm!J uO7ox:=^WrZQ ,!Ϊҥ R9+Yze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛze'>zvO}]~jolgڛ50+U1X[dqڛASa|/tSG2 ^2x%˚xG]R€OKqJJRkmiYgGJ5>&@^]ro1*@-tI'dh`Tlc9NAs,i]ݻKdi^p9-17?&5/ euq!L6b6{m+rAOKۨ5R1i \.$8ԝ_>)BxqPj+s"VMgHR:cOu(j$DqHz[; *BH iimAi .e~4) alKmPPmIPS KTe֬KwKCa/]߮SReJK|,#tnna:xexČ5wQa<+ p:y ) w~)JR zС !;Cb,rV\Qm!}%0GjzU%m3{cn W9۶xmpJw RiK@-XG%(5V2+x\ffŭ׌qdZܓV*ycZ&ꅱ6Ǚ,>[H R҂+3N4ӫ˪Z?#ݽu'k /8!RӿY3q]/SNYNsa(RbASB<Ґx{)JTgn1:zysr}ޤԥ)JR)JR)JR)JR+c v;e#nVa+l i j ;e#ږ@e(l+J1+_p_t2z~&eTu6I$l26 ˲-6te9=9v+ tQ ̣t x%K VRT s hk zŚbW?/e< JQINʴ_ ~Ox]>-J8%|6Xwqؚ_3;,9t+>}I)L8 ɐVT?yhRH_$ӽfS3Չ Tq"1m2T/ZX *P5Ju!YrYZ %KL=5!u2B\ ;m-Eu4P7QlUU!ڱa±(> :KDb̤+[{Jr>IcdY-k7&nٞC}DO%^*PG$BU~i\9MZ-,FL'}~ 5N!"1}V:ZoH;()o=L?[u/Ono2gа>̥ RB[q-G)#3µ eH'7m\HG]CdBFJ|#j䶼//MV+&K]KO+Kݔr`mҴq ]2!?brxr5W0;J҃ȍWgQSogQFf?O)IK)y{1LSozf5VѨϷfcS[yהyN $ >|{6&U5=IyW uh$E2Ԗ*!Ԭ+bSm[>))JR)YO+ݫKuy.8L (SФvDy Nst $(~& F#yGJ2ڔ՘r[K- %;3;&]lpRmB\ d*C.ݭˉG-]LKcwJ}#s PAWVcp>YJ4״Ʋ&6%RWK'tN#5(D4)#r bpvyb<,6¯d+rҡJR)JR)JR)JR)JR)JR)JR)JR̺X,;͢:3oFG.6 ;nӥ)Jb 6-DZs6\Q=y$5(IQ$I$]:R)JT {Sv_.CJma99IWƮS^q[Eҡz(j$l`= u+;d>_5fYI1R۠n7 gfy,ai~ "̨oZpO:P0vh'p$uWfݲ*Jɮhu=CXڎ9zo#sʘ:{wmKtI'h> VejGbnhlZs[Ye$UP2'V. eātT=]x-ʾъ{0QnZ,$6܂%;j(+Is7|;x2+4UFdtU|yy_pA?CVi\]n7kWƱ9FրѬhoʟj߁epi즼5y::jfrPs/:::֐Bcw 7]1{r7L[m^+(5b n4vN.sy޷ܽ)ko92R.bE(C;kK9]쁵S%&-lWH[lCE=0w,='Y*+=F냢|vLӧ<<:fMߋڗX_jE[nq:Ao7hbh$z=tO!N1W(7) uuDA3vNVT<"ZcKluDe GM,1zuӸ۫K#d848xt!rdV:KTmjJ6S'k hhb811EkFߘh,B2^K_]cWP[/3NL\4J̳~5>Z詞*:r;cu׸u j}!kֆ)}MC#x%ow,ـH̆S$hHkI@Fʔd|jʩoϠe1#DNo4krx =<$nkGz*EaY'UnnPdl.ۣa=;*" """ """ """ """ """ """ """ """ """ """ """ """ """ """ ""[o5?%u˲y{NͼN@7=} =SAYiKUᙜs1 `KmkO\pֈ ^mIآlM|09 6ovKvGgv{HnW H"kmdL7#m QT.{=Š"vbhL=Idjz KHW4Q>G3p6 ] pk<6'#V-5Mm irPܻ/+ʦ=ffu/;FUl*m vQc'oNiP}Du]hW¼2oTAK}?gg]xf?ukjCr[м(?ڏ_y=M2c1BY?<ʯ(l^gg0ym+5W17oC\\<{;Q@D4u5}-,Lsƀ6z;fU%޳GwwsI=*܈!%Ei[㞂:0@!h5L{W, S#'/pN=I>%Y%CfAoKGyc&I'I]hyq6\\a;LF_f-TzX5u$GŻPkj+l5yOk-8tƎW=trun"y{x|ǧk {oQ`n'ǠקD ~]̙D+o@|Ўqh<iqSqh{!ֵ4nQ̢-oC5}DUXm/a m"_A;%vdqAP Ɍ/ '|ֻ`pt3L%xF -'>6ī`Ty-u*];xJ ,Û9&LВ.=jŨ8кFᭉS C5\ZFz8K%5V7Y[#uzMneHvk@tv_Tx|)槊_ uK"G hCu6ej:wK%–ʦ{@99 &kZ=,%GO#vy-n٠sItNhee}l¢7:|ۚ})~P<eUVʼN3 jDV/2K3mYrK tϙ|V+y!MbR[(y~NAkAЯ2bb/t(nA9}{߅Xi,պ>2s#gwbԹ}$lT>Zv_hAE#y򌮦kVS\kIp$zNmRtxĮ{]@(2N;sogznJԑ*s59i4]4ִ5k.Fo]M䬧ֹ֓IW@U+o_^ӟZw<,?h칻n0ϕ˭o_,g`eWy㩎Aݷ`V(fW$) u5|gtwO;95JaUGهߠ○Ng<%Qk@Y~ a6Rױa Yny=hV\S]+\N@O hUV<:m6tzmzh4ȟ4e1tѡݥľE?r kq+5q]KnO&ݫG.΃I)wKo0[|TTyFWA,Aĝʡ8u'WW>qf[ogDٍ6cACXx.Uۍ6\y/^P$lȈ dޙ.*IUSP{z pEǒRQ[*MT,kY7iۇ޼|cd֋[I}O_#{>CiCGSCuE?)it=tyEI߷kԭ>?`RBH'\ޏyA6]YYʅLUNoQ?FG?Bt]w\6>aY[V*%nЂTv_Ċl_:lt=sϖ=хc;w_cֆnjFs $w7lHl+6XN"8 ,ʡYږQ k}lIcw.dw^&΅׫އN[TqaiB֏JHY 181At($8ުiUhUVҎq%cXzNʃ=u=M_G'iKU&s1`Ѐ +'7)Ud?gU8%!~qċ@Y6/?h>^UO~I=k~M뛗[鵖bLrCQJ~pe9H.:RX\7* cIT!KL!H]χ3oMgꖪ2SsY;7?Z >4Q gEdo~R~JI.>bST1/9V,%# GA"" /ܺajd Q-I9 Z:|rXҐ>71Mz$|t-熶fv::lt켾|@ =>~C˿_]ii,Rs+h%P:?#qcZaYmtQSO PAKd|B.ef1Q-|G].-yp jE X4x'+z²5|x|gNhp=VAfz|ߎ2ZX#ʛ3hvַۇQ" ׉Γ[u5'? =u. E-eڂ8 ;ƹ4rww""" """ """ """ "(!Ŭ5zz`-*H< Bl'y#?ܪؿ8bE\q]aGb餉OiAߋv_Yډ^iiiX+4K=<;E[óJ,ֆIvNˎ{ Ȁ9s΁'cw-vzm[|Ռ-KOMfFO,QeNzo^EURMN繂Xkm!bןk{ m-SKV+Khio_H"9c6W:VNJ;hZ֒N6NdDD@DDD@QY?NFz 6-aCh1RG!ph$gzㅊqőI]%#AsHӻ 6/?h lUұWhz8xwkxviEU\#Nºq!|S1d692^=Ǎ vP+Լ!D[e[y,aҸsOo$όz^<:;Y5ɲ;Ap/Q6WVZآhGl,6,Q^;)TQ5h? 3KzQ'h%5TF9#p: `4|Tb9c5$`O8pIv݁k7Ӛ.ހ_n|1Tk#`sܥ\>`]r~4ΤuڼtPm_wdh bl -kf2 ~W_ӯX(5,e(v. nk!;#W㵟btԕ5n/394Hy_k7xї q-Imdi; ?@ cYE!ĈUu>S%8]n:gG9f: ?c6]..RIT/$tgW>UR۩W6- ˧39|\֍ՌW[([kdAO~7>iZR^ t U9.JIIg>?~ >fctw euaܓKWPgpso[ޔ"" 833퇻$_kWYW9y#Z" """ ,yC 5/+tt?kS)嘲G^[K ~e26Gq.&J+[Mh:4 Ph8L:Wi䝀zWLJG~_K Ŗ6j+ݒvE j9^=A/KzQ'h%5TF9#p: `4|PI"" """ """ """ """ """ """ """ """ ".kt6e]£},/Mk|iq:QeX36r;[|hl>M;Ay;>g-]l\E(.i;s*2Y1< 14:u(7YLJW] :%S5Ƴa]zYpe:2^M{\Z7Ӥ舀"rpKCb*sY^㦶rOvnUn }l_1" +%-q٪"77E};˯7ÃuR[vo:hzfoG+_V#bv+ꛥ*h,}?m5GGx:DNq%1w.4Oc}9535O_ 5c45 D@DDDAqoYßǑ5Zk2#]GPUZmct9|!ɭtҤT]g6Jz\|ӷ} md3cΆoه\,.v׿mc<)q|j ͹jgRJm4e$jiMtҲvr<$^s|7O+\X7޸:{ _RkTh!S2ʛ'<A4]7|@h0e,PD|p`&Bτt{|p`"@τt#{Ҧ[1~O z>luvfWRFbk5z+J )c+s%7?R0e,S&쥏t> JoߨuJO?"70/i)Q|n`^S~+Ru>aXwCG{IMTL?K} )c+s%7?R0e,S&쥏t> JoߨuJO?+90znKCM$QIń~u]Oq -۝ j{n'5s=økVRuxnhlCtKzG{IMTL?K} )c+s%7?R0e,S&쥏t> Jo>Yw_]x[\RRRvFZL?K}`X{KlG]="70/i)Q|n`^S~+Ru>aXwCG{IMTL?K} )c+s%7?R0e,S&쥏t> JoߨuJO?2~$gؽ#*mj!2za%cwhߨuJ qi8;xk׽y )c+s%7?R0e,S&쥏t> JoߨuJO?"70/i)Q|n`^S~+Ru>aXwCG; Y)aij9cc98>Oά0e,S&쥏t> ߅70/i)Q )c0e,PE|n`^S~GW&쥏t>|A/..$Nzo Jo~aXwCL?K}q)r&26 h©q߮X`k*MhH҈)L\.6{{4{]޵0cS\jgԲ<Mu~qe?9Kl/``Srt:ogzW0zl~QAe i bkIiv/O5`,+0 M B:}OM5tf:Lm#9 NѲmGݵ" FAO$6ҲwSmݸw`#Ckqgb[5_G5$p4 О'Ye9UE}4T摿~-Wb]2[lf[}ނKmޟkd5wIgc^D}mݎIڣ`OKRDѠԁ)L)F E|5Qg@LJnxintZ """ """ """ """ "" sl&KtPeqz~!. {ֶElm#!y{{U0꧌;eL,($cc?{`=v@ƭY[EѺz*(itd1u2U N*_QK+g6BEpֆ5ێRIl(* p+^9_dTI$:I%;:-$`Ah-ubwe,wV* =;#w{KC; -A/ݬM,~o:H<Ѩzѭ.sqUimT+UYU_PUUimT+UYU_PUUimT+UYU_PUUimT+UYU_PUbmY)ԒFHs)=@}^ΈYQۭQڼU_p(mD:뿿H'ZMI\#l絃vF΂ uq'ĢWOjIEwo;KZ4lk'mA`Y|Cp;~ƙtI|/>.?yoa]5a\-LZ9-lx_m4P-o3Z]G *.3mςy6+wfwӡaUs^q&uG"E SquخXzO+z'+zshu41]k{.TR9`׻ԊVdv-4'3^OSצD@DDD@DDD@DYtqPa], ` : ȃHEKUSq_m5MjywNxGQYSGIUK o3Cݎ}4U[}mPK5H_Y^hu/+,͢;)fLւIoR:}]eV1}FBUZ P ُl~*!K̭,s+:s˦$4ă R:iĝ{Zu6wM W'M?&e{og oVUd]7 `{◚JT<geCgGwQ xgŤ*YwHpo VatRPk&irPvdRat޽Dz͢+a[%tNu[p:j`4㰂~SZ? j68qԸͽshk<M"" """ """ """ """%ڏ?_%i* yHA#uk{A"*~ck kvm?)߃A ˦Ahڼp4IN>[9vzoןs!GKqG.kYUk*Y;KdwqK@*;?Os!ժ 6\~>,soV2s!;?Z ʾ,soW%Ӈ[]sɠ|ܞL[uקwzVOnAئkaĻ >)o,g2 }*c}D?Zx%!~qċ@A|X}k֧ŎmֹjQUc}D?Z9ZCUDCx]+]=#W;?Z +QEVA4ɱ_Ho^+)/wUW'ߵ8cryGe~DDA<݉~OMIϮKpsőZ~dlQZ[152d-@n#_I;/c_՛<9? ky۽v}9uk\aYmtQSO P\v n;p7lyd\M4΂T̆,SDOI!4┞nH@-\I$kg:dw,{U)ɛѻF04rot+S vIsCY]O]q)L24i!].1k,0n(ٽ3/6Зw]t$j`VOb lg-o[竒|Q/i5l: ST" """ """ ,?eCËM5 ;nγng8lh:~+aTLBfk=wCIֺ 7 ygo>niskgL7槿V #~ɜ'rl o}׸v.͚݉fis+>j^-?mNcko.~ԕ^_ϓ}{>V6ᯝ.Q`̩x$=)s4zla߭liF>p SqcY[n3 ѣfs{N9>Qx,x]MLHI|ntz =58UY:[VI)X&M{yzݢ{zEYkmZwM%%๴=c K\t>D@Eee,rGS b ^ vx_tU_PUeV1}FBTDAnŽ.>a}ik|޵mA{-Y=e\u](nzt#֩U+B& Y4lAґA^Go^vuw|x_{.JJjo,9ؖnNa~(. VV\-cEĺJ}(hЃ%ûݫJǝO2 .˔Fbls9ZA^ˣ*xZchk\ɘ׫D+q2ި,N[!$}7W *3:yI<[uן[6?d QQHݱsN/m-7;kKm}d6HIt셡'ngk $2'fvFc[=;{ø{Mo^'ݠooZ?hu?y6ʼgq;5'mi`HiG45<|SG nYOnѴqPJZwmwz>~_Aúf~Q+oRNw]9Kۦp}w-Mӳ.nݭH ]B⡥{aidB!/)5ӪxYvEpc'B<@QC1S[Kީv@w~vյb긣a2ڦ\.3jlaa޶|5롣432.NAIs^C^ޛ]]1>5[.{󭝝xmgj]GB?#)lM|zd4hsr]/q$cx d;?e lw?`Ҽ=;_P\XiܚOxXq(9782・j9Ypeʭ/ $An6{;\vgUDW3G}ryۍ?w-Ue^vgџqbv[(lxR6*w6L~I[rʸcL_?23G}ryۍ?w-Ue^vgn6{;\TAyݠooZ?hu?گRT\|ĝ*5@N%NEWH\:Zʸ)⎆nw c[ɚݓө>t" "" q]S!Y=|oMKjHӂ2 6]6}Ze^_ϓ}{>V6ᯝCd=SVZfX6T8sAǠ$t5]f;\vwQ *z |Y:o@zWWyU$Tl?g@VD@QY?NFJa ~P|Ofn }l_1"/ $Z" """ """ """ """ """ """ """ """ """ ""E-cʚhgk|.893Nt6;ii⧧8`CZƁz36cLik^GP*y6/V#&Yl5 GDxW5]{C4k"xHRi2H|:F>@؃9cӿډ]_\vOWP˅#{U#fil`ԃxExj⨧9A#bJh25kSUۧk^9[+A  kYt~)zGih=@#7H=wԽ?1AQe%i}{B ͞QA 5[Q^73zݡlMD.=yp> >bˎmǍ*aXnUlsd5G/0Nǀ!mrɮ[ E}5ޮ28_IwY*\)`},w՞XXv,ؿ8bE,Se-w뮴vlU%rC:$w-oo Df$rrGs贏WwYeV1}FBUZ P||S$Qk pgwTGmyEPly"mn #z;o?m~kdsѓս|xI\y y.r0Mh8ih(;Q/UBǑ99x 3U(P Ǫ;Fu4uғ@^ 45^W81qހ$ރ2+ζtHZ7%ow+e 3,6fY5QGN{9Aۜ)qge]Xe48aAڌθf4Vy*׃4#;ECwuk{a7q o/ m޽iT:\&u%*J |Z d몙F;mvEmד~ǎh3%Uqut45,{5.q8$p̮kqI4v9.3m̦aHu|vz/\χ -u5uULX==g;t:1Lvˉޱtq߭tqS\h#+"w)8{=zl.7> ٦ -j'hY*{X^Aֽ.LC13ozt6I tS(7y_l?-]e\[pčj6%C0kyzDFߡw]wbGQjeU&K 0'[N^2z ʎ)`UO%-/чTA}xOa'FQUA>чd{UDWF}xOa-Ue_d{A>чTA^n4pkQM$Ls9 _:lWYn"^Ӳ9xߩ~^ֱc֍2 \= UZ ʾ<'s0}W?yj* UTl/݇3̮ɮ1M Zd0O5.-hn wkWA>чd{UDWF}xOa-Ue_d{A>чTA}xOa'FQG~k(oei40^OU}W?yjqisA-;i#]?!+ }W?y><'s02 \= UZ ʾ<'s0}W?yj* U\7ǔe6(S☡#qWhm < zj;jV@C<x ;`~oNx8z2NvQ? v6A hG( \~IlWIj:BHsw!AOaY;:wAhtOpփ1GxQ9puTY/tU1:+5ދsNt;y绊$xC_QUny;$Z(*MY2^ơG{|7< oSOiʫ嬏Ik}Qcn1뿯y(+vj9;JZ4/#ww$qV-h;[-d! ui=w--PUIUa4:p6 sC}ӍrFw\m`_-r+ZѦ3G4sQP\.vz\eJ\riˎ~@髬uݞ3-M;0s$ 0OAi7d謲[<:A@mC@Io0; C#8<ϞWc}UsC"=_EoI\rLqWۣZj*+lp9[5ܧ}uPχu=cQ佷gQחku.[^P[r=!e< thsN֏@f=+ r\ijmBGB_ 6=kO^;cye X䲾8:^CQ6MF: *;;|V\GjJdNi޹{qT ">\t\mѶNw(-;u|~z߃6MA\8 m~;k}f1&ʹ5הs]5;֋m7W%1#`Hu龊+ CxmL7K" string. Notice that there are no space characters between parts of escaped requests. Some of the arguments and requests require passing a value (e.g. Morse speed [wpm], tone (frequency) [Hz] etc.). Call "cwdaemon -h" to see default values for these arguments/requests, and ranges of accepted values. When handling command line arguments, cwdaemon does not accept invalid, malformed, or out-of-range values passed through command line. It won't attempt to guess caller's intentions, it won't try to start with some fallback value of the argument. Instead it will just print a debug message and exit. Rejection of bad values and exiting will happen before attempting to fork. When handling escaped requests, cwdaemon usually does not accept invalid, malformed or out-of-range vales either. But instead of exiting upon receiving request with such value, it simply prints debug message, ignores the request containing such value, and waits for next request. One exception to the rule is PTT delay: requested delay values that are too large will be clipped to maximal allowed value and then will be used by cwdaemon. Requested negative or malformed values of PTT delay will be ignored. .TP \fBPrint help text to stdout and exit\fR .IP Command line argument: -h, --help .IP Escaped request: N/A .TP \fBPrint version information to stdout and exit\fR .IP Command line argument: -V, --version .IP Escaped request: N/A .TP \fBSet hardware keying device\fR .IP Command line argument: -d, --cwdevice .IP Escaped request: 8 .IP See chapter "DEVICES" below for more information. .TP \fBDon't fork daemon, run in foreground\fR .IP Command line argument: -n, --nofork .IP Escaped request: N/A .IP Debug information will be printed to stdout (unless different debug outut is selected, or debug output is silenced by setting debug output verbosity). .TP \fBSet network UDP port\fR .IP Command line argument: -p, --port .IP Escaped request: 9 .IP This escaped request is obsolete and has no effect. Command line argument works as expected. .TP \fBSet process priority (niceness)\fR .IP Command line argument: -P, --priority .IP Escaped request: N/A .TP \fBSet Morse speed [wpm]\fR .IP Command line argument: -s, --wpm .IP Escaped request: 2 .TP \fBSet PTT delay [ms] (TOD, Turn On Delay)\fR .IP Command line argument: -t, --pttdelay .IP Escaped request: d .TP \fBTurn PTT keying on/off\fR .IP Command line argument: N/A .IP Escaped request: a<{0|1}> .IP 0 - PTT off, 1 - PTT on .TP \fBSet sound system (sound backend)\fR .IP Command line argument: -x, --system .IP Escaped request: f .IP See chapter "SOUND SYSTEM" below for more information. .TP \fBSet sound volume for soundcard [%]\fR .IP Command line argument: -v, --volume .IP Escaped request: g .TP \fBSet Morse weighting\fR .IP Command line argument: -w, --weighting .IP Escaped request: 7 .TP \fBSet tone (frequency) of sound [Hz]\fR .IP Command line argument: -T, --tone .IP Escaped request: 3 .IP Notice that sending escaped request with value '0' silences cwdaemon. .TP \fBIncrease verbosity of debug output\fR .IP Command line argument: -i .IP Escaped request: N/A .IP The argument can be repeated up to four times (-iiii) to gradually increase the verbosity. Alternatively you can use -y/--verbosity option. .TP \fBSet verbosity threshold for debug strings\fR .IP Command line argument: -y, --verbosity .IP Escaped request: N/A .IP Alternatively you can use -i option. .IP See chapter "DEBUGGING" below for more information. .TP \fBSet numeric value of libcw debug flags\fR .IP Command line argument: -I, --libcwflags .IP Escaped request: N/A .TP \fBSet debug output\fR .IP Command line argument: -f, --debugfile .IP Escaped request: N/A .IP Print debug information to instead of stdout. Value of can be explicitly stated as "stdout" (when not forking). Value of can be also "stderr" (when not forking). Special value of being "syslog" is reserved for future use. For now it will be rejected as invalid. Passing path to disc file as value of works in both situations: when forking and when not forking. .TP \fBReset some of cwdaemon parameters\fR .IP Command line argument: N/A .IP Escaped request: 0 .IP The request resets program's parameters to cwdaemon default values, unless the defaults were overridden with command line arguments - then the values passed in command line are used. .TP \fBAbort currently sent message\fR .IP Command line argument: N/A .IP Escaped request: 4 .TP \fBExit (close) daemon\fR .IP Command line argument: N/A .IP Escaped request: 5 .TP \fBSet word mode\fR .IP Command line argument: N/A .IP Escaped request: 6 .TP \fBSet SSB way\fR .IP Command line argument: N/A .IP Escaped request: b<{0|1} .IP 0 - microphone, 1 - soundcard .TP \fBTune for a number of seconds\fR .IP Command line argument: N/A .IP Escaped request: c .IP Tune for seconds. The tuning is performed by both selected sound system, and by current hardware keying device. .TP \fBSet band switch output\fR .IP Command line argument: N/A .IP Escaped request: e .IP This argument sets band switch output on parport bits 9 (MSB), 8, 7, 2 (LSB). .SH DEVICES Any serial device that supports getting and setting the modem control lines can be used. On Linux, ttyS0, ttyS1, etc. will work. On FreeBSD these devices are known as ttyd0, ttyd1, etc. On OpenBSD, these same devices are known as tty00, tty01, etc., but may vary with platform. For parallel ports on Linux try parport0 (default) or parport1, and on FreeBSD, ppi0 (default), ppi1, etc. OpenBSD does not support parallel port operation, and defaults to 'tty00'. For completeness, a dummy 'null' device is provided. This device does exactly nothing (no rig keying, no ssb keying, etc.). .SH "SOUND SYSTEM" \'sound system\' should be one of following: .TP \'c\' - console buzzer (PC speaker) - default system, .TP \'o\' - OSS, .TP \'a\' - ALSA, .TP \'p\' - PulseAudio, .TP \'n\' - none - no audio, .TP \'s\' - soundcard - autoselect from OSS/ALSA/PulseAudio. .SH "DEBUGGING" cwdaemon can print debug strings. Each debug string in cwdaemon has specified verbosity (verbosity level), and can be printed (or not) depending on current verbosity threshold specified for cwdaemon. The verbosity level value for each string can be changed in future versions of cwdaemon. Don't depend on current setup. The verbosity threshold can be specified through command line arguments: -i, -y, or --verbosity. -y and --verbosity accept "threshold" value (single character) as specified below: .TP \'n\' - none .TP \'e\' - errors .TP \'w\' - warnings (default) .TP \'i\' - information .TP \'d\' - details .P By default the threshold is set to "warnings" - cwdaemon will print all errors and warnings. Changing the threshold to "information" will make the cwdaemon print errors, warnings, and information. .P Debug strings can be printed to stdout, stderr, or disc file. Printing to stdout or stderr is available only if cwdaemon has not forked. Printing to disc file is available regardless of whether cwdaemon has forked or not. You can specify intended debug output using -f or --debugfile command line argument. Values "stdout" and "stderr" passed to cwdaemon with these arguments are recognized as special file names. "syslog" value is also treated as special value, but is not supported at the moment. Every other value will be treated as path to disc file. "stdout" is a default debug output for non-forked cwdaemon. You don't have to specify this explicitly through command line arguments, but you can. .P Regardless of values passed through -f or --debugfile arguments, cwdaemon opens a syslog file and (when forked) prints some (few) messages to the syslog. There is no way to override this at the moment. Which messages are always printed to syslog, and which can be printed to other file, is settled for now, but may be changed in the future. Don't depend too much on current setup. .SH BUGS When an escaped request "f" (change sound system) is sent asking for switching to sound system that is generally supported by libcw, but not available on given machine, cwdaemon will not recognize that the sound system is not available. It will close current audio system, and will attempt to open unavailable audio system. That fails, and cwdaemon falls back to Null audio system. If the falling back fails, it will result in cwdaemon working without any sound system, and it may potentially crash the daemon on next attempt to play audio. .SH "SEE ALSO" The provided README in \fI@prefix@/share/cwdaemon\fR for a description of the circuitry, usage and testing of cwdaemon. .SH AUTHOR Cwdaemon was written by Joop Stakenborg , Rein Couperus , Wolf-Ruediger Juergens, DL2WRJ and Ladislav Vaiz, OK1ZIA . Cwlib is taken and adapted from the unixcw package, version 2.2 by Simon Baldwin, G0FRD. FreeBSD support mostly done by Diane Bruce, VA3DB. OpenBSD support by Jason L. Wright, AI4JW. Since 2012 the main developer is Kamil Ignacak . cwdaemon-0.10.1/doc/Makefile.am0000644000175000017500000000002711765206475013124 00000000000000 man_MANS = cwdaemon.8cwdaemon-0.10.1/doc/Makefile.in0000644000175000017500000003403412326006126013123 00000000000000# Makefile.in generated by automake 1.14.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2013 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : subdir = doc DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(srcdir)/cwdaemon.8.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = cwdaemon.8 CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = SOURCES = DIST_SOURCES = am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } man8dir = $(mandir)/man8 am__installdirs = "$(DESTDIR)$(man8dir)" NROFF = nroff MANS = $(man_MANS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PKG_CONFIG = @PKG_CONFIG@ PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@ PKG_CONFIG_PATH = @PKG_CONFIG_PATH@ RPMBUILD = @RPMBUILD@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ UNIXCW_CFLAGS = @UNIXCW_CFLAGS@ UNIXCW_LIBS = @UNIXCW_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ man_MANS = cwdaemon.8 all: all-am .SUFFIXES: $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu doc/Makefile .PRECIOUS: Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): cwdaemon.8: $(top_builddir)/config.status $(srcdir)/cwdaemon.8.in cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ install-man8: $(man_MANS) @$(NORMAL_INSTALL) @list1=''; \ list2='$(man_MANS)'; \ test -n "$(man8dir)" \ && test -n "`echo $$list1$$list2`" \ || exit 0; \ echo " $(MKDIR_P) '$(DESTDIR)$(man8dir)'"; \ $(MKDIR_P) "$(DESTDIR)$(man8dir)" || exit 1; \ { for i in $$list1; do echo "$$i"; done; \ if test -n "$$list2"; then \ for i in $$list2; do echo "$$i"; done \ | sed -n '/\.8[a-z]*$$/p'; \ fi; \ } | while read p; do \ if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ echo "$$d$$p"; echo "$$p"; \ done | \ sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ sed 'N;N;s,\n, ,g' | { \ list=; while read file base inst; do \ if test "$$base" = "$$inst"; then list="$$list $$file"; else \ echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'"; \ $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man8dir)/$$inst" || exit $$?; \ fi; \ done; \ for i in $$list; do echo "$$i"; done | $(am__base_list) | \ while read files; do \ test -z "$$files" || { \ echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'"; \ $(INSTALL_DATA) $$files "$(DESTDIR)$(man8dir)" || exit $$?; }; \ done; } uninstall-man8: @$(NORMAL_UNINSTALL) @list=''; test -n "$(man8dir)" || exit 0; \ files=`{ for i in $$list; do echo "$$i"; done; \ l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ sed -n '/\.8[a-z]*$$/p'; \ } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^8][0-9a-z]*$$,8,;x' \ -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ dir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir) tags TAGS: ctags CTAGS: cscope cscopelist: distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(MANS) installdirs: for dir in "$(DESTDIR)$(man8dir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-generic mostlyclean-am distclean: distclean-am -rm -f Makefile distclean-am: clean-am distclean-generic dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-man install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-man8 install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-man uninstall-man: uninstall-man8 .MAKE: install-am install-strip .PHONY: all all-am check check-am clean clean-generic cscopelist-am \ ctags-am distclean distclean-generic distdir dvi dvi-am html \ html-am info info-am install install-am install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-man8 install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-generic pdf \ pdf-am ps ps-am tags-am uninstall uninstall-am uninstall-man \ uninstall-man8 # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: cwdaemon-0.10.1/mkinstalldirs0000755000175000017500000000370410350336106013116 00000000000000#! /bin/sh # mkinstalldirs --- make directory hierarchy # Author: Noah Friedman # Created: 1993-05-16 # Public domain errstatus=0 dirmode="" usage="\ Usage: mkinstalldirs [-h] [--help] [-m mode] dir ..." # process command line arguments while test $# -gt 0 ; do case $1 in -h | --help | --h*) # -h for help echo "$usage" 1>&2 exit 0 ;; -m) # -m PERM arg shift test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } dirmode=$1 shift ;; --) # stop option processing shift break ;; -*) # unknown option echo "$usage" 1>&2 exit 1 ;; *) # first non-opt arg break ;; esac done for file do if test -d "$file"; then shift else break fi done case $# in 0) exit 0 ;; esac case $dirmode in '') if mkdir -p -- . 2>/dev/null; then echo "mkdir -p -- $*" exec mkdir -p -- "$@" fi ;; *) if mkdir -m "$dirmode" -p -- . 2>/dev/null; then echo "mkdir -m $dirmode -p -- $*" exec mkdir -m "$dirmode" -p -- "$@" fi ;; esac for file do set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` shift pathcomp= for d do pathcomp="$pathcomp$d" case $pathcomp in -*) pathcomp=./$pathcomp ;; esac if test ! -d "$pathcomp"; then echo "mkdir $pathcomp" mkdir "$pathcomp" || lasterr=$? if test ! -d "$pathcomp"; then errstatus=$lasterr else if test ! -z "$dirmode"; then echo "chmod $dirmode $pathcomp" lasterr="" chmod "$dirmode" "$pathcomp" || lasterr=$? if test ! -z "$lasterr"; then errstatus=$lasterr fi fi fi fi pathcomp="$pathcomp/" done done exit $errstatus # Local Variables: # mode: shell-script # sh-indentation: 2 # End: # mkinstalldirs ends here cwdaemon-0.10.1/Makefile.am0000644000175000017500000000375512254145310012352 00000000000000SUBDIRS=src doc test AM_CFLAGS = @UNIXCW_CFLAGS@ CLEANFILES = *~ EXTRA_DIST = cwdaemon.spec.in cwdaemon.spec \ test/cwtest.sh test/cwtest.c test/Makefile.am test/Makefile.in \ patches/cwdaemon-0.5-sergei.diff patches/cwdaemon-0.7-ok1zia.diff patches/cwdaemon-mt.patch \ doc/schematics/parallelport_circuit.jpg doc/schematics/parallelport_circuit.ps \ doc/schematics/serialport_circuit.jpg doc/schematics/serialport_circuit.ps \ cwdaemon.png TODO README cwsetup.sh \ debian install-data-local: @$(NORMAL_INSTALL) $(mkinstalldirs) $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/doc/schematics/parallelport_circuit.ps $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/doc/schematics/serialport_circuit.ps $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/doc/schematics/parallelport_circuit.jpg $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/doc/schematics/serialport_circuit.jpg $(DESTDIR)$(pkgdatadir) # The scripts will be installed as executable. $(INSTALL_SCRIPT) $(srcdir)/test/cwtest.sh $(DESTDIR)$(pkgdatadir) $(INSTALL_SCRIPT) $(srcdir)/cwsetup.sh $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/test/cwtest.c $(DESTDIR)$(pkgdatadir) $(INSTALL_DATA) $(srcdir)/cwdaemon.png $(DESTDIR)$(pkgdatadir) uninstall-local: $(RM) $(DESTDIR)/$(pkgdatadir)/* dist-hook: if test -d doc/schematics; then \ mkdir $(distdir)/doc/schematics; \ for file in doc/schematics/*; do \ if test -f $$file; then \ cp -p $$file $(distdir)/doc/schematics; \ fi \ done \ fi if test -d test; then \ mkdir $(distdir)/test; \ for test in test/*; do \ if test -f $$test; then \ cp -p $$test $(distdir)/test; \ fi \ done \ fi if test -d patches; then \ mkdir $(distdir)/patches; \ for patch in patches/*; do \ if test -f $$patch; then \ cp -p $$patch $(distdir)/patches; \ fi \ done \ fi rpm: Makefile make dist $(RPMBUILD) -ta $(PACKAGE)-$(VERSION).tar.gz rm $(PACKAGE)-$(VERSION).tar.gz cwdaemon-0.10.1/config.guess0000755000175000017500000012475310376045043012645 00000000000000#! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. timestamp='2005-08-03' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerppc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in *86) UNAME_PROCESSOR=i686 ;; unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: cwdaemon-0.10.1/src/0000755000175000017500000000000012326024336011157 500000000000000cwdaemon-0.10.1/src/lp.c0000644000175000017500000002210012263356674011666 00000000000000/* * cwdaemon - morse sounding daemon for the parallel or serial port * Copyright (C) 2002 - 2005 Joop Stakenborg * and many authors, see the AUTHORS file. * Copyright (C) 2012 - 2014 Kamil Ignacak * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ /* Comments from Wolf-Ruediger Juergens, DL2WRJ * very helpful: http://people.redhat.com/twaugh/parport/html/x916.html * and: http://www.xml.com/ldd/chapter/book/ch08.html * (Rubini et al. Linux Device Driver Book) */ #define _BSD_SOURCE /* S_IFMT and related. */ #include "config.h" # if HAVE_STDIO_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_UNISTD_H # include #endif #if HAVE_SYS_IOCTL_H # include #endif #if HAVE_FCNTL_H # include #endif #ifdef HAVE_LINUX_PPDEV_H # include # include #endif #ifdef HAVE_DEV_PPBUS_PPI_H # include # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #if (defined(__unix__) || defined(unix)) && !defined(USG) # include #endif #include "cwdaemon.h" /** \file lp.c - parport functions */ #if defined(HAVE_LINUX_PPDEV_H) /* Linux (ppdev) */ /** \brief Check to see whether \p fname is a parallel port type character device. Unfortunately, this is platform specific. \return -1 if the device is not suitable for use as parallel port based keyer \return a file descriptor if the device is suitable for use as a parallel port based keyer */ int dev_get_parport(const char *fname) { char nm[MAXPATHLEN]; struct stat st; int fd, m; m = snprintf(nm, sizeof(nm), "/dev/%s", fname); if (m >= sizeof(nm)) return (-1); if ((fd = open(nm, O_RDWR | O_NONBLOCK)) == -1) return (-1); if (fstat(fd, &st) == -1) goto out; if ((st.st_mode & S_IFMT) != S_IFCHR) goto out; if (ioctl(fd, PPGETMODE, &m) == -1) goto out; return (fd); out: close(fd); return (-1); } #elif defined(HAVE_DEV_PPBUS_PPI_H) /* FreeBSD (ppbus/ppi) */ int dev_get_parport(const char *fname) { char nm[MAXPATHLEN]; struct stat st; unsigned char c; int fd, m; m = snprintf(nm, sizeof(nm), "/dev/%s", fname); if (m >= sizeof(nm)) return (-1); if ((fd = open(nm, O_RDWR | O_NONBLOCK)) == -1) return (-1); if (fstat(fd, &st) == -1) goto out; if ((st.st_mode & S_IFMT) != S_IFCHR) goto out; if (ioctl(fd, PPISSTATUS, &c) == -1) goto out; return (fd); out: close(fd); return (-1); } #else /* Fallback (nothing) */ int dev_get_parport(const char *fname) { return (-1); } #endif /* Linux wrapper around PPFCONTROL */ #ifdef HAVE_LINUX_PPDEV_H static void parport_control (int fd, unsigned char controlbits, int values) { struct ppdev_frob_struct frob; frob.mask = controlbits; frob.val = values; if (ioctl (fd, PPFCONTROL, &frob) == -1) { cwdaemon_errmsg("Parallel port PPFCONTROL"); exit (1); } } #endif /* FreeBSD wrapper around PPISCTRL */ #ifdef HAVE_DEV_PPBUS_PPI_H static void parport_control (int fd, unsigned char controlbits, int values) { unsigned char val; if (ioctl (fd, PPIGCTRL, &val) == -1) { cwdaemon_errmsg("Parallel port PPIGCTRL"); exit (1); } val &= ~controlbits; val |= values; if (ioctl (fd, PPISCTRL, &val) == -1) { cwdaemon_errmsg("Parallel port PPISCTRL"); exit (1); } } #endif /* Linux wrapper around PPWDATA */ #ifdef HAVE_LINUX_PPDEV_H static void parport_write_data (int fd, unsigned char data) { if (ioctl (fd, PPWDATA, &data) == -1) { cwdaemon_errmsg("Parallel port PPWDATA"); exit (1); } } #endif /* FreeBSD wrapper around PPISDATA */ #ifdef HAVE_DEV_PPBUS_PPI_H static void parport_write_data (int fd, unsigned char data) { if (ioctl (fd, PPISDATA, &data) == -1) { cwdaemon_errmsg("Parallel port PPISDATA"); exit (1); } } #endif /* Linux wrapper around PPRSTATUS, reading the status port */ #ifdef HAVE_LINUX_PPDEV_H static unsigned char parport_read_data (int fd) { unsigned char data = 0; if (ioctl (fd, PPRSTATUS, &data) == -1) { cwdaemon_errmsg("Parallel port PPRSTATUS"); exit (1); } return data; } #endif /* FreeBSD wrapper around PPISSTATUS, reading the status port */ #ifdef HAVE_DEV_PPBUS_PPI_H static unsigned char parport_read_data (int fd) { unsigned char data = 0; if (ioctl (fd, PPISSTATUS, &data) == -1) { cwdaemon_errmsg("Parallel port PPISSTATUS"); exit (1); } return data; } #endif /* open port and setup ppdev */ int lp_init (cwdevice * dev, int fd) { #ifdef HAVE_LINUX_PPDEV_H int mode; #endif #ifdef HAVE_LINUX_PPDEV_H mode = PARPORT_MODE_PCSPP; if (ioctl (fd, PPSETMODE, &mode) == -1) { cwdaemon_errmsg("Setting parallel port mode"); close (fd); exit (1); } if (ioctl (fd, PPEXCL, NULL) == -1) { cwdaemon_errmsg("Parallel port %s is already in use", dev->desc); close (fd); exit (1); } if (ioctl (fd, PPCLAIM, NULL) == -1) { cwdaemon_errmsg("Claiming parallel port %s", dev->desc); cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "HINT: did you unload the lp kernel module?"); cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "HINT: perhaps there is another cwdaemon running?"); close (fd); exit (1); } /* Enable CW & PTT - /STROBE bit (pin 1) */ parport_control (fd, PARPORT_CONTROL_STROBE, PARPORT_CONTROL_STROBE); #endif #ifdef HAVE_DEV_PPBUS_PPI_H parport_control (fd, STROBE, STROBE); #endif dev->fd = fd; dev->reset (dev); return 0; } /* release ppdev and close port */ int lp_free (cwdevice * dev) { #ifdef HAVE_LINUX_PPDEV_H dev->reset (dev); /* Disable CW & PTT - /STROBE bit (pin 1) */ parport_control (dev->fd, PARPORT_CONTROL_STROBE, 0); ioctl (dev->fd, PPRELEASE); #endif #ifdef HAVE_DEV_PPBUS_PPI_H /* Disable CW & PTT - /STROBE bit (pin 1) */ parport_control (dev->fd, STROBE, 0); #endif close (dev->fd); return 0; } /* set to a known state */ int lp_reset (cwdevice * dev) { #if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) lp_cw (dev, 0); lp_ptt (dev, 0); lp_ssbway (dev, 0); lp_switchband (dev, 0); #endif return 0; } /* CW keying - /SELECT bit (pin 17) */ int lp_cw (cwdevice * dev, int onoff) { #ifdef HAVE_LINUX_PPDEV_H if (onoff == 1) parport_control (dev->fd, PARPORT_CONTROL_SELECT, 0); else parport_control (dev->fd, PARPORT_CONTROL_SELECT, PARPORT_CONTROL_SELECT); #endif #ifdef HAVE_DEV_PPBUS_PPI_H if (onoff == 1) parport_control (dev->fd, SELECTIN, 0); else parport_control (dev->fd, SELECTIN, SELECTIN); #endif return 0; } /* SSB PTT keying - /INIT bit (pin 16) (inverted) */ int lp_ptt (cwdevice * dev, int onoff) { #ifdef HAVE_LINUX_PPDEV_H if (onoff == 1) parport_control (dev->fd, PARPORT_CONTROL_INIT, PARPORT_CONTROL_INIT); else parport_control (dev->fd, PARPORT_CONTROL_INIT, 0); #endif #ifdef HAVE_DEV_PPBUS_PPI_H if (onoff == 1) parport_control (dev->fd, nINIT, nINIT); else parport_control (dev->fd, nINIT, 0); #endif return 0; } /* Foot switch reading / pin 15/bit 3 */ int lp_footswitch (cwdevice * dev) { unsigned char footswitch = 0xff; /* we check for bit 3 low so FF is better then 0 */ #if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) footswitch = parport_read_data (dev->fd); /* returns decimal 8 if pin 15 is high */ #endif return (int)((footswitch & 0x08) >> 3); /* bit 0=1 footswitch up, bit 0=0 footswitch down*/ } /* SSB way from mic/soundcard - AUTOLF bit (pin 14) */ int lp_ssbway (cwdevice * dev, int onoff) { #ifdef HAVE_LINUX_PPDEV_H if (onoff == 1) /* soundcard */ parport_control (dev->fd, PARPORT_CONTROL_AUTOFD, PARPORT_CONTROL_AUTOFD); else /* microphone */ parport_control (dev->fd, PARPORT_CONTROL_AUTOFD, 0); #endif #ifdef HAVE_DEV_PPBUS_PPI_H if (onoff == 1) /* soundcard */ parport_control (dev->fd, AUTOFEED, AUTOFEED); else /* microphone */ parport_control (dev->fd, AUTOFEED, 0); #endif return 0; } /* Bandswitch output on pins 9 (MSB), 8, 7, and 2 (LSB). */ int lp_switchband (cwdevice * dev, unsigned char bitpattern) { #if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) parport_write_data (dev->fd, bitpattern); #endif return 0 ; } cwdaemon-0.10.1/src/cwdaemon.h0000644000175000017500000000562712263356646013073 00000000000000/* * cwdaemon - morse sounding daemon for the parallel or serial port * Copyright (C) 2002 - 2005 Joop Stakenborg * and many authors, see the AUTHORS file. * Copyright (C) 2012 - 2014 Kamil Ignacak * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ #ifndef _CWDAEMON_H #define _CWDAEMON_H #ifndef OFF # define OFF 0 #endif #ifndef ON # define ON 1 #endif #define MICROPHONE 0 #define SOUNDCARD 1 #define MAX_DEVICE 20 typedef struct cwdev_s { int (*init) (struct cwdev_s *, int fd); int (*free) (struct cwdev_s *); int (*reset) (struct cwdev_s *); int (*cw) (struct cwdev_s *, int onoff); int (*ptt) (struct cwdev_s *, int onoff); int (*ssbway) (struct cwdev_s *, int onoff); int (*switchband) (struct cwdev_s *, unsigned char bandswitch); int (*footswitch) (struct cwdev_s *); int fd; char *desc; /* "parport0", "ttyS0", "null" - name of device used for keying. */ } cwdevice; /* cwdaemon debug verbosity levels. */ enum cwdaemon_verbosity { CWDAEMON_VERBOSITY_N, /* None. Don't display any debug information. */ CWDAEMON_VERBOSITY_E, /* Error */ CWDAEMON_VERBOSITY_W, /* Warning */ CWDAEMON_VERBOSITY_I, /* Info */ CWDAEMON_VERBOSITY_D /* Debug */ }; void cwdaemon_errmsg(const char *info, ...); void cwdaemon_debug(int verbosity, const char *func, int line, const char *format, ...); int dev_get_tty(const char *fname); int dev_get_null(const char *fname); int dev_get_parport(const char *fname); #if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) int lp_init (cwdevice * dev, int fd); int lp_free (cwdevice * dev); int lp_reset (cwdevice * dev); int lp_cw (cwdevice * dev, int onoff); int lp_ptt (cwdevice * dev, int onoff); int lp_ssbway (cwdevice * dev, int onoff); int lp_switchband (cwdevice * dev, unsigned char bandswitch); int lp_footswitch (cwdevice * dev); #endif int ttys_init (cwdevice * dev, int fd); int ttys_free (cwdevice * dev); int ttys_reset (cwdevice * dev); int ttys_cw (cwdevice * dev, int onoff); int ttys_ptt (cwdevice * dev, int onoff); int null_init (cwdevice * dev, int fd); int null_free (cwdevice * dev); int null_reset (cwdevice * dev); int null_cw (cwdevice * dev, int onoff); int null_ptt (cwdevice * dev, int onoff); #endif /* _CWDAEMON_H */ cwdaemon-0.10.1/src/Makefile.am0000644000175000017500000000233012263356620013135 00000000000000# Copyright (C) 2002 - 2005 Joop Stakenborg # and many authors, see the AUTHORS file. # Copyright (C) 2012 - 2014 Kamil Ignacak (acerion@wp.pl) # # This program is free software; you can redistribute it and/or # modify it under the terms of the GNU General Public License # as published by the Free Software Foundation; either version 2 # of the License, or (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # program(s) to be built in current dir sbin_PROGRAMS = cwdaemon # source code files used to build cwdaemon program cwdaemon_SOURCES = cwdaemon.c cwdaemon.h lp.c ttys.c null.c # target-specific preprocessor flags (#defs and include dirs) cwdaemon_CPPFLAGS = -I$(top_srcdir)/src/ # target-specific linker flags (objects to link) cwdaemon_LDADD = @UNIXCW_LIBS@ cwdaemon-0.10.1/src/cwdaemon.c0000644000175000017500000026067012323037365013056 00000000000000/* * cwdaemon - morse sounding daemon for the parallel or serial port * Copyright (C) 2002 - 2005 Joop Stakenborg * and many authors, see the AUTHORS file. * Copyright (C) 2012 - 2014 Kamil Ignacak * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Library General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301, USA. */ #define _POSIX_C_SOURCE 200809L /* nanosleep(), strdup() */ #define _GNU_SOURCE /* getopt_long() */ #include "config.h" # if HAVE_STDIO_H # include #endif #if HAVE_SYS_TYPES_H # include #endif #if HAVE_SYS_STAT_H # include #endif #if STDC_HEADERS # include # include #else # if HAVE_STDLIB_H # include # endif #endif #if HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #endif #if HAVE_UNISTD_H # include #endif #if DHAVE_ARPA_INET # include #endif #if HAVE_ARPA_INET_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_NETDB # include #endif #if HAVE_NETINET_IN_H # include #endif #if HAVE_SYS_SOCKET_H # include #endif #if HAVE_SYSLOG_H # include #endif #if HAVE_ERRNO_H # include #endif #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_SIGNAL_H # include #endif #if HAVE_STDARG_H # include #endif #if HAVE_SYS_RESOURCE_H # include #endif #if (defined(__unix__) || defined(unix)) && !defined(USG) # include #endif #include #include #if defined(HAVE_GETOPT_H) #include #endif #include /* uint32_t */ #include #include #include "cwdaemon.h" /** \file cwdaemon.c cwdaemon exchanges data with client through messages. Most of messages are sent by client application to cwdaemon - those are called in this file "requests". On several occasions cwdaemon sends some data back to the client. Such messages are called "replies". message: - request - reply Size of a message is not constant. Maximal size of a message is CWDAEMON_MESSAGE_SIZE_MAX. cwdaemon can be configured either through command line arguments on start of the daemon, or through requests (escaped requests) sent over network. Feature command line argument escaped request --------------------------------------------------------------- help -h, --help N/A version -V, --version N/A keying device -d, --cwdevice 8 don't fork daemon -n, --nofork N/A network port -p, --port 9 (obsolete) process priority -P, --priority N/A Morse speed (wpm) -s, --wpm 2 PTT delay -t, --pttdelay d PTT keying on/off N/A a sound system -x, --system f sound volume -v, --volume g Morse weighting -w, --weighting 7 sound tone -T, --tone 3 debug verbosity -i N/A debug verbosity -y, --verbosity N/A libcw debug flags -I, --libcwflags N/A debug output -f, --debugfile N/A reset parameters N/A 0 abort message N/A 4 exit daemon N/A 5 set word mode N/A 6 set SSB way N/A b tune N/A c band switch N/A e */ /* cwdaemon constants. */ #define CWDAEMON_MORSE_SPEED_DEFAULT 24 /* [wpm] */ #define CWDAEMON_MORSE_TONE_DEFAULT 800 /* [Hz] */ #define CWDAEMON_MORSE_VOLUME_DEFAULT 70 /* [%] */ /* TODO: why the limitation to 50 ms? Is it enough? */ #define CWDAEMON_PTT_DELAY_DEFAULT 0 /* [ms] */ #define CWDAEMON_PTT_DELAY_MIN 0 /* [ms] */ #define CWDAEMON_PTT_DELAY_MAX 50 /* [ms] */ /* Notice that the range accepted by cwdaemon is different than that accepted by libcw. */ #define CWDAEMON_MORSE_WEIGHTING_DEFAULT 0 #define CWDAEMON_MORSE_WEIGHTING_MIN -50 #define CWDAEMON_MORSE_WEIGHTING_MAX 50 #define CWDAEMON_NETWORK_PORT_DEFAULT 6789 #define CWDAEMON_AUDIO_SYSTEM_DEFAULT CW_AUDIO_CONSOLE /* Console buzzer, from libcw.h. */ #define CWDAEMON_VERBOSITY_DEFAULT CWDAEMON_VERBOSITY_W /* Threshold of verbosity of debug strings. */ #define CWDAEMON_USECS_PER_MSEC 1000 /* Just to avoid magic numbers. */ #define CWDAEMON_USECS_PER_SEC 1000000 /* Just to avoid magic numbers. */ #define CWDAEMON_MESSAGE_SIZE_MAX 256 /* Maximal size of single message. */ #define CWDAEMON_REQUEST_QUEUE_SIZE_MAX 4000 /* Maximal size of common buffer/fifo where requests may be pushed to. */ #define CWDAEMON_TUNE_SECONDS_MAX 10 /* Maximal time of tuning. TODO: why the limitation to 10 s? Is it enough? */ /* For developer's debugging purposes. */ //extern cw_debug_t cw_debug_object_dev; /* Default values of parameters, may be modified only through command line arguments passed to cwdaemon. After setting these variables with values passed in command line, these become the default state of cwdaemon. Values of default_* will be used when resetting libcw and cwdaemon to initial state. */ static int default_morse_speed = CWDAEMON_MORSE_SPEED_DEFAULT; static int default_morse_tone = CWDAEMON_MORSE_TONE_DEFAULT; static int default_morse_volume = CWDAEMON_MORSE_VOLUME_DEFAULT; static int default_ptt_delay = CWDAEMON_PTT_DELAY_DEFAULT; static int default_audio_system = CWDAEMON_AUDIO_SYSTEM_DEFAULT; static int default_weighting = CWDAEMON_MORSE_WEIGHTING_DEFAULT; static int default_verbosity = CWDAEMON_VERBOSITY_DEFAULT; /* Actual values of parameters, used to control ongoing operation of cwdaemon+libcw. These values can be modified through requests received from socket in cwdaemon_receive(). */ static int current_morse_speed = CWDAEMON_MORSE_SPEED_DEFAULT; static int current_morse_tone = CWDAEMON_MORSE_TONE_DEFAULT; static int current_morse_volume = CWDAEMON_MORSE_VOLUME_DEFAULT; static int current_ptt_delay = CWDAEMON_PTT_DELAY_DEFAULT; static int current_audio_system = CWDAEMON_AUDIO_SYSTEM_DEFAULT; static int current_weighting = CWDAEMON_MORSE_WEIGHTING_DEFAULT; static int current_verbosity = CWDAEMON_VERBOSITY_DEFAULT; /* Level of libcw's tone queue that triggers 'callback for low level in tone queue'. The callback function is cwdaemon_tone_queue_low_callback(), it is registered with cw_register_tone_queue_low_callback(). I REALLY don't think that you would want to set it to any value other than '1'. */ static const int tq_low_watermark = 1; /* Quick and dirty solution to following problem: when cwdaemon for some reason fails to open audio output, and attempts to play characters received from client, it crashes. It doesn't know that it attempts to play to closed audio output. This is a flag telling cwdaemon if audio output is available or not. TODO: the variable is almost unused. Start using it. TODO: decide on terminology: "audio system" or "sound system". */ static bool has_audio_output = false; /* Network variables. */ /* cwdaemon usually receives requests from client, but on occasions it needs to send a reply back. This is why in addition to request_* we also have reply_* */ static int socket_descriptor = 0; /* Default UDP port we listen on. Can be changed only through command line switch. There is a code path suggesting that it was possible to change the port using network request, but now this code path is marked as "obsolete". */ static int port = CWDAEMON_NETWORK_PORT_DEFAULT; static struct sockaddr_in request_addr; static socklen_t request_addrlen; static struct sockaddr_in reply_addr; static socklen_t reply_addrlen; static char reply_buffer[CWDAEMON_MESSAGE_SIZE_MAX]; /* Debug variables. */ /* cwdaemon may print debug strings to a disc file instead of stdout. */ static FILE *cwdaemon_debug_f = NULL; static char *cwdaemon_debug_f_path = NULL; /* This table is addressed with values defined in "enum cwdaemon_verbosity" (src/cwdaemon.h). */ static const char *cwdaemon_verbosity_labels[] = { "NN", /* None - obviously this label will never be used. */ "EE", /* Error. */ "WW", /* Warning. */ "II", /* Information. */ "DD" }; /* Debug. */ /* An integer that is a result of ORing libcw's debug flags. See libcw.h (or is it libcw_debug.h?) for numeric values of the flags. */ static long int libcw_debug_flags = 0; /* Various variables. */ static int wordmode = 0; /* Start in character mode. */ static int forking = 1; /* We fork by default. */ static int process_priority = 0; /* Scheduling priority of cwdaemon process. */ static int async_abort = 0; /* Unused variable. It is used in patches/cwdaemon-mt.patch though. */ static int inactivity_seconds = 9999; /* Inactive since nnn seconds. */ /* Incoming requests without Escape code are stored in this pseudo-FIFO before they are played. */ static char request_queue[CWDAEMON_REQUEST_QUEUE_SIZE_MAX]; /* Flag for PTT state/behaviour. */ static unsigned char ptt_flag = 0; /* Automatically turn PTT on and off. Turn PTT on when starting to play Morse characters, and turn PTT off when there are no more characters to play. "Automatically" means that cwdaemon toggles PTT without any additional actions taken by client. Client doesn't have to tell cwdaemon when to turn PTT on/off - this is done by cwdaemon itself, automatically. If ptt delay is non-zero, cwdaemon performs delay between turning PTT on and starting to play Morse characters. TODO: is there a delay before turning PTT off? */ #define PTT_ACTIVE_AUTO 0x01 /* PTT is turned on and off manually. It is the client who decides when to turn the PTT on and off. The client has to send 'a' escape code, followed by '1' or '0' to 'manually' turn PTT on or off. 'MANUAL' - the opposite of 'AUTO' where it is cwdaemon that decides when to turn PTT on and off. Perhaps "PTT_ON_REQUEST" would be a better name of the constant. */ #define PTT_ACTIVE_MANUAL 0x02 /* Don't turn PTT off until cwdaemon sends back an echo to client. client may request echoing back to it a reply when cwdaemon finishes playing given request. PTT shouldn't be turned off when sending the reply (TODO: why it shouldn't?). */ #define PTT_ACTIVE_ECHO 0x04 void cwdaemon_set_ptt_on(cwdevice *device, const char *info); void cwdaemon_set_ptt_off(cwdevice *device, const char *info); void cwdaemon_switch_band(cwdevice *device, unsigned int band); void cwdaemon_play_request(char *request); void cwdaemon_tune(uint32_t seconds); void cwdaemon_keyingevent(void *arg, int keystate); void cwdaemon_prepare_reply(char *reply, const char *request, size_t n); void cwdaemon_tone_queue_low_callback(void *arg); bool cwdaemon_initialize_socket(void); void cwdaemon_close_socket(void); ssize_t cwdaemon_sendto(const char *reply); int cwdaemon_recvfrom(char *request, int n); int cwdaemon_receive(void); void cwdaemon_handle_escaped_request(char *request); void cwdaemon_reset_almost_all(void); /* Functions managing cwdevices. */ bool cwdaemon_cwdevices_init(void); void cwdaemon_cwdevices_free(void); void cwdaemon_cwdevice_init(void); bool cwdaemon_cwdevice_set(cwdevice **device, const char *desc); void cwdaemon_cwdevice_free(void); /* Functions managing libcw output. */ bool cwdaemon_open_libcw_output(int audio_system); void cwdaemon_close_libcw_output(void); void cwdaemon_reset_libcw_output(void); /* Utility functions. */ bool cwdaemon_get_long(const char *buf, long *lvp); void cwdaemon_udelay(unsigned long us); static void cwdaemon_args_parse(int argc, char *argv[]); static void cwdaemon_args_process_short(int c, const char *optarg); static void cwdaemon_args_process_long(int argc, char *argv[]); static void cwdaemon_args_help(void); /* These two are called only in code handling command line options. No request can prompt cwdaemon to inform about version or to fork. While it would make some sense to make request to get version of cwdaemon while it is already running, it is impossible to request non-forking of daemon that - after parsing command line options - has already forked. */ static void cwdaemon_params_version(void); static void cwdaemon_params_nofork(void); static bool cwdaemon_params_cwdevice(const char *optarg); static bool cwdaemon_params_port(const char *optarg); static bool cwdaemon_params_priority(int *priority, const char *optarg); static bool cwdaemon_params_wpm(int *wpm, const char *optarg); static bool cwdaemon_params_tune(uint32_t *seconds, const char *optarg); static int cwdaemon_params_pttdelay(int *delay, const char *optarg); static bool cwdaemon_params_volume(int *volume, const char *optarg); static bool cwdaemon_params_weighting(int *weighting, const char *optarg); static bool cwdaemon_params_tone(int *tone, const char *optarg); static void cwdaemon_params_inc_verbosity(int *verbosity); static bool cwdaemon_params_set_verbosity(int *verbosity, const char *optarg); static bool cwdaemon_params_libcwflags(const char *optarg); static bool cwdaemon_params_debugfile(const char *optarg); static bool cwdaemon_params_system(int *system, const char *optarg); static bool cwdaemon_params_ptt_on_off(const char *optarg); static void cwdaemon_debug_open(void); static void cwdaemon_debug_close(void); /* Auto, manual, echo. */ static char cwdaemon_debug_ptt_flag[3 + 1]; static const char *cwdaemon_debug_ptt_flags(void); RETSIGTYPE cwdaemon_catch_sigint(int signal); cwdevice cwdevice_ttys = { .init = ttys_init, .free = ttys_free, .reset = ttys_reset, .cw = ttys_cw, .ptt = ttys_ptt, .ssbway = NULL, .switchband = NULL, .footswitch = NULL, .fd = 0, .desc = NULL }; cwdevice cwdevice_null = { .init = null_init, .free = null_free, .reset = null_reset, .cw = null_cw, .ptt = null_ptt, .ssbway = NULL, .switchband = NULL, .footswitch = NULL, .fd = 0, .desc = NULL }; #if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) cwdevice cwdevice_lp = { .init = lp_init, .free = lp_free, .reset = lp_reset, .cw = lp_cw, .ptt = lp_ptt, .ssbway = lp_ssbway, .switchband = lp_switchband, .footswitch = lp_footswitch, .fd = 0, .desc = NULL }; #endif /* Selected keying device: serial port (cwdevice_ttys) || parallel port (cwdevice_lp) || null (cwdevice_null). It should be configured with cwdaemon_cwdevice_set(). */ /* FIXME: if no device is specified in command line, and no physical device is available, the global_cwdevice is NULL, which causes the program to break. */ static cwdevice *global_cwdevice = NULL; /* catch ^C when running in foreground */ RETSIGTYPE cwdaemon_catch_sigint(__attribute__((unused)) int signal) { printf("%s: Exiting\n", PACKAGE); exit(EXIT_SUCCESS); } /** \brief Print error string to the console or syslog Function checks if cwdaemon has forked, and prints given error string to stdout (if cwdaemon hasn't forked) or to syslog (if cwdaemon has forked). Function accepts printf-line formatting string as first argument, and a set of optional arguments to be inserted into the formatting string. \param format - first part of an error string, a formatting string */ void cwdaemon_errmsg(const char *format, ...) { va_list ap; char s[1025]; va_start(ap, format); vsnprintf(s, 1024, format, ap); va_end(ap); if (forking) { syslog(LOG_ERR, "%s\n", s); } else { printf("%s: %s failed: \"%s\"\n", PACKAGE, s, strerror(errno)); fflush(stdout); } return; } /** \brief Print debug string to debug file Function decides if given \p verbosity level is sufficient to print given \p format debug string, and prints it to predefined file. If current global verbosity level is "None", no information will be printed. Currently \p verbosity can have one of values defined in enum cwdaemon_verbosity. Function accepts printf-line formatting string as last named argument (\p format), and a set of optional arguments to be inserted into the formatting string. \param verbosity - verbosity level of given debug string \param format - formatting string of a debug string being printed */ void cwdaemon_debug(int verbosity, __attribute__((unused)) const char *func, __attribute__((unused)) int line, const char *format, ...) { if (current_verbosity > CWDAEMON_VERBOSITY_N && verbosity <= current_verbosity && cwdaemon_debug_f) { va_list ap; char s[1024 + 1]; va_start(ap, format); vsnprintf(s, 1024, format, ap); va_end(ap); fprintf(cwdaemon_debug_f, "%s:%s: %s\n", PACKAGE, cwdaemon_verbosity_labels[verbosity], s); // fprintf(cwdaemon_debug_f, "cwdaemon: %s(): %d\n", func, line); fflush(cwdaemon_debug_f); } return; } void cwdaemon_debug_close(void) { if (cwdaemon_debug_f && cwdaemon_debug_f != stdout && cwdaemon_debug_f != stderr) { fclose(cwdaemon_debug_f); cwdaemon_debug_f = NULL; } return; } const char *cwdaemon_debug_ptt_flags(void) { if (ptt_flag & PTT_ACTIVE_AUTO) { cwdaemon_debug_ptt_flag[0] = 'A'; } else { cwdaemon_debug_ptt_flag[0] = 'a'; } if (ptt_flag & PTT_ACTIVE_MANUAL) { cwdaemon_debug_ptt_flag[1] = 'M'; } else { cwdaemon_debug_ptt_flag[1] = 'm'; } if (ptt_flag & PTT_ACTIVE_ECHO) { cwdaemon_debug_ptt_flag[2] = 'E'; } else { cwdaemon_debug_ptt_flag[2] = 'e'; } cwdaemon_debug_ptt_flag[3] = '\0'; return cwdaemon_debug_ptt_flag; } /** \brief Sleep for specified amount of microseconds Function can detect an interrupt from a signal, and continue sleeping, but only once. \param us - microseconds to sleep */ void cwdaemon_udelay(unsigned long us) { struct timespec sleeptime, time_remainder; sleeptime.tv_sec = 0; sleeptime.tv_nsec = us * 1000; if (nanosleep(&sleeptime, &time_remainder) == -1) { if (errno == EINTR) { nanosleep(&time_remainder, NULL); } else { cwdaemon_errmsg("Nanosleep"); } } return; } /** \brief Band switch function using LPT port Band switch function using LPT (parallel) port of PC computer. In general, data is transmitted through LPT using pins 9 (MSB) - 2 (LSB). It seems that "TR Log" software has established a standard for controlling band switches using LPT port (or "TR Log" has just followed already established standard. Original information in cwdaemon's documentation mentions: "Pinout is compatible with the standard (CT, TRlog)."). cwdaemon follows the standard. The standard utilizes only a subset of the data pins: pins 9, 8, 7, and 2. From TR Log manual, version 6.79, Appendix A, Table A.3 (the manual is available at www.trlog.com): Hex value is transmitted through pins 9 (MSB), 8, 7, and 2 (LSB) Band Value 160 1 80 2 40 3 30 4 20 5 17 6 15 7 12 8 10 9 6 A 2 B 222 C 432 D 902 E 1GHz F Other or None 0 The function works only for a subset of devices that are able to perform band switching. Currently the only such device is parallel port. \brief device - device to use to switch band \brief band - band number to switch to (a hex number) */ #if defined (HAVE_LINUX_PPDEV_H) || defined (HAVE_DEV_PPBUS_PPI_H) void cwdaemon_switch_band(cwdevice *device, unsigned int band) { unsigned int bit_pattern = (band & 0x01) | ((band & 0x0e) << 4); if (device->switchband) { device->switchband(device, bit_pattern); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "set band switch to %x", band); } else { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "band switch output not implemented"); } return; } #endif /** \brief Switch PTT on \param device - current keying device \param info - debug information displayed when performing the switching */ void cwdaemon_set_ptt_on(cwdevice *device, const char *info) { /* For backward compatibility it is assumed that ptt_delay=0 means "cwdaemon shouldn't turn PTT on, at all". */ if (current_ptt_delay && !(ptt_flag & PTT_ACTIVE_AUTO)) { device->ptt(device, ON); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, info); #if 0 int rv = cw_queue_tone(current_ptt_delay * CWDAEMON_USECS_PER_MSEC, 0); /* try to 'enqueue' delay */ if (rv == CW_FAILURE) { /* Old libcw may reject freq=0. */ cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "cw_queue_tone() failed: rv=%d errno=\"%s\", using udelay() instead", rv, strerror(errno)); /* TODO: wouldn't it be simpler to not to call cw_queue_tone() and use only cwdaemon_udelay()? */ cwdaemon_udelay(current_ptt_delay * CWDAEMON_USECS_PER_MSEC); } #else cwdaemon_udelay(current_ptt_delay * CWDAEMON_USECS_PER_MSEC); #endif ptt_flag |= PTT_ACTIVE_AUTO; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag +PTT_ACTIVE_AUTO (%02d, %d)", ptt_flag, __LINE__); } return; } /** \brief Switch PTT off \param device - current keying device \param info - debug information displayed when performing the switching */ void cwdaemon_set_ptt_off(cwdevice *device, const char *info) { device->ptt(device, OFF); ptt_flag = 0; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag = 0 (%02d, %d)", ptt_flag, __LINE__); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, info); return; } /** \brief Tune for a number of seconds Play a continuous sound for a given number of seconds. Parameter type is uint32_t, which gives us maximum of 4294967295 seconds, i.e. ~136 years. Should be enough. \param seconds - time of tuning */ void cwdaemon_tune(uint32_t seconds) { if (seconds > 0) { cw_flush_tone_queue(); cwdaemon_set_ptt_on(global_cwdevice, "PTT (TUNE) on"); /* make it similar to normal CW, allowing interrupt */ for (uint32_t i = 0; i < seconds; i++) { cw_queue_tone(CWDAEMON_USECS_PER_SEC, current_morse_tone); } cw_send_character('e'); /* append minimal tone to return to normal flow */ } return; } /** \brief Reset some initial parameters of cwdaemon and libcw */ void cwdaemon_reset_almost_all(void) { current_morse_speed = default_morse_speed; current_morse_tone = default_morse_tone; current_morse_volume = default_morse_volume; current_audio_system = default_audio_system; current_ptt_delay = default_ptt_delay; current_weighting = default_weighting; /* Right now there is no way to alter current_verbosity after start of daemon, but it's easy to imagine a new network request to modify verbosity. Maybe not very useful (to change verbosity of debug strings displayed on remote machine), but during development phase it may be useful. Anyway... Right now there is no such request, but for consistency I'm resetting the current_verbosity as well. */ current_verbosity = default_verbosity; cwdaemon_reset_libcw_output(); return; } /** \brief Open audio sink using libcw \param audio_system - audio system to be used by libcw \return -1 on failure \return 0 otherwise */ bool cwdaemon_open_libcw_output(int audio_system) { int rv = cw_generator_new(audio_system, NULL); if (audio_system == CW_AUDIO_OSS && rv == CW_FAILURE) { /* When reopening libcw output, previous audio system may block audio device for a short period of time after the output has been closed. In such a situation OSS may fail to open audio device. Let's give it some time. */ for (int i = 0; i < 5; i++) { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "delaying switching to OSS, please wait few seconds."); sleep(4); rv = cw_generator_new(audio_system, NULL); if (rv == CW_SUCCESS) { break; } } } if (rv != CW_FAILURE) { rv = cw_generator_start(); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "starting generator with sound system \"%s\": %s", cw_get_audio_system_label(audio_system), rv ? "success" : "failure"); } else { /* FIXME: When cwdaemon failed to create a generator, and user kills non-forked cwdaemon through Ctrl+C, there is a memory protection error. It seems that this error has been fixed with changes in libcw, committed on 31.12.2012. To be observed. */ cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "failed to create generator with sound system \"%s\"", cw_get_audio_system_label(audio_system)); } return rv == CW_FAILURE ? false : true; } /** \brief Close libcw audio output */ void cwdaemon_close_libcw_output(void) { cw_generator_stop(); cw_generator_delete(); return; } /** \brief Reset parameters of libcw to default values Function uses values of cwdaemon's global 'default_' variables, and some other values to reset state of libcw. */ void cwdaemon_reset_libcw_output(void) { /* This function is called when cwdaemon receives '0' escape code. README describes this code as "Reset to default values". Therefore we use default_* below. */ /* Delete old generator (if it exists). */ cwdaemon_close_libcw_output(); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "setting sound system \"%s\"", cw_get_audio_system_label(default_audio_system)); if (cwdaemon_open_libcw_output(default_audio_system)) { has_audio_output = true; } else { has_audio_output = false; return; } /* Remember that tone queue is bound to a generator. When cwdaemon switches on request to other sound system, it will have to re-register the callback. */ cw_register_tone_queue_low_callback(cwdaemon_tone_queue_low_callback, NULL, tq_low_watermark); cw_set_frequency(default_morse_tone); cw_set_send_speed(default_morse_speed); cw_set_volume(default_morse_volume); cw_set_gap(0); cw_set_weighting(default_weighting * 0.6 + CWDAEMON_MORSE_WEIGHTING_MAX); return; } /** \brief Properly parse a 'long' integer Parse a string with digits, convert it to a long integer \param buf - input buffer with a string \param lvp - pointer to output long int variable \return false on failure \return true on success */ bool cwdaemon_get_long(const char *buf, long *lvp) { errno = 0; char *ep; long lv = strtol(buf, &ep, 10); if (buf[0] == '\0' || *ep != '\0') { return false; } if (errno == ERANGE && (lv == LONG_MAX || lv == LONG_MIN)) { return false; } *lvp = lv; return true; } /** \brief Prepare reply for the caller Fill \p reply buffer with data from given \p request, prepare some other variables for sending reply to the client. Text of the reply is usually defined by caller, i.e. it is sent by client to cwdaemon and marked by the client as text to be used in reply. The reply should be sent back to client as soon as cwdaemon finishes processing/playing received request. There are two different procedures for recognizing what should be sent back as reply and when: \li received request ending with '^' character: the text of the request should be played, but it also should be used as a reply. This function does not specify when the reply should be sent back. All it does is it prepares the text of reply. '^' can be used for char-by-char communication: client software message with single character followed by '^'. cwdaemon plays the character, and informs client software about playing the sound. Then client software can send request with next character followed by '^'. \li received request starting with "h" escape code: the text of request should be sent back to the client after playing text of *next* request. So there are two requests sent by client to cwdaemon: first defines reply, and the second defines text to be played. First should be echoed back (but not played), second should be played. \param reply - buffer for reply (allocated by caller) \param request - buffer with request \param n - size of data in request */ void cwdaemon_prepare_reply(char *reply, const char *request, size_t n) { /* Since we need to prepare a reply, we need to mark our intent to send echo. The echo (reply) will be sent to client when libcw's tone queue becomes empty. It is important to set this flag at the beginning of the function. */ ptt_flag |= PTT_ACTIVE_ECHO; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag +PTT_ACTIVE_ECHO (%02d, %d)", ptt_flag, __LINE__); memcpy(&reply_addr, &request_addr, sizeof(reply_addr)); /* Remember sender. */ reply_addrlen = request_addrlen; strncpy(reply, request, n); reply[n] = '\0'; /* FIXME: where is boundary checking? */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "text of request: \"%s\", text of reply: \"%s\"", request, reply); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "now waiting for end of transmission before echoing back to client"); return; } /** \brief Wrapper around sendto() Wrapper around sendto(), sending a \p reply to client. Client is specified by reply_* network variables. \param reply - reply to be sent \return -1 on failure \return number of characters sent on success */ ssize_t cwdaemon_sendto(const char *reply) { size_t len = strlen(reply); /* TODO: Do we *really* need to end replies with CRLF? */ assert(reply[len - 2] == '\r' && reply[len - 1] == '\n'); ssize_t rv = sendto(socket_descriptor, reply, len, 0, (struct sockaddr *) &reply_addr, reply_addrlen); if (rv == -1) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "sendto: \"%s\"", strerror(errno)); return -1; } else { return rv; } } /** \brief Receive request sent through socket Received request is returned through \p request. Possible trailing '\r' and '\n' characters are stripped. Request is ended with '\0'. \param request - buffer for received request \param n - size of the buffer \return -2 if peer has performed an orderly shutdown \return -1 if an error occurred during call to recvfrom \return 0 if no request has been received \return length of received request otherwise */ int cwdaemon_recvfrom(char *request, int n) { ssize_t recv_rc = recvfrom(socket_descriptor, request, n, 0, /* flags */ (struct sockaddr *) &request_addr, /* TODO: request_addrlen may be modified. Check it. */ &request_addrlen); if (recv_rc == -1) { /* No requests available? */ if (errno == EAGAIN || errno == EWOULDBLOCK) { /* "a portable application should check for both possibilities" */ /* Yup, no requests available from non-blocking socket. Good luck next time. */ /* TODO: how much CPU time does it cost to loop waiting for a request? Would it be reasonable to configure the socket as blocking? How large is receive timeout? */ return 0; } else { /* Some other error. May be a serious error. */ cwdaemon_errmsg("Recvfrom"); return -1; } } else if (recv_rc == 0) { /* "peer has performed an orderly shutdown" */ return -2; } else { ; /* pass */ } /* Remove CRLF if present. TCP buffer may end with '\n', so make sure that every request is consistently ended with NUL. Do it early, do it now. */ int z; while (recv_rc > 0 && ( (z = request[recv_rc - 1]) == '\n' || z == '\r') ) { request[--recv_rc] = '\0'; } return recv_rc; } /** \brief Receive message from socket, act upon it Watch the socket and if there is an escape character check what it is, otherwise play morse. \return 0 when an escape code has been received \return 0 when no request or an empty request has been received \return 1 when a text request has been played */ int cwdaemon_receive(void) { /* The request may be a printable string, so +1 for ending NUL added somewhere below is necessary. */ char request_buffer[CWDAEMON_MESSAGE_SIZE_MAX + 1]; ssize_t recv_rc = cwdaemon_recvfrom(request_buffer, CWDAEMON_MESSAGE_SIZE_MAX); if (recv_rc == -2) { /* Sender has closed connection. */ return 0; } else if (recv_rc == -1) { /* TODO: should we really exit? Shouldn't we recover from the error? */ exit(EXIT_FAILURE); } else if (recv_rc == 0) { cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "...recv_from (no data)"); return 0; } else { ; /* pass */ } request_buffer[recv_rc] = '\0'; if (request_buffer[0] != 27) { /* No ESCAPE. All received data should be treated as text to be sent using Morse code. */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "request: \"%s\"", request_buffer); if ((strlen(request_buffer) + strlen(request_queue)) <= CWDAEMON_REQUEST_QUEUE_SIZE_MAX - 1) { strcat(request_queue, request_buffer); cwdaemon_play_request(request_queue); } else { ; /* TODO: how to handle this case? */ } return 1; } else { cwdaemon_handle_escaped_request(request_buffer); return 0; } } /** The function may call exit() if a request from client asks the daemon to exit. */ void cwdaemon_handle_escaped_request(char *request) { long lv; /* Take action depending on Escape code. */ switch ((int) request[1]) { case '0': /* Reset all values. */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested resetting of parameters"); request_queue[0] = '\0'; cwdaemon_reset_almost_all(); wordmode = 0; async_abort = 0; global_cwdevice->reset(global_cwdevice); ptt_flag = 0; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag = 0 (%02d, %d)", ptt_flag, __LINE__); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "resetting completed"); break; case '2': /* Set speed of Morse code, in words per minute. */ if (cwdaemon_params_wpm(¤t_morse_speed, request + 2)) { cw_set_send_speed(current_morse_speed); } break; case '3': /* Set tone (frequency) of morse code, in Hz. The code assumes that minimal valid frequency is zero. */ assert (CW_FREQUENCY_MIN == 0); if (cwdaemon_params_tone(¤t_morse_tone, request + 2)) { if (current_morse_tone > 0) { cw_set_frequency(current_morse_tone); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "tone: %d Hz", current_morse_tone); /* TODO: Should we really be adjusting volume when the command is for frequency? It would be more "elegant" not to do so. */ cw_set_volume(current_morse_volume); } else { /* current_morse_tone==0, sidetone off */ cw_set_volume(0); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "volume off"); } } break; case '4': /* Abort currently sent message. */ if (wordmode) { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested aborting of message - ignoring (word mode is active)"); } else { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested aborting of message - executing (character mode is active)"); if (ptt_flag & PTT_ACTIVE_ECHO) { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "echo \"break\""); cwdaemon_sendto("break\r\n"); } request_queue[0] = '\0'; cw_flush_tone_queue(); cw_wait_for_tone_queue(); if (ptt_flag) { cwdaemon_set_ptt_off(global_cwdevice, "PTT off"); } ptt_flag &= 0; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag = 0 (%02d, %d)", ptt_flag, __LINE__); } break; case '5': /* Exit cwdaemon. */ errno = 0; #if 0 char address[INET_ADDRSTRLEN]; inet_ntop(request_addr.sin_family, (struct in_addr*) &(request_addr.sin_addr.s_addr), address, INET_ADDRSTRLEN); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested exit of daemon (client address: %s)", address); #else cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested exit of daemon"); #endif exit(EXIT_SUCCESS); case '6': /* Set uninterruptable (word mode). */ request[0] = '\0'; request_queue[0] = '\0'; wordmode = 1; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "wordmode set"); break; case '7': /* Set weighting of morse code dits and dashes. Remember that cwdaemon uses values in range -50/+50, but libcw accepts values in range 20/80. This is why you have the calculation when calling cw_set_weighting(). */ if (cwdaemon_params_weighting(¤t_weighting, request + 2)) { cw_set_weighting(current_weighting * 0.6 + CWDAEMON_MORSE_WEIGHTING_MAX); } break; case '8': { /* Set type of keying device. */ cwdaemon_params_cwdevice(request + 2); break; } case '9': /* Change network port number. TODO: why this is obsolete? */ cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "obsolete request \"9\" (change network port), ignoring"); break; case 'a': /* PTT keying on or off */ cwdaemon_params_ptt_on_off(request + 2); break; case 'b': /* SSB way. */ #if defined(HAVE_LINUX_PPDEV_H) || defined(HAVE_DEV_PPBUS_PPI_H) if (!cwdaemon_get_long(request + 2, &lv)) { break; } if (lv) { if (global_cwdevice->ssbway) { global_cwdevice->ssbway(global_cwdevice, SOUNDCARD); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "\"SSB way\" set to SOUNDCARD", PACKAGE); } else { cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "\"SSB way\" to SOUNDCARD unimplemented"); } } else { if (global_cwdevice->ssbway) { global_cwdevice->ssbway(global_cwdevice, MICROPHONE); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "\"SSB way\" set to MICROPHONE"); } else { cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "\"SSB way\" to MICROPHONE unimplemented"); } } #else cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "\"SSB way\" through parallel port unavailable (parallel port not configured)."); #endif break; case 'c': { uint32_t seconds = 0; /* Tune for a number of seconds. */ if (cwdaemon_params_tune(&seconds, request + 2)) { cwdaemon_tune(seconds); } break; } case 'd': { /* Set PTT delay (TOD, Turn On Delay). The value is milliseconds. */ int rv = cwdaemon_params_pttdelay(¤t_ptt_delay, request + 2); if (rv == 0) { /* Value totally invalid. */ cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested PTT delay [ms]: \"%s\" (should be between %d and %d inclusive)", request + 2, CWDAEMON_PTT_DELAY_MIN, CWDAEMON_PTT_DELAY_MAX); } else if (rv == 1) { /* Value totally valid. Information debug string has been already printed in cwdaemon_params_pttdelay(). */ } else { /* rv == 2 */ /* Value invalid (out-of-range), but acceptable when sent over network request and then clipped to be in-range. Value has been clipped in cwdaemon_params_pttdelay(), but a warning debug string must be printed here. */ cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "requested PTT delay [ms] out of range: \"%s\", clipping to \"%d\" (should be between %d and %d inclusive)", request + 2, CWDAEMON_PTT_DELAY_MAX, CWDAEMON_PTT_DELAY_MIN, CWDAEMON_PTT_DELAY_MAX); } if (rv && current_ptt_delay == 0) { cwdaemon_set_ptt_off(global_cwdevice, "ensure PTT off"); } } break; case 'e': /* Set band switch output on parport bits 9 (MSB), 8, 7, 2 (LSB). */ #if defined(HAVE_LINUX_PPDEV_H) || defined(HAVE_DEV_PPBUS_PPI_H) if (!cwdaemon_get_long(request + 2, &lv)) { break; } /* We use four bits to select band, this gives 16 bands: 0 - 15. */ if (lv >= 0 && lv <= 15) { cwdaemon_switch_band(global_cwdevice, lv); } #else cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "band switching through parallel port is unavailable (parallel port not configured)"); #endif break; case 'f': { /* Change sound system used by libcw. */ /* FIXME: if "request+2" describes unavailable sound system, cwdaemon fails to open the new sound system. Since the old one is closed with cwdaemon_close_libcw_output(), cwdaemon has no working sound system, and is unable to play sound. This can be fixed either by querying libcw if "request+2" sound system is available, or by first trying to open new sound system and then - on success - closing the old one. In either case cwdaemon would require some method to inform client about success or failure to open new sound system. */ if (cwdaemon_params_system(¤t_audio_system, request + 2)) { /* Handle valid request for changing sound system. */ cwdaemon_close_libcw_output(); if (cwdaemon_open_libcw_output(current_audio_system)) { has_audio_output = true; } else { /* Fall back to NULL audio system. */ cwdaemon_close_libcw_output(); if (cwdaemon_open_libcw_output(CW_AUDIO_NULL)) { cwdaemon_debug(CWDAEMON_VERBOSITY_W, __func__, __LINE__, "fall back to \"Null\" sound system"); current_audio_system = CW_AUDIO_NULL; has_audio_output = true; } else { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "failed to fall back to \"Null\" sound system"); has_audio_output = false; } } if (has_audio_output) { /* Tone queue is bound to a generator. Creating new generator requires re-registering the callback. */ cw_register_tone_queue_low_callback(cwdaemon_tone_queue_low_callback, NULL, tq_low_watermark); /* This call recalibrates length of dot and dash. */ cw_set_frequency(current_morse_tone); cw_set_send_speed(current_morse_speed); cw_set_volume(current_morse_volume); /* Regardless if we are using "default" or "current" parameters, the gap is always zero. */ cw_set_gap(0); cw_set_weighting(current_weighting * 0.6 + CWDAEMON_MORSE_WEIGHTING_MAX); } } break; } case 'g': /* Set volume of sound, in percents. */ if (cwdaemon_params_volume(¤t_morse_volume, request + 2)) { cw_set_volume(current_morse_volume); } break; case 'h': /* Data after 'h' is a text to be used as reply. It shouldn't be echoed back to client immediately. Instead, cwdaemon should wait for another request (I assume that it will be a regular text to be played), play it, and then send prepared reply back to the client. So this is a reply with delay. */ /* 'request + 1' skips the leading , but preserves 'h'. The 'h' is a part of reply text. If the client didn't specify reply text, the 'h' will be the only content of server's reply. */ cwdaemon_prepare_reply(reply_buffer, request + 1, strlen(request + 1)); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "reply is ready, waiting for message from client (reply: \"%s\")", reply_buffer); /* cwdaemon will wait for queue-empty callback before sending the reply. */ break; } /* switch ((int) request[1]) */ return; } /** \brief Process received request, play relevant characters Check every character in given request, act upon markers for speed increase or decrease, and play other characters. Function modifies contents of buffer \p request. \param request - request to be processed */ void cwdaemon_play_request(char *request) { //cw_block_callback(true); char *x = request; while (*x) { switch ((int) *x) { case '+': case '-': /* Speed increase & decrease */ /* Repeated '+' and '-' characters are allowed, in such cases increase and decrease of speed is multiple of 2 wpm. */ do { current_morse_speed += (*x == '+') ? 2 : -2; x++; } while (*x == '+' || *x == '-'); if (current_morse_speed < CW_SPEED_MIN) { current_morse_speed = CW_SPEED_MIN; } else if (current_morse_speed > CW_SPEED_MAX) { current_morse_speed = CW_SPEED_MAX; } else { ; } cw_set_send_speed(current_morse_speed); break; case '~': /* 2 dots time additional for the next char. The gap is always reset after playing the char. */ cw_set_gap(2); x++; break; case '^': /* Send echo to main program when CW playing is done. */ *x = '\0'; /* Remove '^' and possible trailing garbage. */ /* I'm guessing here that '^' can be found at the end of request, and it means "echo text of current request back to sender once you finish playing it". */ cwdaemon_prepare_reply(reply_buffer, request, strlen(request)); /* cwdaemon will wait for queue-empty callback before sending the reply. */ break; case '*': /* TODO: what's this? */ *x = '+'; default: cwdaemon_set_ptt_on(global_cwdevice, "PTT (auto) on"); /* PTT is now in AUTO. It will be turned off on low tone queue, in cwdaemon_tone_queue_low_callback(). */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "Morse character \"%c\" to be queued in libcw", *x); cw_send_character(*x); cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "Morse character \"%c\" has been queued in libcw", *x); x++; if (cw_get_gap() == 2) { if (*x == '^') { /* '^' is supposed to be the last character in the message, meaning that all that was before it should be used as reply text. So x++ will jump to ending NUL. */ x++; } else { cw_set_gap(0); } } break; } } /* All characters processed, mark buffer as empty. */ *request = '\0'; //cw_block_callback(false); return; } /** \brief Callback function for key state change Function passed to libcw, will be called every time a state of libcw's internal ("software") key changes, i.e. every time it starts or ends producing dit or dash. When the software key is closed (dit or dash), \p keystate is 1. Otherwise \p keystate is 0. Following the changes of \p keystate the function changes state of bit on output of its keying device. So it goes like this: input text in cwdaemon is split into characters -> characters in cwdaemon are sent to libcw -> characters in libcw are converted to dits/dashes -> dits/dashes are played by libcw, and at the same time libcw changes state of its software key -> libcw calls cwdaemon_keyingevent() on changes of software key -> cwdaemon_keyingevent() changes state of a bit on cwdaemon's keying device \param arg - unused argument \param keystate - state of a key, as seen by libcw */ void cwdaemon_keyingevent(__attribute__((unused)) void *arg, int keystate) { if (keystate == 1) { global_cwdevice->cw(global_cwdevice, ON); } else { global_cwdevice->cw(global_cwdevice, OFF); } inactivity_seconds = 0; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "keying event \"%d\"", keystate); return; } /** \brief Callback routine called when tone queue is empty Callback routine registered with cw_register_tone_queue_low_callback(), will be called by libcw every time number of tones drops in queue below specific level. \param arg - unused argument */ void cwdaemon_tone_queue_low_callback(__attribute__((unused)) void *arg) { int len = cw_get_tone_queue_length(); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: start, TQ len = %d, PTT flag = %02x/%s", len, ptt_flag, cwdaemon_debug_ptt_flags()); if (len > tq_low_watermark) { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: TQ len larger than watermark, TQ len = %d", len); } if (ptt_flag == PTT_ACTIVE_AUTO /* PTT is (most probably?) on, in purely automatic mode. This means that as soon as there are no new chars to play, we should turn PTT off. */ && request_queue[0] == '\0' /* No new text has been queued in the meantime. */ && cw_get_tone_queue_length() <= tq_low_watermark) { /* TODO: check if this third condition is really necessary. */ /* Originally it was 'cw_get_tone_queue_length() <= 1', I'm guessing that '1' here was the same '1' as the third argument to cw_register_tone_queue_low_callback(). Feel free to correct me ;) */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: branch 1, PTT flag = %02d/%s", ptt_flag, cwdaemon_debug_ptt_flags()); cwdaemon_set_ptt_off(global_cwdevice, "PTT (auto) off"); } else if (ptt_flag & PTT_ACTIVE_ECHO) { /* PTT_ACTIVE_ECHO: client has used special request to indicate that it is waiting for reply (echo) from the server (i.e. cwdaemon) after the server plays all characters. */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: branch 2, PTT flag = %02d/%s", ptt_flag, cwdaemon_debug_ptt_flags()); /* Since echo is being sent, we can turn the flag off. For some reason cwdaemon works better when we turn the flag off before sending the reply, rather than turning if after sending the reply. */ ptt_flag &= ~PTT_ACTIVE_ECHO; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: PTT flag -PTT_ACTIVE_ECHO, PTT flag = %02d/%s", ptt_flag, cwdaemon_debug_ptt_flags()); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: echoing \"%s\" back to client <----------", reply_buffer); strcat(reply_buffer, "\r\n"); /* Ensure exactly one CRLF */ cwdaemon_sendto(reply_buffer); /* If this line is uncommented, the callback erases a valid reply that should be sent back to client. Commenting the line fixes the problem, and doesn't seem to introduce any new ones. TODO: investigate the original problem of erasing a valid reply. */ /* reply_buffer[0] = '\0'; */ /* wait a bit more since we expect to get more text to send TODO: the comment above is a bit unclear. Perhaps it means that we have dealt with escape request requesting an echo, and now there may be a second request (following the escape request) that still needs to be played ("more text to send"). If so, we need to call the callback again, so that it can check if text buffer is non-empty and if tone queue is non-empty. We call the callback again indirectly, by simulating almost empty tone queue (i.e. by adding only two tones to tone queue). I wonder why we don't call the callback directly, maybe it has something to do with avoiding recursion? */ if (ptt_flag == PTT_ACTIVE_AUTO) { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: queueing two empty tones"); cw_queue_tone(1, 0); /* ensure Q-empty condition again */ cw_queue_tone(1, 0); /* when trailing gap also 'sent' */ } } else { /* TODO: how to correctly handle this case? Should we do something? */ cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: branch 3, PTT flag = %02d/%s", ptt_flag, cwdaemon_debug_ptt_flags()); } cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "low TQ callback: end, TQ len = %d, PTT flag = %02x/%s\n\n", cw_get_tone_queue_length(), ptt_flag, cwdaemon_debug_ptt_flags()); return; } static const char *cwdaemon_args_short = "d:hniy:I:f:p:P:s:t:T:v:Vw:x:"; static struct option cwdaemon_args_long[] = { { "cwdevice", required_argument, 0, 0}, /* Keying device. */ { "nofork", no_argument, 0, 0}, /* Don't fork. */ { "port", required_argument, 0, 0}, /* Network port number. */ #if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS) { "priority", required_argument, 0, 0}, /* Process priority. */ #endif { "wpm", required_argument, 0, 0}, /* Sending speed. */ { "pttdelay", required_argument, 0, 0}, /* PTT delay. */ { "volume", required_argument, 0, 0}, /* Sound volume. */ { "version", no_argument, 0, 0}, /* Program's version. */ { "weighting", required_argument, 0, 0}, /* CW weight. */ { "tone", required_argument, 0, 0}, /* CW tone. */ { "verbosity", required_argument, 0, 0}, /* Verbosity of cwdaemon's debug strings. */ { "libcwflags", required_argument, 0, 0}, /* libcw's debug flags. */ { "debugfile", required_argument, 0, 0}, /* Path to output debug file. */ { "system", required_argument, 0, 0}, /* Audio system. */ { "help", no_argument, 0, 0}, /* Print help text and exit. */ { 0, 0, 0, 0} }; void cwdaemon_args_process_long(int argc, char *argv[]) { int option_index = 0; int c = 0; while ((c = getopt_long(argc, argv, cwdaemon_args_short, cwdaemon_args_long, &option_index)) != -1) { if (c == 0) { cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "long option \"%s\"%s%s\n", cwdaemon_args_long[option_index].name, optarg ? "=" : "", optarg ? optarg : ""); const char *optname = cwdaemon_args_long[option_index].name; if (!strcmp(optname, "cwdevice")) { if (!cwdaemon_params_cwdevice(optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "nofork")) { cwdaemon_params_nofork(); } else if (!strcmp(optname, "port")) { if (!cwdaemon_params_port(optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "priority")) { if (!cwdaemon_params_priority(&process_priority, optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "wpm")) { if (!cwdaemon_params_wpm(&default_morse_speed, optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "pttdelay")) { if (cwdaemon_params_pttdelay(&default_ptt_delay, optarg) != 1) { /* When processing command line arguments we are very strict, and accept only fully valid optarg. */ cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested PTT delay [ms]: \"%s\" (should be between %d and %d inclusive)", optarg, CWDAEMON_PTT_DELAY_MIN, CWDAEMON_PTT_DELAY_MAX); exit(EXIT_FAILURE); } } else if (!strcmp(optname, "volume")) { if (!cwdaemon_params_volume(&default_morse_volume, optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "version")) { cwdaemon_params_version(); exit(EXIT_SUCCESS); } else if (!strcmp(optname, "weighting")) { if (!cwdaemon_params_weighting(&default_weighting, optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "tone")) { if (!cwdaemon_params_tone(&default_morse_tone, optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "verbosity")) { if (!cwdaemon_params_set_verbosity(&default_verbosity, optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "libcwflags")) { if (!cwdaemon_params_libcwflags(optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "debugfile")) { if (!cwdaemon_params_debugfile(optarg)) { exit(EXIT_FAILURE); } } else if (!strcmp(optname, "system")) { if (!cwdaemon_params_system(&default_audio_system, optarg)) { exit(EXIT_FAILURE); } } else { cwdaemon_args_help(); exit(EXIT_SUCCESS); } } else { cwdaemon_args_process_short(c, optarg); } } return; } void cwdaemon_args_process_short(int c, const char *optarg) { switch (c) { case ':': case '?': case 'h': cwdaemon_args_help(); exit(EXIT_SUCCESS); case 'd': if (!cwdaemon_params_cwdevice(optarg)) { exit(EXIT_FAILURE); } break; case 'n': cwdaemon_params_nofork(); break; case 'p': if (!cwdaemon_params_port(optarg)) { exit(EXIT_FAILURE); } break; #if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS) case 'P': if (!cwdaemon_params_priority(&process_priority, optarg)) { exit(EXIT_FAILURE); } break; #endif case 's': if (!cwdaemon_params_wpm(&default_morse_speed, optarg)) { exit(EXIT_FAILURE); } break; case 't': if (cwdaemon_params_pttdelay(&default_ptt_delay, optarg) != 1) { /* When processing command line arguments we are very strict, and accept only fully valid optarg. */ cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested PTT delay [ms]: \"%s\" (should be between %d and %d inclusive)", optarg, CWDAEMON_PTT_DELAY_MIN, CWDAEMON_PTT_DELAY_MAX); exit(EXIT_FAILURE); } break; case 'v': if (!cwdaemon_params_volume(&default_morse_volume, optarg)) { exit(EXIT_FAILURE); } break; case 'V': cwdaemon_params_version(); exit(EXIT_SUCCESS); case 'w': if (!cwdaemon_params_weighting(&default_weighting, optarg)) { exit(EXIT_FAILURE); } break; case 'T': if (!cwdaemon_params_tone(&default_morse_tone, optarg)) { exit(EXIT_FAILURE); } break; case 'i': cwdaemon_params_inc_verbosity(&default_verbosity); break; case 'y': if (!cwdaemon_params_set_verbosity(&default_verbosity, optarg)) { exit(EXIT_FAILURE); } break; case 'I': if (!cwdaemon_params_libcwflags(optarg)) { exit(EXIT_FAILURE); } break; case 'f': if (!cwdaemon_params_debugfile(optarg)) { exit(EXIT_FAILURE); } break; case 'x': if (!cwdaemon_params_system(&default_audio_system, optarg)) { exit(EXIT_FAILURE); } break; } return; } bool cwdaemon_params_cwdevice(const char *optarg) { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested cwdevice \"%s\"", optarg); if (!cwdaemon_cwdevice_set(&global_cwdevice, optarg) == -1) { return false; } else { return true; } } void cwdaemon_params_nofork(void) { if (forking) { printf("%s: Not forking...\n", PACKAGE); forking = 0; } return; } bool cwdaemon_params_port(const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv) || lv < 1024 || lv > 65536) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested port number: \"%s\"", optarg); return false; } else { port = lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested port number: \"%ld\"", port); return true; } } bool cwdaemon_params_priority(int *priority, const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv) || lv < -20 || lv > 20) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested process priority: \"%s\" (should be between -20 and 20 inclusive)", optarg); return false; } else { *priority = (int) lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested process priority: \"%ld\"", *priority); return true; } } bool cwdaemon_params_wpm(int *wpm, const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv) || lv < CW_SPEED_MIN || lv > CW_SPEED_MAX) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__ , "invalid requested morse speed [wpm]: \"%s\" (should be between %d and %d inclusive)", optarg, CW_SPEED_MIN, CW_SPEED_MAX); return false; } else { *wpm = (int) lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested morse speed [wpm]: \"%d\"", *wpm); return true; } } bool cwdaemon_params_tune(uint32_t *seconds, const char *optarg) { long lv = 0; /* TODO: replace cwdaemon_get_long() with cwdaemon_get_uint32() */ if (!cwdaemon_get_long(optarg, &lv) || lv < 0 || lv > CWDAEMON_TUNE_SECONDS_MAX) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__ , "invalid requested tuning time [s]: \"%s\" (should be between %d and %d inclusive)", optarg, 0, CWDAEMON_TUNE_SECONDS_MAX); return false; } else { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested tuning time [s]: \"%ld\"", lv); *seconds = (uint32_t) lv; return true; } } /** \brief Handle parameter specifying PTT Turn On Delay This function, and handling its return values by callers, isn't as straightforward as it could be. This is because: \li of some backwards-compatibility reasons, \li because expected behaviour when handling command line argument, and when handling network request, are a bit different, \li because negative value of \p optarg is handled differently than too large value of \p optarg. The function clearly rejects negative value passed in \p optarg. Return value is then 0 (a "false" value in boolean expressions). It is more tolerant when it comes to non-negative values, returning 1 or 2 (a "true" value in boolean expressions). When the non-negative value is out of range (larger than limit accepted by cwdaemon), the value is clipped to the limit, and put into \p delay. Return value is then 2. Caller of the function may then decide to accept or reject the value. When the non-negative value is in range, the value is put into \p delay, and return value is 1. Caller of the function must accept the value. Value passed in \p optarg is copied to \p delay only when function returns 1 or 2. \return 1 if value of \optarg is acceptable when it was provided as request and as command line argument (i.e. non-negative value in range); \return 2 if value of \optarg is acceptable when it was provided as request, but not acceptable when it was provided as command line argument (i.e. non-negative value out of range); \return 0 if value of \optarg is not acceptable, regardless how it was provided (i.e. a negative value or invalid value); */ int cwdaemon_params_pttdelay(int *delay, const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv)) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested PTT delay [ms]: \"%s\" (should be integer value between %d and %d inclusive)", optarg, CWDAEMON_PTT_DELAY_MIN, CWDAEMON_PTT_DELAY_MAX); /* 0 means "Value not acceptable in any context." */ return 0; } if (lv > CWDAEMON_PTT_DELAY_MAX) { /* In theory we should reject invalid value, but for some reason in some contexts we aren't very strict about it. So be it. Just don't allow the value to be larger than *_MAX limit. */ *delay = CWDAEMON_PTT_DELAY_MAX; /* 2 means "Value in general invalid (non-negative, but out of range), but in some contexts we may be tolerant and accept it after it has been decreased to an in-range value (*_MAX). */ return 2; } else if (lv < CWDAEMON_PTT_DELAY_MIN) { /* In first branch of the if() we have accepted too large value from misinformed client, but we can't accept values that are clearly invalid (negative). */ /* 0 means "Value is not acceptable in any context". */ return 0; } else { /* Non-negative, in range. */ *delay = (int) lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested PTT delay [ms]: \"%ld\"", *delay); /* 1 means "Value valid in all contexts." */ return 1; } } bool cwdaemon_params_volume(int *volume, const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv) || lv < CW_VOLUME_MIN || lv > CW_VOLUME_MAX) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested volume [%%]: \"%s\" (should be between %d and %d inclusive)", optarg, CW_VOLUME_MIN, CW_VOLUME_MAX); return false; } else { *volume = (int) lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested volume [%%]: \"%d\"", *volume); return true; } } void cwdaemon_params_version(void) { printf("%s version %s\n", PACKAGE, VERSION); return; } bool cwdaemon_params_weighting(int *weighting, const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv) || lv < CWDAEMON_MORSE_WEIGHTING_MIN || lv > CWDAEMON_MORSE_WEIGHTING_MAX) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested weighting: \"%s\" (should be between %d and %d inclusive)", optarg, CWDAEMON_MORSE_WEIGHTING_MIN, CWDAEMON_MORSE_WEIGHTING_MAX); return false; } else { *weighting = (int) lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested weighting: \"%ld\"", *weighting); return true; } } bool cwdaemon_params_tone(int *tone, const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv) || lv < CW_FREQUENCY_MIN || lv > CW_FREQUENCY_MAX) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested tone [Hz]: \"%s\" (should be between %d and %d inclusive)", optarg, CW_FREQUENCY_MIN, CW_FREQUENCY_MAX); return false; } else { *tone = (int) lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested tone [Hz]: \"%ld\"", *tone); return true; } } void cwdaemon_params_inc_verbosity(int *verbosity) { if (*verbosity < CWDAEMON_VERBOSITY_D) { (*verbosity)++; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested verbosity level threshold: \"%s\"", cwdaemon_verbosity_labels[*verbosity]); } return; } bool cwdaemon_params_set_verbosity(int *verbosity, const char *optarg) { if (!strcmp(optarg, "n") || !strcmp(optarg, "N")) { *verbosity = CWDAEMON_VERBOSITY_N; } else if (!strcmp(optarg, "e") || !strcmp(optarg, "E")) { *verbosity = CWDAEMON_VERBOSITY_E; } else if (!strcmp(optarg, "w") || !strcmp(optarg, "W")) { *verbosity = CWDAEMON_VERBOSITY_W; } else if (!strcmp(optarg, "i") || !strcmp(optarg, "I")) { *verbosity = CWDAEMON_VERBOSITY_I; } else if (!strcmp(optarg, "d") || !strcmp(optarg, "D")) { *verbosity = CWDAEMON_VERBOSITY_D; } else { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested verbosity level: \"%s\"", optarg); return false; } cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested verbosity level threshold: \"%s\"", cwdaemon_verbosity_labels[*verbosity]); return true; } bool cwdaemon_params_libcwflags(const char *optarg) { long lv = 0; if (!cwdaemon_get_long(optarg, &lv)) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested debug flags: \"%s\" (should be numeric value)", optarg); libcw_debug_flags = 0; return false; } else { libcw_debug_flags = lv; cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested libcw debug flags: \"%ld\"", libcw_debug_flags); return true; } } bool cwdaemon_params_debugfile(const char *optarg) { if (!strcmp(optarg, "syslog")) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "debug output file \"%s\" not implemented yet, try it in later versions of %s", optarg, PACKAGE); return false; } cwdaemon_debug_f_path = strdup(optarg); if (!cwdaemon_debug_f_path) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "failed to copy path to debug file \"%s\"", optarg); return false; } else { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested debug file path: \"%s\"", cwdaemon_debug_f_path); return true; } } bool cwdaemon_params_system(int *system, const char *optarg) { if (!strncmp(optarg, "n", 1)) { *system = CW_AUDIO_NULL; } else if (!strncmp(optarg, "c", 1)) { *system = CW_AUDIO_CONSOLE; } else if (!strncmp(optarg, "s", 1)) { *system = CW_AUDIO_SOUNDCARD; } else if (!strncmp(optarg, "a", 1)) { *system = CW_AUDIO_ALSA; } else if (!strncmp(optarg, "p", 1)) { *system = CW_AUDIO_PA; } else if (!strncmp(optarg, "o", 1)) { *system = CW_AUDIO_OSS; } else { /* TODO: print only those audio systems that are supported on given machine. */ cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested sound system: \"%s\" (use c(onsole), o(ss), a(lsa), p(ulseaudio), n(ull - no audio), or s(oundcard - autoselect from OSS/ALSA/PulseAudio))", optarg); return false; } cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested sound system: \"%s\" (\"%s\")", optarg, cw_get_audio_system_label(*system)); return true; } bool cwdaemon_params_ptt_on_off(const char *optarg) { long lv = 0; /* PTT keying on or off */ if (!cwdaemon_get_long(optarg, &lv)) { cwdaemon_debug(CWDAEMON_VERBOSITY_E, __func__, __LINE__, "invalid requested PTT state: \"%s\" (should be numeric value \"0\" or \"1\")", optarg); return false; } else { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "requested PTT state: \"%s\"", optarg); } if (lv) { //global_cwdevice->ptt(global_cwdevice, ON); if (current_ptt_delay) { cwdaemon_set_ptt_on(global_cwdevice, "PTT (manual, delay) on"); } else { cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "PTT (manual, immediate) on"); } ptt_flag |= PTT_ACTIVE_MANUAL; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag +PTT_ACTIVE_MANUAL (%02d, %d)", ptt_flag, __LINE__); } else if (ptt_flag & PTT_ACTIVE_MANUAL) { /* only if manually activated */ ptt_flag &= ~PTT_ACTIVE_MANUAL; cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag -PTT_ACTIVE_MANUAL (%02d, %d)", ptt_flag, __LINE__); if (!(ptt_flag & !PTT_ACTIVE_AUTO)) { /* no PTT modifiers */ if (request_queue[0] == '\0'/* no new text in the meantime */ && cw_get_tone_queue_length() <= 1) { cwdaemon_set_ptt_off(global_cwdevice, "PTT (manual, immediate) off"); } else { /* still sending, cannot yet switch PTT off */ ptt_flag |= PTT_ACTIVE_AUTO; /* ensure auto-PTT active */ cwdaemon_debug(CWDAEMON_VERBOSITY_D, __func__, __LINE__, "PTT flag +PTT_ACTIVE_AUTO (%02d, %d)", ptt_flag, __LINE__); cwdaemon_debug(CWDAEMON_VERBOSITY_I, __func__, __LINE__, "reverting from PTT (manual) to PTT (auto) now"); } } } return true; } /** \brief Get and parse command line options Scan program's arguments, check for command line options, parse them. \param argc - main()'s argc argument \param argv - main()'s argv argument */ void cwdaemon_args_parse(int argc, char *argv[]) { #if defined(HAVE_GETOPT_H) cwdaemon_args_process_long(argc, argv); #else int p; while ((p = getopt(argc, argv, cwdaemon_args_short)) != -1) { long lv; cwdaemon_args_process_short(p, optarg); } #endif return; } /** \brief Configure file descriptor for debug output */ void cwdaemon_debug_open(void) { /* First handle a clash of command line arguments. */ if (forking) { if (cwdaemon_debug_f_path && (!strcmp(cwdaemon_debug_f_path, "stdout") || !strcmp(cwdaemon_debug_f_path, "stderr"))) { /* If the path is not specified (path is NULL), it may imply that the debug output should be stdout. But since we explicitly asked for forking, the implied debug output to stdout will be ignored. This is a valid situation: explicit request for forking overrides implicit expectation of debug file being stdout. On the other hand, if we explicitly asked for debug output to be stdout or stderr, and at the same time explicitly asked for forking, that is completely different matter. This is an error (clash of command line arguments). */ fprintf(stdout, "%s:EE: specified debug output to \"%s\" when forking\n", PACKAGE, cwdaemon_debug_f_path); exit(EXIT_FAILURE); } } /* Handle valid situations (after eliminating possible invalid situations above). */ if (!cwdaemon_debug_f_path) { if (!forking) { /* stdout is (for historical reasons) a default file for printing debug strings when not forking, so if a debug file hasn't been defined in command line, the cwdaemon_debug_f_path will be NULL. Treat this situation accordingly.*/ fprintf(stderr, "debug output: stdout\n"); /* This has been already done in main(), but do it again to be super-explicit. */ cwdaemon_debug_f = stdout; } else { /* Remember that in main() the file is set to stdout. Obviously we aren't going to use the stdout when daemon has forked. */ cwdaemon_debug_f = NULL; } } else if (!strcmp(cwdaemon_debug_f_path, "stdout")) { /* We shouldn't get here when forking (invalid situation handled by first "if" in the function). */ assert(!forking); fprintf(stderr, "debug output: stdout\n"); cwdaemon_debug_f = stdout; } else if (!strcmp(cwdaemon_debug_f_path, "stderr")) { /* We shouldn't get here when forking (invalid situation handled by first "if" in the function). */ assert(!forking); fprintf(stderr, "debug output: stderr\n"); cwdaemon_debug_f = stderr; } else { /* cwdaemon_debug_f_path is a path to disc file. */ /* We can get here when both forking and not forking. */ fprintf(stderr, "debug output: %s\n", cwdaemon_debug_f_path); cwdaemon_debug_f = fopen(cwdaemon_debug_f_path, "w+"); if (!cwdaemon_debug_f) { fprintf(stderr, "%s: failed to open output debug file \"%s\"\n", PACKAGE, cwdaemon_debug_f_path); exit(EXIT_FAILURE); } } return; } void cwdaemon_args_help(void) { printf("Usage: %s [option]...\n", PACKAGE); printf("Long options may not be supported on your system.\n\n"); printf("-h, --help\n"); printf(" Print this help and exit.\n"); printf("-V, --version\n"); printf(" Print version information and exit.\n"); printf("-d, --cwdevice \n"); printf(" Use a different device.\n"); #if defined (HAVE_LINUX_PPDEV_H) printf(" (e.g. ttyS0,1,2, parport0,1, etc. default: parport0)\n"); #elif defined (HAVE_DEV_PPBUS_PPI_H) printf(" (e.g. ttyd0,1,2, ppi0,1, etc. default: ppi0)\n"); #else #ifdef BSD printf(" (e.g. ttyd0,1,2, etc. default: ttyd0)\n"); #else printf(" (e.g. ttyS0,1,2, etc. default: ttyS0)\n"); #endif #endif printf(" Use \"null\" for dummy device (no rig keying, no ssb keying, etc.).\n"); printf("-n, --nofork\n"); printf(" Do not fork. Print debug information to stdout.\n"); printf("-p, --port \n"); printf(" Use a different UDP port number (> 1023, default: %d).\n", CWDAEMON_NETWORK_PORT_DEFAULT); #if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS) printf("-P, --priority \n"); printf(" Set program's priority (-20 - 20, default: 0).\n"); #endif printf("-s, --wpm \n"); printf(" Set Morse speed [wpm] (%d - %d, default: %d).\n", CW_SPEED_MIN, CW_SPEED_MAX, CWDAEMON_MORSE_SPEED_DEFAULT); printf("-t, --pttdelay /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac ac_MKDIR_P=$MKDIR_P case $MKDIR_P in [\\/$]* | ?:[\\/]* ) ;; */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t s&@MKDIR_P@&$ac_MKDIR_P&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi # Compute "$ac_file"'s index in $config_headers. _am_arg="$ac_file" _am_stamp_count=1 for _am_header in $config_headers :; do case $_am_header in $_am_arg | $_am_arg:* ) break ;; * ) _am_stamp_count=`expr $_am_stamp_count + 1` ;; esac done echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || $as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$_am_arg" : 'X\(//\)[^/]' \| \ X"$_am_arg" : 'X\(//\)$' \| \ X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$_am_arg" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'`/stamp-h$_am_stamp_count ;; :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 $as_echo "$as_me: executing $ac_file commands" >&6;} ;; esac case $ac_file$ac_mode in "depfiles":C) test x"$AMDEP_TRUE" != x"" || { # Older Autoconf quotes --file arguments for eval, but not when files # are listed without --file. Let's play safe and only enable the eval # if we detect the quoting. case $CONFIG_FILES in *\'*) eval set x "$CONFIG_FILES" ;; *) set x $CONFIG_FILES ;; esac shift for mf do # Strip MF so we end up with the name of the file. mf=`echo "$mf" | sed -e 's/:.*$//'` # Check whether this is an Automake generated Makefile or not. # We used to match only the files named 'Makefile.in', but # some people rename them; so instead we look at the file content. # Grep'ing the first line is not enough: some people post-process # each Makefile.in and add a new line on top of each file to say so. # Grep'ing the whole file is not good either: AIX grep has a line # limit of 2048, but all sed's we know have understand at least 4000. if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then dirpart=`$as_dirname -- "$mf" || $as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$mf" : 'X\(//\)[^/]' \| \ X"$mf" : 'X\(//\)$' \| \ X"$mf" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$mf" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` else continue fi # Extract the definition of DEPDIR, am__include, and am__quote # from the Makefile without running 'make'. DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` test -z "$DEPDIR" && continue am__include=`sed -n 's/^am__include = //p' < "$mf"` test -z "$am__include" && continue am__quote=`sed -n 's/^am__quote = //p' < "$mf"` # Find all dependency output files, they are included files with # $(DEPDIR) in their names. We invoke sed twice because it is the # simplest approach to changing $(DEPDIR) to its actual value in the # expansion. for file in `sed -n " s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do # Make sure the directory exists. test -f "$dirpart/$file" && continue fdir=`$as_dirname -- "$file" || $as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$file" : 'X\(//\)[^/]' \| \ X"$file" : 'X\(//\)$' \| \ X"$file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir=$dirpart/$fdir; as_fn_mkdir_p # echo "creating $dirpart/$file" echo '# dummy' > "$dirpart/$file" done done } ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi