diff options
author | Seemant Kulleen <seemant@gentoo.org> | 2002-07-01 10:57:15 +0000 |
---|---|---|
committer | Seemant Kulleen <seemant@gentoo.org> | 2002-07-01 10:57:15 +0000 |
commit | f8e41bc55649246ec4ceaab4e454143fcb412328 (patch) | |
tree | cd8913b653233f0b3c599a2d4af1f3017b542e39 /net-analyzer/tleds | |
parent | filter -malign-double out of glibc (diff) | |
download | gentoo-2-f8e41bc55649246ec4ceaab4e454143fcb412328.tar.gz gentoo-2-f8e41bc55649246ec4ceaab4e454143fcb412328.tar.bz2 gentoo-2-f8e41bc55649246ec4ceaab4e454143fcb412328.zip |
new package, thanks to Rachel Holmes
Diffstat (limited to 'net-analyzer/tleds')
-rw-r--r-- | net-analyzer/tleds/ChangeLog | 11 | ||||
-rw-r--r-- | net-analyzer/tleds/files/digest-tleds-1.04 | 1 | ||||
-rw-r--r-- | net-analyzer/tleds/files/tleds-1.04-FuRy.patch | 1865 | ||||
-rw-r--r-- | net-analyzer/tleds/tleds-1.04.ebuild | 41 |
4 files changed, 1918 insertions, 0 deletions
diff --git a/net-analyzer/tleds/ChangeLog b/net-analyzer/tleds/ChangeLog new file mode 100644 index 000000000000..0dc8ffc7acb0 --- /dev/null +++ b/net-analyzer/tleds/ChangeLog @@ -0,0 +1,11 @@ +# ChangeLog for net-analyzer/tleds +# Copyright 2002 Gentoo Technologies, Inc.; Distributed under the GPL v2 +# $Header: /var/cvsroot/gentoo-x86/net-analyzer/tleds/ChangeLog,v 1.1 2002/07/01 10:57:15 seemant Exp $ + +*tleds-1.04 (1 Jul 2002) + + 01 Jul 2002; Seemant Kulleen <seemant@gentoo.org> tleds-1.04.ebuild + files/tleds-1.04-FuRy.patch files/digest-tleds-1.04 ChangeLog : + + New package, with a patch for recent kernels generously donated by Rachel + Holmes. diff --git a/net-analyzer/tleds/files/digest-tleds-1.04 b/net-analyzer/tleds/files/digest-tleds-1.04 new file mode 100644 index 000000000000..6c259b8b4e1e --- /dev/null +++ b/net-analyzer/tleds/files/digest-tleds-1.04 @@ -0,0 +1 @@ +MD5 c731dba022666a9ec26e77002bb12967 tleds-1.04.tgz 26400 diff --git a/net-analyzer/tleds/files/tleds-1.04-FuRy.patch b/net-analyzer/tleds/files/tleds-1.04-FuRy.patch new file mode 100644 index 000000000000..2609275102cf --- /dev/null +++ b/net-analyzer/tleds/files/tleds-1.04-FuRy.patch @@ -0,0 +1,1865 @@ +diff -uNr a/Changes b/Changes +--- a/Changes 2002-07-01 11:35:59.000000000 +0100 ++++ b/Changes 2002-07-01 11:22:24.000000000 +0100 +@@ -1,4 +1,17 @@ + VERSION DATE WHAT WAS FIXED OR WHAT WAS/IS NEW ++ ++ 22 Jun 2002 Fixed for 2.4 and 2.5 kernels ++ ++1.05b11 7 Mar 2002 Support for multiple interfaces ++ ++1.05b7 2 Apr 1998 Keeps LEDs deattached also after VT is reset if run ++(beta) with -c option. ++ eth* default delay changed to 50 ms. ++ Support for 2.1.x kernel added, beta, check Makefile. ++ Before make install installed to /usr/bin, now it ++ installs to /usr/local/bin by default, but is easily ++ configurable in Makefile. ++ + 1.04 29 Sep 1997 Now keeps LEDs reattached during the deep sleep. + + 1.03 27 Sep 1997 -t option removed and -c added. -c Fixes CapsLock +diff -uNr a/Makefile b/Makefile +--- a/Makefile 2002-07-01 11:35:59.000000000 +0100 ++++ b/Makefile 1998-04-02 12:04:17.000000000 +0100 +@@ -1,40 +1,61 @@ + # Makefile for tleds and xtleds. +-# GPL (c) 1997 Jouni.Lohikoski@iki.fi ++# GNU GPL (c) 1997, 1998 Jouni.Lohikoski@iki.fi ++ ++all: tleds xtleds say_install ++ ++# Where to install programs and man pages ++BINDIR = /usr/local/bin/ ++MANDIR = /usr/local/man/ ++ ++# For 2.1.x kernels, you have to include -DKERNEL2_1 option for gcc ++ ++GCCOPTS = -D_GNU_SOURCE -O3 -Wall + +-all: tleds xtleds install + # The first one is if you want to include X code +-xtleds: tleds.c ++xtleds: tleds.c Makefile + # Making xtleds +- gcc -O3 -Wall -o xtleds tleds.c -I /usr/X11R6/include/ -L /usr/X11R6/lib/ -lX11 ++ gcc $(GCCOPTS) -o xtleds tleds.c -I /usr/X11R6/include/ -L /usr/X11R6/lib/ -lX11 + + # This second one works only when started in VT. Check the REMOVE_X_CODE + # in the source code. +-tleds: tleds.c ++tleds: tleds.c Makefile + # Making tleds +- gcc -DNO_X_SUPPORT -O3 -Wall -o tleds tleds.c ++ gcc -DNO_X_SUPPORT $(GCCOPTS) -o tleds tleds.c + + help: + # make help - this. + # make tleds - makes tleds. + # make xtleds - makes xtleds. ++ # make strip - strips them. + # make install - installs tleds, xtleds and tleds man page + # if EUID root. +- # make all - make tleds, xtleds, and install if root. ++ # make all - make tleds and xtleds ++ ++strip: ++ strip --strip-all tleds ++ strip --strip-all xtleds + ++say_install: ++ # Now su root and run: make install ++ # If you want to strip them first, say: make strip install ++ + install: tleds + # EUID root needed ! + # installing .... +- cp tleds /usr/bin/tleds +- chgrp users /usr/bin/tleds +- chmod ug+x /usr/bin/tleds +- cp tleds.1 /usr/man/man1/tleds.1 +- chmod og-wr /usr/bin/tleds /usr/man/man1/tleds.1 +- chmod og+r /usr/man/man1/tleds.1 +- ln -fs /usr/man/man1/tleds.1 /usr/man/man1/xtleds.1 +- cp xtleds /usr/bin/xtleds +- chgrp users /usr/bin/xtleds +- chmod ug+x /usr/bin/xtleds +- chmod og-wr /usr/bin/xtleds ++ # If you get an error here, you are not root or may have tleds running ++ # on the system. tleds -k first and then make install again as root. ++ rm -f /usr/bin/tleds /usr/bin/xtleds /usr/man/man1/tleds.1* /usr/man/man1/xtleds.1 ++ cp tleds $(BINDIR)/tleds ++ chgrp users $(BINDIR)/tleds ++ chmod ug+x $(BINDIR)/tleds ++ cp tleds.1.gz $(MANDIR)/man1/tleds.1.gz ++ chmod og-wr $(BINDIR)/tleds $(MANDIR)/man1/tleds.1.gz ++ chmod og+r $(MANDIR)/man1/tleds.1.gz ++ ln -fs $(MANDIR)/man1/tleds.1.gz $(MANDIR)/man1/xtleds.1 ++ cp xtleds $(BINDIR)/xtleds ++ chgrp users $(BINDIR)/xtleds ++ chmod ug+x $(BINDIR)/xtleds ++ chmod og-wr $(BINDIR)/xtleds + sync + # ....Done. + +diff -uNr a/README b/README +--- a/README 2002-07-01 11:35:59.000000000 +0100 ++++ b/README 1998-04-02 12:13:55.000000000 +0100 +@@ -1,4 +1,4 @@ +-Hello, ++Hello You, yes _you_, + + Help for making: + +@@ -7,9 +7,12 @@ + To recompile and install tleds, just cd to the directory where there is + tleds.c and Makefile, su root, and give command: + +- make ++ make all install + + If you don't want to recompile just: (install needs EUID root) ++NOTE: the binaries in the tarball are compiled to use glibc. If you need ++to get them working with libc-5, you need to recompile on your machine, or ++email me and I'll will put libc5 versions available or mail back to ya. + + make install + +@@ -19,11 +22,14 @@ + + If you want tleds started always in the boot up, do for example: + +- echo "/usr/bin/tleds -qd 100 ppp0" >>/etc/rc.d/rc.local ++ echo "/usr/local/bin/tleds -qcd 100 ppp0" >>/etc/rc.d/rc.local + +-Consider the -c option when running tleds as EUID root. ++Consider the -c option when running tleds as (EUID) root. + +-Have fun and don't let the Sky Net enter into your puter! ++Some ppl have asked what is EUID...it's Effective User ID. So if ++you make tleds suid root and run it as normal user, your effective ++user ID comes to 0 (= root). I don't recommend making tleds suid root ++though. Just su root and run it or put it in the rc.local file. + + -- + Jouni.Lohikoski@iki.fi +diff -uNr a/tleds.1 b/tleds.1 +--- a/tleds.1 2002-07-01 11:35:59.000000000 +0100 ++++ b/tleds.1 2002-07-01 11:19:00.000000000 +0100 +@@ -1,4 +1,4 @@ +-.TH TLEDS 1 "1997 Sep 29" ++.TH TLEDS 1 "2002 Mar 07" + .SH NAME + tleds, xtleds \- Blinks keyboard LEDs indicating incoming and outgoing network packets. + .SH SYNOPSIS +@@ -8,7 +8,7 @@ + .RB [ \-d + .B N + ] +-.B interface_name ++.B interface_name ... + .br + .B xtleds + .RB [ \-bchkqv +@@ -16,7 +16,7 @@ + .RB [ \-d + .B N + ] +-.B interface_name ++.B interface_name ... + .SH DESCRIPTION + These programs help you monitor network traffic. They blink Scroll-Lock LED + (Light Emitting Diode) +@@ -44,12 +44,15 @@ + of /dev/console and therefore can be started for example in boot-up script, eg. + in + .IR /etc/rc.d/rc.local +-(see the last EXAMPLE) If you want to have correct CapsLockLED in VTs, use the ++(see the last EXAMPLE) ++.PP ++If you want to have correct CapsLockLED in VTs, or if ++you mainly use Virtual Terminals, use the + .B -c +-option. ++option. This will keep the LEDs blinking also after the VT is reset. + .PP + If you want to use xtleds with XFree v3.2 or v3.3, I suggest you run tleds +-instead as EUID root so you won't have to disable XKEYBOARD extension. ++as EUID root so you won't have to disable XKEYBOARD extension. + (XkbDisable) + .SH PARAMETER + .I interface_name +@@ -59,6 +62,19 @@ + .br + .B cat + .B /proc/net/dev ++.br ++It is possible to specify multiple interfaces and to append ++.B ,1 ++(for NumLockLED) or ++.B ,2 ++(for ScrollLockLED) directly after the respective interface. If this ++is specified, the whole (RX/TX) traffic will be reported on this LED. ++If you specify another appended ++.B ,1 ++or ++.B ,2 ++the meaning is slightly different: The first number specifies the receive ++LED, the latter the transmit LED. See examples. + .SH OPTIONS + .TP + -b +@@ -69,14 +85,18 @@ + Without this also the CapsLock LED is detached from actual keyboard + flags (see + .IR setleds(1) +-why). Processing CapsLock will take little more CPU time, +-so if you mainly use X, you won't need this. ++why). Processing CapsLock will take little more CPU time. ++If you mainly use X, you won't need this. ++Also when VT is reset, for example when there has been logout and mingetty ++has been restarted, the LEDs get reattached automaticly. With -c option LEDs ++are detached again about after 20 seconds. So if you don't use X, you ++probably want to run tleds as root and use -c option. + .TP + -d {N} + Set update delay in milliseconds. N must be between 1 and 10000 ms. + Without -d the default for + .I eth* +-(ethernet) device is 100 ms and 200 ms for ++(ethernet) device is 50 ms and 200 ms for + others like: + .I ppp* + (Point to Point Protocol), +@@ -105,15 +125,26 @@ + tleds -d 100 ppp0 + Starts monitoring the interface ppp0 updating every 100 ms. + .TP +-tleds -qd 50 eth0 +-Blinks LEDs looking what comes and goes from eth0 (ethernet) every 50 ms. Starts +-quietly. ++tleds -qd 100 eth0 ++Blinks LEDs looking what comes and goes from eth0 (ethernet) every 100 ms. ++Starts quietly. + .TP + tleds -c eth1 +-On eth1 and update delay is 100 ms (default). Will be able to indicate ++On eth1 and update delay is 50 ms (default). Will be able to indicate + correct CapsLock state in VTs because the + .B -c +-flag, IF started as EUID root. ++flag, and keeps LEDs detached even over VT resets, IF started as EUID root. ++.TP ++tleds ippp0 eth0 eth1 ++Observes the three specified interfaces ++.TP ++tleds eth0,1 eth1,2 ++All the traffic of eth0 (RX/TX) will be monitored with NumLockLED and all the ++traffic of eth1 will be monitored with ScrollLockLED. ++.TP ++tleds ippp0,2,1 ++The incoming traffic of the ISDN interface ippp0 will be monitored with the ++ScrollLockLED (2) and the outgoing traffic will be monitored with the NumLockLED (1). + .TP + xtleds -vbd 200 lo + Loopback device (lo) and shows version information, delay 200 ms. +@@ -128,11 +159,11 @@ + tleds -k + Kills the beast, tleds/xtleds, runnning if there is such. + .TP +-echo "/usr/bin/tleds -qcd 50 eth0" >>/etc/rc.d/rc.local ++echo "/usr/bin/tleds -qcd 100 eth0" >>/etc/rc.d/rc.local + (Done as EUID root) Will start tleds in the boot-up, running always in + the backgroud. Starts quietly. + Shows correct CapsLock state with CapsLock LED in VTs. +-Will monitor eth0 with 50 ms update delays. ++Will monitor eth0 with 100 ms update delays. + .SH FILES + /proc/net/dev + .br +@@ -143,6 +174,7 @@ + /etc/X11/XF86Config + .SH AUTHOR + tleds and xtleds was made by Jouni Lohikoski <Jouni.Lohikoski@iki.fi>. ++Support for multiple devices by Roland Stigge <roland.stigge@epost.de>. + .SH COPYRIGHT + Copyrighted and released under GNU General Public License (GPL). + .SH URL +@@ -154,10 +186,13 @@ + .BR console_ioctl (4) + .SH BUGS + I hope not. Please e-mail me when you find them. +-xtleds on XFree v3.2 and v3.3 doesn't work ++xtleds (when run as non root) on XFree v3.2 and v3.3 doesn't work + unless you put "XkbDisable" in the Keyboard section of XF86Config. + Will get SIGSEGV if tried to monitor network device which + doesn't support /proc filesystem, eg. dummy. ++If you disconnect keyboard and are running tleds, it takes more CPU ++time I've heard. Buy an extra keyboard or email me how to detect this in ++run time. + .PP + One comment: kernel should enable deattach LEDs separately. Now it's all + or none, and these programs has to do some hacks with +diff -uNr a/tleds.LSM b/tleds.LSM +--- a/tleds.LSM 2002-07-01 11:35:59.000000000 +0100 ++++ b/tleds.LSM 1998-03-26 23:06:48.000000000 +0000 +@@ -1,6 +1,6 @@ + Begin3 + Title: tleds xtleds (Network Traffic Monitoring Programs) +-Version: 1.04 ++Version: 1.04 + Entered-date: 29SEP97 + Description: tleds and xtleds are programs which blinks keyboard LEDs + (Light Emitting Diode) indicating outgoing and incoming +@@ -9,7 +9,7 @@ + Author: Jouni.Lohikoski@iki.fi + Maintained-by: jlohikos@cc.hut.fi + Primary-site: http://www.iki.fi/Jouni.Lohikoski/tleds.html +-Platforms: Linux ++Platforms: x86 Linux with keyboard + Copying-policy: GPL + End + +diff -uNr a/tleds.c b/tleds.c +--- a/tleds.c 2002-07-01 11:35:59.000000000 +0100 ++++ b/tleds.c 2002-07-01 11:24:03.000000000 +0100 +@@ -1,44 +1,46 @@ + /* +- File: tleds.c +- (X11) netTrafficLEDS - Copyright (C) 1997 Jouni.Lohikoski@iki.fi +- This can be run either on VT or in X. Works best when EUID is root.(-c) +- If you like this alot, and kinda use this daily for months, heh, and would +- like to send me a postcard or $10 or offer a job, feel free, I don't mind. +- +- <URL:http://www.iki.fi/Jouni.Lohikoski/tleds.html> for more info and for +- the latest version. +- +- 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; version 2 of the License. +- +- 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., 675 Mass Ave, Cambridge, MA 02139, USA. ++File: tleds.c ++(X11) netTrafficLEDS - Copyright (C) 1997,1998 Jouni.Lohikoski@iki.fi ++This can be run either on VT or in X. Works best when EUID is root.(opt -c) ++If you like this alot, and kinda use this daily for months, and would ++like to send me a postcard or $10 or offer a project, feel free to do so. ++ ++<URL: http://www.iki.fi/Jouni.Lohikoski/tleds.html> for more info and for ++the latest version. ++ ++* Multiple interfaces support by Roland Stigge <stigge@epost.de> ++ ++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; version 2 of the License. ++ ++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., 675 Mass Ave, Cambridge, MA 02139, USA. + + --- + Makefile: + all: xtleds tleds + xtleds: tleds.c +- gcc -O3 -Wall -o xtleds tleds.c -I /usr/X11R6/include/ \ +- -L /usr/X11R6/lib/ -lX11 ++gcc -O3 -D_GNU_SOURCE -Wall -o xtleds tleds.c -I /usr/X11R6/include/ \ ++ -L /usr/X11R6/lib/ -lX11 + tleds: tleds.c +- gcc -DNO_X_SUPPORT -O3 -Wall -o tleds tleds.c ++gcc -DNO_X_SUPPORT -D_GNU_SOURCE -O3 -Wall -o tleds tleds.c + --- + (x)tleds needs "XkbDisable" on v3.2 and v3.3 XFree, which is no good. + If you run tleds as root, "XkbDisable" is not needed. +-Put following two lines in your XF86Config if you use this from X. ++Put following two lines in your XF86Config if you use xtleds from X. + "Xleds 2 3" is needed always when using X with tleds or with xtleds. + XF86Config: +- XkbDisable # v3.1 Xfree doesn't need this line or if EUID root +- Xleds 2 3 # This line is a must. ++XkbDisable # Needed when EUID non root and Xfree v3.2 or v3.3 ++Xleds 2 3 # This line is a must. + */ +-#define VERSION "1.04" ++#define VERSION "1.05beta11" + #define MYNAME "tleds" + + /* If you don't want X stuff. */ +@@ -70,6 +72,7 @@ + #include <linux/kd.h> + #include <linux/vt.h> + #include <assert.h> ++#include <sys/utsname.h> + + #ifndef TRUE + #define TRUE 1 +@@ -81,40 +84,60 @@ + #define MAXVT 12 + #define NETDEVFILENAME "/proc/net/dev" + #define TERMINATESTR "Program (and child) terminated.\n" +-#define FIELDCOUNT 12 + #define DEEPSLEEP 10 ++#define REMINDVTDELAY 15 + #define DEFPPPDELAY 200 +-#define DEFETHDELAY 100 ++#define DEFETHDELAY 50 + #define CAPSLOCKLED 1 + #define NUMLOCKLED 2 + #define SCROLLLOCKLED 3 + typedef enum {CLEAR = 0, SET = 1, TOGGLE = 2} LedMode; + typedef enum {DELAYED = 0, FINISH = 1, NOW = 2} ActionMode; ++#if KERNEL2_0 ++#define FIELDCOUNT 7 /* 12 really */ ++#else ++#define FIELDCOUNT 11 /* 17 really, in v2.1.97 +/- N */ ++#endif ++#define INTPARAMS 3 ++ ++/* Structs */ ++struct interfaceList { ++ struct interfaceList* next; /* it's a chain */ ++ char* interfaceName; /* e.g. "eth0" */ ++ int rxled, txled; /* 1 = NUM | 2 = SCROLL */ ++ int row; /* position in device file */ ++}; + + /* Function prototypes */ +-void handle_my_argvs (char** interfaceName, int* sleeptime, +- int argc, char** argv); + void check_sanity (); +-void usage (char* name); +-int get_sleeptime (int isDefinedByUser, char* interfaceName); ++void check_kernel_version (); ++ulong correct_caps (ulong ledVal); + void create_pid_file (pid_t pid, const char* name); +-int kill_old_process (); +-pid_t get_old_pid (); +-void parent_wants_me_dead (int); +-void my_signal_handler (int); +-void my_exit (); +-void detach_vt_leds (int wantDetach); ++void detach_all_vt_leds (int wantDetach); ++ulong detach_vt_leds (int tty, int wantDetach); ++void sort_interfaces(struct interfaceList** interfaces); ++FILE* open_device(); ++char* find_device_line (char* buffer, FILE* devFile, char* netDeviceName); ++int find_device_row (char* netDeviceName); + inline int find_max_VT (); ++pid_t get_old_pid (); ++int get_sleeptime (int isDefinedByUser, struct interfaceList* interfaces); ++void handle_my_argvs (struct interfaceList** interfaces, int* sleeptime, ++ int argc, char** argv); ++inline int is_on_X (int ttyFd); ++int kill_old_process (); + void led (int what, LedMode mode, ActionMode doAction); +-ulong correct_caps (ulong ledVal); +-char* find_device_line (char* buffer, char* netDeviceName); ++void my_exit (); ++void my_signal_handler (int); ++inline void my_sleep (struct timeval sleeptimeval); ++void parent_wants_me_dead (int); ++void report_traffic (long received, long transmitted); + char** split_on_blank (char* line); +-void report_traffic (char** list); +-inline int is_on_X (int ttyFd); ++char** split_on_comma (char* line); + inline void clear_led (int what) { led(what, CLEAR, NOW); } + inline void set_led (int what) { led(what, SET, NOW); } + inline void toggle_led (int what) { led(what, TOGGLE, NOW); } +-inline void my_sleep (struct timeval sleeptimeval); ++void usage (char* name); + + /* Global and static variables */ + static const char devFileName [] = NETDEVFILENAME; +@@ -128,187 +151,298 @@ + static int keyboardDevice = 0; + static char ttyLEDs [MAXVT] = {}; + static ushort previousActive = (ushort)(MAXVT + 1); ++static int remindVTcoef = 0; + static int opt_b = FALSE, opt_d = FALSE, opt_h = FALSE, +- opt_k = FALSE, opt_q = FALSE, opt_v = FALSE, +- opt_c = FALSE; ++ opt_k = FALSE, opt_q = FALSE, opt_v = FALSE, ++ opt_V = FALSE, opt_c = FALSE; + + /* The code */ + int main (int argc, char* argv []) + { +- char* interfaceName; +- char buffer [MAXLEN]; +- ulong ledVal; +- char* tmpPointer; +- char** list; +- pid_t pid; +- int sleeptime; +- int wasInDeepSleep; +- struct timeval sleeptimeval; +- +- interfaceName = NULL; +- sleeptime = 0; +- handle_my_argvs(&interfaceName, &sleeptime, argc, argv); +- check_sanity(); /* Checks and maybe changes the option flags. */ ++struct interfaceList* interfaces; ++struct interfaceList* tempInterfaces; ++char* message; ++long received, transmitted, numlock, scrolllock; ++FILE* devFile; ++char buffer [MAXLEN]; ++ulong ledVal; ++char* tmpPointer; ++char** list; ++pid_t pid; ++int sleeptime; ++int wasInDeepSleep; ++struct timeval sleeptimeval; ++ ++interfaces = NULL; ++sleeptime = 0; ++check_kernel_version(); /* May die here */ ++handle_my_argvs(&interfaces, &sleeptime, argc, argv); ++check_sanity(); /* Checks and maybe changes the option flags. */ + #ifdef DEBUG +- opt_b = TRUE; /* We are debugging so don't go to the background */ ++opt_b = TRUE; /* We are debugging so don't go to the background */ + #endif +- if (opt_v && !opt_q) +- fprintf(stderr, +- "%s version %s, GPL (c) 1997 Jouni.Lohikoski@iki.fi\n", +- MYNAME, VERSION); +- strcpy(pidFileName, _PATH_TMP); +- strcpy(rootPidFileName, _PATH_VARRUN); +- strcat(pidFileName, MYNAME); /* Was argv[0]. Probs coz/if path. */ +- strcat(rootPidFileName, MYNAME); +- strcat(pidFileName, ".pid"); +- strcat(rootPidFileName, ".pid"); +- if (opt_k) { +- return kill_old_process(); +- } +- if (opt_h) { +- usage(argv[0]); +- return 0; +- } +- if (! opt_q) { +- printf("Setting keyboard LEDs based on %s %s %s %s\n", +- "changes of Receive/Transmit\npackets of", interfaceName, +- "in", devFileName); +- printf("Delay between updates is %d milliseconds.\n", +- sleeptime); +- } +- if (! find_device_line(buffer, interfaceName) && !opt_q) { +- printf( +- "There is currently no such interface as %s in %s.\n%s\n", +- interfaceName, devFileName, +- "Maybe later there will be. Kill me (-k) if ya want."); +- } +- +- if(! opt_b) { +- if (-1 == (pid = fork())) { +- perror("tleds: fork"); +- return 1; +- } +- } else { +- pid = getpid(); +- } +- if (pid) { +- create_pid_file(pid, argv[0]); +- if (! opt_q) +- printf("Running in %sground. Pid: %ld\n", +- (opt_b ? "fore" : "back"), +- (long)pid); +- if (! opt_b) +- exit(0); +- } +- if (atexit(my_exit)) { +- perror("tleds: atexit() failed"); ++if (opt_v && !opt_q) { ++ printf( ++ "%s version %s\n" ++ "GNU GPL (c) 1998 Jouni.Lohikoski@iki.fi\n" ++ " 2002 roland.stigge@epost.de\n", ++ MYNAME, VERSION); ++ printf("<URL: http://www.iki.fi/Jouni.Lohikoski/tleds.html>\n"); ++} ++strcpy(pidFileName, _PATH_TMP); ++strcpy(rootPidFileName, _PATH_VARRUN); ++strcat(pidFileName, MYNAME); /* Was argv[0]. Probs coz/if path. */ ++strcat(rootPidFileName, MYNAME); ++strcat(pidFileName, ".pid"); ++strcat(rootPidFileName, ".pid"); ++if (opt_k) { ++ return kill_old_process(); ++} ++if (opt_h) { ++ usage(argv[0]); ++ return 0; ++} ++if (! opt_q) { ++ printf("Setting keyboard LEDs based on " ++ "changes of Receive/Transmit\npackets of"); ++ tempInterfaces = interfaces; ++ while (tempInterfaces) { ++ printf(" %s", tempInterfaces->interfaceName); ++ tempInterfaces = tempInterfaces->next; ++ } ++ printf(" %s %s\n", "in", devFileName); ++ printf("Delay between updates is %d milliseconds.\n", ++ sleeptime); ++} ++ ++sort_interfaces(&interfaces); /* prepare to start right now */ ++ ++tempInterfaces = interfaces; ++message = ""; ++while (tempInterfaces) { ++ if (! tempInterfaces->row && ! opt_q) { ++ printf("There is currently no such interface as %s in %s.\n", ++ tempInterfaces->interfaceName, devFileName); ++ message = "Maybe later there will be. Kill me (-k) if ya want.\n"; ++ } ++ tempInterfaces = tempInterfaces->next; ++} ++printf(message); ++ ++if(! opt_b) { ++ if (-1 == (pid = fork())) { ++ perror("tleds: fork"); + return 1; + } +- if (! opt_b) { +- signal(SIGUSR1, parent_wants_me_dead); ++} else { ++ pid = getpid(); ++} ++if (pid) { ++ create_pid_file(pid, argv[0]); ++ if (! opt_q) ++ printf("Running in %sground. Pid: %ld\n", ++ (opt_b ? "fore" : "back"), ++ (long)pid); ++ if (! opt_b) ++ exit(0); ++} ++if (atexit(my_exit)) { ++ perror("tleds: atexit() failed"); ++ return 1; ++} ++if (! opt_b) { ++ signal(SIGUSR1, parent_wants_me_dead); ++} ++signal(SIGHUP, SIG_IGN); ++signal(SIGTERM, my_signal_handler); ++signal(SIGINT, my_signal_handler); ++signal(SIGQUIT, my_signal_handler); ++signal(SIGTSTP, my_signal_handler); ++signal(SIGUSR2, SIG_IGN); ++signal(SIGPIPE, my_signal_handler); ++if (! geteuid()) { /* We are running as EUID root - CONSOLE */ ++ if (-1 == (keyboardDevice = open(KEYBOARDDEVICE, O_RDONLY))) { ++ perror("tleds"); ++ fprintf(stderr, "%s:%s", KEYBOARDDEVICE, TERMINATESTR); ++ exit(1); + } +- signal(SIGHUP, SIG_IGN); +- signal(SIGTERM, my_signal_handler); +- signal(SIGINT, my_signal_handler); +- signal(SIGQUIT, my_signal_handler); +- signal(SIGTSTP, my_signal_handler); +- signal(SIGUSR2, SIG_IGN); +- signal(SIGPIPE, my_signal_handler); +- if (! geteuid()) { /* We are running as EUID root - CONSOLE */ +- if (-1 == (keyboardDevice = open(KEYBOARDDEVICE, O_RDONLY))) { +- perror("tleds"); +- fprintf(stderr, "%s:%s", KEYBOARDDEVICE, TERMINATESTR); +- exit(1); +- } +- } else { /* EUID not root */ ++} else { /* EUID not root */ + #if (! REMOVE_X_CODE) +- if (! (myDisplay = XOpenDisplay(NULL)) /* X */ +- && ioctl(0, KDGETLED, &ledVal) ) { /* VT */ +- perror( +- "tleds: Can't open X DISPLAY on the current host."); ++ if (! (myDisplay = XOpenDisplay(NULL)) /* X */ ++ && ioctl(0, KDGETLED, &ledVal) ) { /* VT */ ++ perror( ++ "tleds: Can't open X DISPLAY on the current host."); + #else +- if (ioctl(0, KDGETLED, &ledVal) ) { +- perror("tleds: KDGETLED"); +- fprintf(stderr, +- "Error reading current led setting.\n%s\n", +- "Maybe stdin is not a VT?"); ++ if (ioctl(0, KDGETLED, &ledVal) ) { ++ perror("tleds: KDGETLED"); ++ fprintf(stderr, ++ "Error reading current led setting.\n%s\n", ++ "Maybe stdin is not a VT?"); + #endif +- fprintf(stderr, TERMINATESTR); +- exit (1); +- } ++ fprintf(stderr, TERMINATESTR); ++ exit (1); + } +- sleeptimeval.tv_sec = (int)((long)sleeptime * 1000L) / 1000000L; +- sleeptimeval.tv_usec = (int)((long)sleeptime * 1000L) % 1000000L; +- wasInDeepSleep = TRUE; +- +- /* The main loop */ +- while (1) { +- if ((tmpPointer = find_device_line(buffer, interfaceName))) { +- if (wasInDeepSleep) { +- wasInDeepSleep = FALSE; +- detach_vt_leds(TRUE); +- } +- list = split_on_blank(tmpPointer); +- report_traffic(list); +- my_sleep(sleeptimeval); +- } else { +- if (! wasInDeepSleep) { +- wasInDeepSleep = TRUE; +- detach_vt_leds(FALSE); +- previousActive = (ushort)(MAXVT + 1); +- } +- sleep(DEEPSLEEP); +- } +- } +- return 0; /* Yeah right, never gets this far. */ ++} ++sleeptimeval.tv_sec = (int)((long)sleeptime * 1000L) / 1000000L; ++sleeptimeval.tv_usec = (int)((long)sleeptime * 1000L) % 1000000L; ++remindVTcoef = (int)( (long)REMINDVTDELAY * 1000L / (long)sleeptime ); ++wasInDeepSleep = TRUE; ++ ++/* The main loop */ ++while (1) { ++ tempInterfaces = interfaces; ++ numlock = 0; ++ scrolllock = 0; ++ devFile = open_device(); ++ do { ++ if ((tmpPointer = find_device_line(buffer, devFile, tempInterfaces->interfaceName))) { ++ list = split_on_blank(tmpPointer); ++#if KERNEL2_0 ++ received = atol(list[1]); ++ transmitted = atol(list[6]); ++#else ++ received = atol(list[2]); ++ transmitted = atol(list[10]); /* Kernel v2.1.119 */ ++#endif ++ if (tempInterfaces->rxled & 1) numlock += received; ++ if (tempInterfaces->rxled & 2) scrolllock += received; ++ if (tempInterfaces->txled & 1) numlock += transmitted; ++ if (tempInterfaces->txled & 2) scrolllock += transmitted;; ++ } ++ tempInterfaces = tempInterfaces->next; ++ } while (tempInterfaces && tmpPointer); ++ fclose(devFile); ++ if (tmpPointer) { ++ if (wasInDeepSleep) { ++ wasInDeepSleep = FALSE; ++ detach_all_vt_leds(TRUE); ++ } ++ report_traffic(numlock, scrolllock); ++ my_sleep(sleeptimeval); ++ } else { ++ if (! wasInDeepSleep) { ++ wasInDeepSleep = TRUE; ++ detach_all_vt_leds(FALSE); ++ previousActive = (ushort)(MAXVT + 1); ++ } ++ sleep(DEEPSLEEP); ++ sort_interfaces(&interfaces); /* maybe this time it works */ ++ } ++} ++return 0; /* Yeah right, never gets this far. */ + } + +-char* find_device_line (char* buffer, char* netDeviceName) +-{ +- static long fileOffset = 0L; +- register FILE* devFile; +- +- if (! (devFile = fopen(devFileName, "r")) ) { +- perror(devFileName); +- exit(1); +- } +- /* Skip two lines. (the header) */ +- /* Two choices how to do this. Didn't find any differences in speed. */ ++/* ++ * find interfaces in device file ++ * and make the list ordered like the device file ++ */ ++void sort_interfaces(struct interfaceList** interfaces) { ++ struct interfaceList** interfaces2; ++ struct interfaceList* tempInterfaces; ++ int neighbours; ++ ++ /* find row numbers for interfaces */ ++ tempInterfaces = *interfaces; ++ while (tempInterfaces) { ++ tempInterfaces->row = find_device_row(tempInterfaces->interfaceName); ++ tempInterfaces = tempInterfaces->next; ++ } ++ ++ /* sort in ascending order */ ++ while (*interfaces) { ++ interfaces2 = interfaces; ++ while (*interfaces2) { ++ if ((*interfaces)->row > (*interfaces2)->row) { /* swap */ ++ if ((*interfaces)->next == *interfaces2) ++ neighbours = 1; ++ else ++ neighbours = 0; ++ tempInterfaces = *interfaces; ++ *interfaces = *interfaces2; ++ *interfaces2 = tempInterfaces; ++ tempInterfaces = (*interfaces)->next; ++ (*interfaces)->next = (*interfaces2)->next; ++ (*interfaces2)->next = tempInterfaces; ++ if (neighbours) interfaces2 = &(*interfaces)->next; ++ } ++ interfaces2 = &(*interfaces2)->next; ++ } ++ interfaces = &(*interfaces)->next; ++ } ++} ++ ++/* prepare reading statistical lines from device file */ ++FILE* open_device() { ++ char buffer [MAXLEN]; ++ static long fileOffset = 0L; ++ FILE* devFile; ++ ++ if (! (devFile = fopen(devFileName, "r")) ) { ++ perror(devFileName); ++ exit(1); ++ } ++ ++ /* Skip two lines. (the header) */ ++ /* Two choices how to do this. Didn't find any differences in speed. */ + #if 0 +- fgets(buffer, MAXLEN, devFile); +- fgets(buffer, MAXLEN, devFile); ++ fgets(buffer, MAXLEN, devFile); ++ fgets(buffer, MAXLEN, devFile); + #else +- if (fileOffset) { +- fseek(devFile, fileOffset, SEEK_SET); +- } else { +- fgets(buffer, MAXLEN, devFile); +- fileOffset += (long)strlen(buffer); +- fgets(buffer, MAXLEN, devFile); +- fileOffset += (long)strlen(buffer); +- } ++ if (fileOffset) { ++ fseek(devFile, fileOffset, SEEK_SET); ++ } else { ++ fgets(buffer, MAXLEN, devFile); ++ fileOffset += (long)strlen(buffer); ++ fgets(buffer, MAXLEN, devFile); ++ fileOffset += (long)strlen(buffer); ++ } + #endif + +- while ( fgets(buffer, MAXLEN, devFile) ) { +- while(isblank(*buffer)) +- buffer++; +- if (buffer == strstr(buffer, netDeviceName)) { +- fclose(devFile); +- return buffer; +- } ++ return devFile; ++} ++ ++char* find_device_line (char* buffer, FILE* devFile, char* netDeviceName) ++{ ++ ++while ( fgets(buffer, MAXLEN, devFile) ) { ++ while(isblank(*buffer)) ++ buffer++; ++ if (buffer == strstr(buffer, netDeviceName)) ++ return buffer; ++} ++return NULL; ++} ++ ++int find_device_row (char* netDeviceName) ++{ ++char tempbuffer [MAXLEN]; ++char* buffer = tempbuffer; ++FILE* devFile; ++int returnValue = 0; ++ ++devFile = open_device(); ++while ( fgets(buffer, MAXLEN, devFile) ) { ++ returnValue++; ++ while(isblank(*buffer)) ++ buffer++; ++ if (buffer == strstr(buffer, netDeviceName)) { ++ fclose(devFile); ++ return returnValue; + } +- fclose(devFile); +- return NULL; ++} ++fclose(devFile); ++return 0; + } + + void my_sleep (struct timeval sleeptimeval) + { + #if 1 +- select(1, NULL, NULL, NULL, &sleeptimeval); ++select(1, NULL, NULL, NULL, &sleeptimeval); + #else +- usleep(sleeptimeval.tv_usec); ++usleep(sleeptimeval.tv_usec); + #endif + } +- ++ + char** split_on_blank (char* line) + { + /* +@@ -316,458 +450,558 @@ + Look at the end of this file for example /proc/net/dev listing. + */ + +- static char* list [FIELDCOUNT] = {}; +- register int i; ++static char* list [FIELDCOUNT] = {}; ++register int i; + +- i = 0; +- goto middle; /* speed(?) hack */ +- for (; i < FIELDCOUNT; i++) { +- while (isblank(*line)) +- line++; +- middle: +- list[i] = line; +- while (! isblank(*line) && *line != ':' && *line != '\n') +- line++; +- *(line++) = '\0'; +- } +- return list; ++i = 0; ++goto middle; /* speed(?) hack */ ++for (; i < FIELDCOUNT; i++) { ++ while (isblank(*line)) ++ line++; ++middle: ++ list[i] = line; ++ while (! isblank(*line) && *line != ':' && *line != '\n') ++ line++; ++ *(line++) = '\0'; + } +- +-void report_traffic (char** list) ++return list; ++} ++ ++char** split_on_comma (char* line) + { +- static long formerReceived = 0L; +- static long formerTransmitted = 0L; +- register long received, transmitted; ++ int i; ++ static char* list [INTPARAMS]; + +- received = atol(list[1]); +- transmitted = atol(list[6]); +- +- if (received != formerReceived) { +- led(NUMLOCKLED, SET, DELAYED); +- formerReceived = received; +- } else { +- led(NUMLOCKLED, CLEAR, DELAYED); +- } +- +- if (transmitted != formerTransmitted) { +- led(SCROLLLOCKLED, SET, FINISH); +- formerTransmitted = transmitted; +- } else { +- led(SCROLLLOCKLED, CLEAR, FINISH); +- } ++ for (i = 0; i < INTPARAMS; i++) { ++ list[i] = line; ++ while (*line != ',' && *line != '\0') line++; ++ if (*line != '\0') *(line++) = '\0'; ++ } ++ return list; ++} ++ ++void report_traffic (long numlock, long scrolllock) ++{ ++static long formerNumlock = 0L; ++static long formerScrolllock = 0L; ++ ++if (numlock != formerNumlock) { ++ led(NUMLOCKLED, SET, DELAYED); ++ formerNumlock = numlock; ++} else { ++ led(NUMLOCKLED, CLEAR, DELAYED); ++} ++ ++if (scrolllock != formerScrolllock) { ++ led(SCROLLLOCKLED, SET, FINISH); ++ formerScrolllock = scrolllock; ++} else { ++ led(SCROLLLOCKLED, CLEAR, FINISH); ++} + } + + void led (int led, LedMode mode, ActionMode doAction) + /* Only LED_NUM can be ActionMode DELAYED */ + { +- static ulong ledReminder = 0x00; +- ulong ledVal; ++static ulong ledReminder = 0x00; ++ulong ledVal; + #if (! REMOVE_X_CODE) +- XKeyboardControl values; ++XKeyboardControl values; + #endif + #ifdef DEBUG +- printf("led(%d, %d)\n", led, (int)mode); ++printf("led(%d, %d)\n", led, (int)mode); + #endif + #if (! REMOVE_X_CODE) +- if (myDisplay) { +- switch (mode) { +- case SET: +- values.led_mode = LedModeOn; +- break; +- case CLEAR: +- values.led_mode = LedModeOff; +- break; +- case TOGGLE: +- values.led_mode = LedModeOn; +- } ++if (myDisplay) { ++ switch (mode) { ++ case SET: ++ values.led_mode = LedModeOn; ++ break; ++ case CLEAR: ++ values.led_mode = LedModeOff; ++ break; ++ case TOGGLE: ++ values.led_mode = LedModeOn; + } +- values.led = led; ++} ++values.led = led; + #endif +- if (myDisplay) { ++if (myDisplay) { + #if (! REMOVE_X_CODE) +- XChangeKeyboardControl(myDisplay, KBLed | KBLedMode, &values); +- if (doAction != DELAYED) +- XSync(myDisplay, FALSE); +-#endif +- } else { +- if (doAction != FINISH) { +- if (ioctl(keyboardDevice, KDGETLED, &ledVal)) { +- perror("tleds: KDGETLED"); +- exit(1); +- } +- } else { +- ledVal = 0L; +- } +- switch (led) { +- case SCROLLLOCKLED: +- if (mode == SET) +- ledVal |= LED_SCR; +- else +- ledVal &= ~LED_SCR; +- break; +- case NUMLOCKLED: +- if (mode == SET) +- ledVal |= LED_NUM; +- else +- ledVal &= ~LED_NUM; +- break; +- default: +- perror("tleds: wrong led-value"); +- exit(1); +- } +- if (opt_c && doAction != FINISH) { +- ledVal = correct_caps(ledVal); ++ XChangeKeyboardControl(myDisplay, KBLed | KBLedMode, &values); ++ if (doAction != DELAYED) ++ XSync(myDisplay, FALSE); ++#endif ++} else { ++ if (doAction != FINISH) { ++ if (ioctl(keyboardDevice, KDGETLED, &ledVal)) { ++ perror("tleds: KDGETLED"); ++ exit(1); + } +- if (doAction) { /* FINISH or NOW */ +- if (doAction == FINISH) +- ledVal |= ledReminder; +- if (ioctl(keyboardDevice, KDSETLED, (char)ledVal)) { +- perror("tleds: KDSETLED"); +- exit(1); +- } +- ledReminder = 0x00; +- } else { +- /* Well, we know from report_traffic(), LED_SCR is +- processed later. OK, kludge. */ +- ledReminder = ledVal & ~LED_SCR; ++ } else { ++ ledVal = 0L; ++ } ++ switch (led) { ++ case SCROLLLOCKLED: ++ if (mode == SET) ++ ledVal |= LED_SCR; ++ else ++ ledVal &= ~LED_SCR; ++ break; ++ case NUMLOCKLED: ++ if (mode == SET) ++ ledVal |= LED_NUM; ++ else ++ ledVal &= ~LED_NUM; ++ break; ++ default: ++ perror("tleds: wrong led-value"); ++ exit(1); ++ } ++ if (opt_c && doAction != FINISH) { ++ ledVal = correct_caps(ledVal); ++ } ++ if (doAction) { /* FINISH or NOW */ ++ if (doAction == FINISH) ++ ledVal |= ledReminder; ++ if (ioctl(keyboardDevice, KDSETLED, (char)ledVal)) { ++ perror("tleds: KDSETLED"); ++ exit(1); + } ++ ledReminder = 0x00; ++ } else { ++ /* Well, we know from report_traffic(), LED_SCR is ++ processed later. OK, kludge. */ ++ ledReminder = ledVal & ~LED_SCR; + } + } ++} + + int is_on_X (int ttyFd) + { +- long mode; +- +- if (ioctl(ttyFd, KDGETMODE, &mode)) +- return TRUE; /* perror is not wanted here */ +- return (mode & KD_GRAPHICS); ++long mode; ++ ++if (ioctl(ttyFd, KDGETMODE, &mode)) ++ return TRUE; /* perror is not wanted here */ ++return (mode & KD_GRAPHICS); + } + + ulong correct_caps (ulong ledVal) + { +- struct vt_stat vtStat; +- int currentVT; +- ulong flagVal; +- +- currentVT = open(CURRENTTTY, O_RDONLY); /* Blah, only for root. */ +- if (-1 != currentVT) { +- if (! ioctl(currentVT, KDGKBLED, &flagVal) +- && ! ioctl(currentVT, VT_GETSTATE, &vtStat)) { +- if (previousActive == --vtStat.v_active) { +- if (is_on_X(currentVT)) { +- ioctl(currentVT, KDGETLED, &flagVal); +- } +- if (flagVal & LED_CAP) +- ledVal |= LED_CAP; +- else +- ledVal &= ~LED_CAP; +- ttyLEDs[previousActive] = (char)ledVal; +- } else { +- previousActive = vtStat.v_active; +- ledVal = (ulong)ttyLEDs[previousActive]; ++static int remindVTRound = 0; ++struct vt_stat vtStat; ++int currentVT; ++ulong flagVal; ++ ++currentVT = open(CURRENTTTY, O_RDONLY); /* Blah, only for root. */ ++if (-1 != currentVT) { ++ if (! ioctl(currentVT, KDGKBLED, &flagVal) ++ && ! ioctl(currentVT, VT_GETSTATE, &vtStat)) { ++ if (previousActive == --vtStat.v_active) { ++ if (is_on_X(currentVT)) { ++ ioctl(currentVT, KDGETLED, &flagVal); + } ++ if (flagVal & LED_CAP) ++ ledVal |= LED_CAP; ++ else ++ ledVal &= ~LED_CAP; ++ ttyLEDs[previousActive] = (char)ledVal; ++ } else { ++ previousActive = vtStat.v_active; ++ ledVal = (ulong)ttyLEDs[previousActive]; + } +- close(currentVT); + } +- return ledVal; ++ if(remindVTRound++ > remindVTcoef) { ++ remindVTRound = 0; ++ detach_vt_leds(currentVT, TRUE); ++ } ++ close(currentVT); ++} ++return ledVal; ++} ++ ++ulong detach_vt_leds (int tty, int wantDetach) ++/* ++What I really would like to do, is to deattach only num-lock and scroll-lock ++leds and leave caps-lock led attached to indicate current keyboard caps ++lock flag. But Linux kernel (2.0.x) doesn't allow this, it's either all or ++nothing. Someone should patch the kernel to correct this for 2.2.0? ++*/ ++{ ++ulong ledVal; ++ ++if (ioctl(tty, KDGETLED, &ledVal)) { ++ return 0; ++} ++ledVal &= ~LED_SCR; ++ledVal &= ~LED_NUM; ++if (!wantDetach && !is_on_X(tty)) { ++ ioctl(tty, KDGKBLED, &ledVal); ++ ledVal |= 0x08; /* Reattach. */ ++} ++ioctl(tty, KDSETLED, (char)ledVal); ++return ledVal; ++} ++ ++void detach_all_vt_leds (int wantDetach) ++{ ++ulong ledVal; ++int i, maxVT, tty; ++char ttyFileName [30]; ++char ttyFileNameTmp [30]; ++ ++strcpy(ttyFileName, _PATH_TTY); ++maxVT = find_max_VT(); ++for (i=0; i <= maxVT; i++) { ++ if (i > 0) ++ ttyLEDs[i-1] = 0x00; ++ /* No error checkings here, if we can't, we can't. */ ++ sprintf(ttyFileNameTmp, "%s%d", ttyFileName, i); ++ if (-1 == (tty = open(ttyFileNameTmp, O_RDONLY))) { ++ continue; ++ } ++ ledVal = detach_vt_leds(tty, wantDetach); ++ if (i > 0) ++ ttyLEDs[i-1] = (char)ledVal; ++ close(tty); ++} ++} ++ ++int find_max_VT () ++{ ++return MAXVT; + } + + void parent_wants_me_dead (int x) + { +- exit(x); ++exit(x); + } + + void my_signal_handler (int x) + { +- exit(x); ++exit(x); + } + + void my_exit () + { +- if (opt_b && ! opt_q) +- printf("Bye-Bye !\n"); +- if (myDisplay) { ++if (opt_b && ! opt_q) ++ printf("Bye-Bye !\n"); ++if (myDisplay) { + #if (! REMOVE_X_CODE) +- clear_led(NUMLOCKLED); +- clear_led(SCROLLLOCKLED); +- XCloseDisplay(myDisplay); /* X */ ++ clear_led(NUMLOCKLED); ++ clear_led(SCROLLLOCKLED); ++ XCloseDisplay(myDisplay); /* X */ + #endif +- } +- detach_vt_leds(FALSE); /* re-attach */ +- if (keyboardDevice) /* EUID root - CONSOLE */ +- close(keyboardDevice); +- if(getpid() == get_old_pid()) { +- unlink(pidFileName); +- unlink(rootPidFileName); +- } ++} ++detach_all_vt_leds(FALSE); /* re-attach */ ++if (keyboardDevice) /* EUID root - CONSOLE */ ++ close(keyboardDevice); ++if(getpid() == get_old_pid()) { ++ unlink(pidFileName); ++ unlink(rootPidFileName); ++} + } + + int kill_old_process () + { +- pid_t pid, pid2; ++pid_t pid, pid2; + +- if (! (pid = get_old_pid())) { +- if (!opt_q) { +- fprintf(stderr, +- "Couldn't find what to kill.\n"); +- perror(pidFileName); +- } +- return 1; +- } +- kill(pid, SIGUSR1); +- if (!opt_q) +- printf("One moment...(3 secs)...\n"); +- sleep(3); +- if ((pid2 = get_old_pid())) { +- if (!opt_q) +- fprintf(stderr, +- "PID: %d - Hmm...not sure if I succeeded in kill.\n", +- pid2); +- return 1; ++if (! (pid = get_old_pid())) { ++ if (!opt_q) { ++ fprintf(stderr, ++ "Couldn't find what to kill.\n"); ++ perror(pidFileName); + } +- if (! opt_q) +- printf("Killed. (The old PID was %d)\n", pid); +- return 0; ++ return 1; ++} ++kill(pid, SIGUSR1); ++if (!opt_q) ++ printf("One moment...(3 secs)...\n"); ++sleep(3); ++if ((pid2 = get_old_pid())) { ++ if (!opt_q) ++ fprintf(stderr, ++ "PID: %d - Hmm...not sure if I succeeded in kill.\n", ++ pid2); ++ return 1; ++} ++if (! opt_q) ++ printf("Killed. (The old PID was %d)\n", pid); ++return 0; + } + + void create_pid_file (pid_t pid, const char* name) + { +- FILE* pidFile; +- pid_t oldPid; +- char procFileName [80]; +- char *tmpPidFileName; +- char pidString [11]; /* "length" of UINT_MAX */ +- struct stat status; +- int isAnother; +- +- if (geteuid()) +- tmpPidFileName = pidFileName; +- else +- tmpPidFileName = rootPidFileName; /* root */ +- /* +- We check if there already is the *.pid file and if maybe the +- process' (child) which created it is dead, so we could try to fix. +- */ +- isAnother = FALSE; +- oldPid = (pid_t) 0; +- if (! stat(pidFileName, &status) +- || ! stat(rootPidFileName, &status)) { +- if ((oldPid = get_old_pid())) { +- strcpy(procFileName, "/proc/"); +- sprintf(pidString, "%ld", (long)oldPid); +- strcat(procFileName, pidString); +- strcat(procFileName, "/environ"); +- if(! stat(procFileName, &status)) { /* The old proc. */ +- isAnother = TRUE; +- } else { +- /* The old process was not alive, so we try to fix. */ +- unlink(rootPidFileName); +- unlink(pidFileName); +- if (get_old_pid()) { +- fprintf(stderr, +- "%s: Can't remove %s or %s\n%s\n", +- MYNAME, pidFileName, +- rootPidFileName, +- "Program terminated."); +- exit(1); +- } +- } +- } else { ++FILE* pidFile; ++pid_t oldPid; ++char procFileName [80]; ++char *tmpPidFileName; ++char pidString [11]; /* "length" of UINT_MAX */ ++struct stat status; ++int isAnother; ++ ++if (geteuid()) ++ tmpPidFileName = pidFileName; ++else ++ tmpPidFileName = rootPidFileName; /* root */ ++/* ++We check if there already is the *.pid file and if maybe the ++process' (child) which created it is dead, so we could try to fix. ++*/ ++isAnother = FALSE; ++oldPid = (pid_t) 0; ++if (! stat(pidFileName, &status) ++ || ! stat(rootPidFileName, &status)) { ++ if ((oldPid = get_old_pid())) { ++ strcpy(procFileName, "/proc/"); ++ sprintf(pidString, "%ld", (long)oldPid); ++ strcat(procFileName, pidString); ++ strcat(procFileName, "/environ"); ++ if(! stat(procFileName, &status)) { /* The old proc. */ + isAnother = TRUE; +- } +- } ++ } else { ++ /* The old process was not alive, so we try to fix. */ ++ unlink(rootPidFileName); ++ unlink(pidFileName); ++ if (get_old_pid()) { ++ fprintf(stderr, ++ "%s: Can't remove %s or %s\n%s\n", ++ MYNAME, pidFileName, ++ rootPidFileName, ++ "Program terminated."); ++ exit(1); ++ } ++ } ++ } else { ++ isAnother = TRUE; ++ } ++} ++ ++if (isAnother) { ++ if (oldPid) ++ fprintf(stderr, "(The old PID %ld) ", (long)oldPid); ++ fprintf(stderr, "%s %s runnning.\n%s %s %s\n", ++ "\nSorry, can't run. There might be another", ++ name, "If not, try: rm", pidFileName, rootPidFileName); ++ kill(pid, SIGUSR1); ++ exit(1); ++} + +- if (isAnother) { +- if (oldPid) +- fprintf(stderr, "(The old PID %ld) ", (long)oldPid); +- fprintf(stderr, "%s %s runnning.\n%s %s %s\n", +- "\nSorry, can't run. There might be another", +- name, "If not, try: rm", pidFileName, rootPidFileName); +- kill(pid, SIGUSR1); +- exit(1); +- } +- +- if( !(pidFile = fopen(tmpPidFileName, "w"))) { +- perror(tmpPidFileName); +- kill(pid, SIGUSR1); +- exit(1); +- } +- fprintf(pidFile, "%ld\n", (long)pid); +- fclose(pidFile); +- if (chmod(tmpPidFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) { +- perror(tmpPidFileName); ++if( !(pidFile = fopen(tmpPidFileName, "w"))) { ++ perror(tmpPidFileName); ++ kill(pid, SIGUSR1); ++ exit(1); ++} ++fprintf(pidFile, "%ld\n", (long)pid); ++fclose(pidFile); ++if (chmod(tmpPidFileName, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) { ++ perror(tmpPidFileName); ++ exit(1); ++} ++if (! geteuid()) { /* EUID root */ ++ if (symlink(tmpPidFileName, pidFileName)) { ++ perror(pidFileName); + exit(1); + } +- if (! geteuid()) { /* EUID root */ +- if (symlink(tmpPidFileName, pidFileName)) { +- perror(pidFileName); +- exit(1); +- } +- } ++} + } + + pid_t get_old_pid () + { +- FILE* pidFile; +- long returnValue; ++FILE* pidFile; ++long returnValue; + +- if (! (pidFile = fopen(pidFileName, "r"))) { +- if (! (pidFile = fopen(rootPidFileName, "r"))) +- return (pid_t)0L; +- } +- fscanf(pidFile, "%ld", &returnValue); +- fclose(pidFile); +- return (pid_t)returnValue; +-} +- +-void handle_my_argvs (char** interfaceName, int* sleeptime, +- int argc, char* argv []) +-{ +- int c; +- +- while(EOF != (c = getopt(argc, argv, "bcd:hkqv"))) { +- switch (c) { +- case 'b': +- opt_b = TRUE; +- break; +- case 'c': +- opt_c = TRUE; +- break; +- case 'd': +- opt_d = TRUE; +- *sleeptime +- = get_sleeptime(TRUE, NULL); +- break; +- case 'h': +- opt_h = TRUE; +- break; +- case 'k': +- opt_k = TRUE; +- break; +- case 'q': +- opt_q = TRUE; +- break; +- case 'v': +- opt_v = TRUE; +- break; +- default: +- opt_h = TRUE; +- /* assert(0); */ +- } +- } +- *interfaceName = argv[optind]; +- if (! *interfaceName || ! (*interfaceName)[0]) { +- opt_h = TRUE; /* We may also have opt_k so we won't get h. */ +- return; +- } +- if (! *sleeptime) +- *sleeptime = get_sleeptime(FALSE, *interfaceName); ++if (! (pidFile = fopen(pidFileName, "r"))) { ++ if (! (pidFile = fopen(rootPidFileName, "r"))) ++ return (pid_t)0L; ++} ++fscanf(pidFile, "%ld", &returnValue); ++fclose(pidFile); ++return (pid_t)returnValue; ++} ++ ++void handle_my_argvs (struct interfaceList** interfaces, int* sleeptime, ++ int argc, char* argv []) ++{ ++int c; ++struct interfaceList** tempInterfaces = interfaces; ++char** list; ++ ++while(EOF != (c = getopt(argc, argv, "bcd:hkqvV"))) { ++ switch (c) { ++ case 'V': ++ opt_V = TRUE; ++ break; ++ case 'b': ++ opt_b = TRUE; ++ break; ++ case 'c': ++ opt_c = TRUE; ++ break; ++ case 'd': ++ opt_d = TRUE; ++ *sleeptime ++ = get_sleeptime(TRUE, NULL); ++ break; ++ case 'h': ++ opt_h = TRUE; ++ break; ++ case 'k': ++ opt_k = TRUE; ++ break; ++ case 'q': ++ opt_q = TRUE; ++ break; ++ case 'v': ++ opt_v = TRUE; ++ break; ++ default: ++ opt_h = TRUE; ++ /* assert(0); */ ++ } ++} ++/* build interface list */ ++do { /* new member */ ++ if (! argv[optind] || ! (argv[optind])[0]) { /* bad argv */ ++ opt_h = TRUE; /* We may also have opt_k so we won't get h. */ ++ return; ++ } ++ *tempInterfaces = (struct interfaceList*)malloc(sizeof(struct interfaceList)); ++ list = split_on_comma(argv[optind]); ++ (*tempInterfaces)->interfaceName = list[0]; ++ if (*list[1]) { /* RX LED parameter */ ++ (*tempInterfaces)->rxled = atoi(list[1]); ++ if (*list[2]) /* TX LED parameter */ ++ (*tempInterfaces)->txled = atoi(list[2]); ++ else ++ (*tempInterfaces)->txled = atoi(list[1]); ++ } else { ++ (*tempInterfaces)->rxled = 1; ++ (*tempInterfaces)->txled = 2; ++ } ++ (*tempInterfaces)->row = 0; ++ (*tempInterfaces)->next = NULL; ++ tempInterfaces = &((*tempInterfaces)->next); ++ optind++; ++} while (optind < argc); ++if (opt_V) ++ printf("Marjo Helena Salmela on %svalehtelija ja paskiainen.\n", ++ "minua kohtaan ollut "); /* Don't ask. */ ++if (! *sleeptime) ++ *sleeptime = get_sleeptime(FALSE, *interfaces); + } + + void check_sanity () + { +- if (opt_c && geteuid()) { +- opt_c = FALSE; +- if (! opt_q) +- fprintf(stderr, +- "You have to be EUID root for -c. -c removed.\n"); +- } ++if (opt_c && geteuid()) { ++ opt_c = FALSE; ++ if (! opt_q) ++ fprintf(stderr, ++ "You have to be EUID root for -c. -c removed.\n"); ++} + } + +-int get_sleeptime (int isDefinedByUser, char* interfaceName) ++int get_sleeptime (int isDefinedByUser, struct interfaceList* interfaces) + { +- int returnValue; +- +- if (isDefinedByUser) { +- returnValue = atol(optarg); +- if (returnValue < 0 || returnValue > 10000) { +- opt_h = TRUE; /* Illegal value. */ +- return 0; +- } +- return returnValue; +- } else { +- /* Ok, we have to figure ourselves what would be good update delay. */ +- if (interfaceName == strstr(interfaceName, "eth")) +- returnValue = DEFETHDELAY; +- else +- returnValue = DEFPPPDELAY; +- return returnValue; ++int returnValue; ++ ++if (isDefinedByUser) { ++ returnValue = atol(optarg); ++ if (returnValue < 0 || returnValue > 10000) { ++ opt_h = TRUE; /* Illegal value. */ ++ return 0; + } ++ return returnValue; ++} else { ++/* Ok, we have to figure ourselves what would be good update delay. */ ++ returnValue = 0; ++ while (interfaces) { ++ if (interfaces->interfaceName == strstr(interfaces->interfaceName, "eth")) { ++ /* Return minimum */ ++ if (!returnValue || returnValue > DEFETHDELAY) returnValue = DEFETHDELAY; ++ } else { ++ if (!returnValue || returnValue > DEFPPPDELAY) returnValue = DEFPPPDELAY; ++ } ++ interfaces = interfaces->next; ++ } ++ return returnValue; + } +- +-int find_max_VT () +-{ +- return MAXVT; + } + +-void detach_vt_leds (int wantDetach) +-/* +- What I really would like to do, is to deattach only num-lock and scroll-lock +- leds and leave caps-lock led attached to indicate current keyboard caps +- lock flag. But Linux kernel (2.0.x) doesn't allow this, it's either all or +- nothing. Someone should patch the kernel to correct this for 2.2.0? +-*/ +-{ +- int i, maxVT, tty; +- char ttyFileName [30]; +- char ttyFileNameTmp [30]; +- ulong ledVal; +- +- strcpy(ttyFileName, _PATH_TTY); +- maxVT = find_max_VT(); +- for (i=0; i <= maxVT; i++) { +- if (i > 0) +- ttyLEDs[i-1] = 0x00; +- /* No error checkings here, if we can't, we can't. */ +- sprintf(ttyFileNameTmp, "%s%d", ttyFileName, i); +- if (-1 == (tty = open(ttyFileNameTmp, O_RDONLY))) { +- continue; +- } +- if (ioctl(tty, KDGETLED, &ledVal)) { +- close(tty); +- continue; +- } +- ledVal &= ~LED_SCR; +- ledVal &= ~LED_NUM; +- if (!wantDetach && !is_on_X(tty)) { +- ioctl(tty, KDGKBLED, &ledVal); +- ledVal |= 8; /* Reattach. */ +- } +- ioctl(tty, KDSETLED, (char)ledVal); +- if (i > 0) +- ttyLEDs[i-1] = (char)ledVal; +- close(tty); +- } ++void check_kernel_version () ++{ ++struct utsname buffer; ++ ++if (-1 == uname(&buffer)) { ++ perror("tleds: check_kernel_version()"); ++ exit(1); ++} ++#if KERNEL2_0 ++if (strncmp("2.0.", (const char*)buffer.release, 4)) { ++ fprintf(stderr, ++ "%s was compiled for v2.0 kernel. Check Makefile. %s", ++ MYNAME, TERMINATESTR); ++ exit(1); ++} ++#else ++if (! strncmp("2.0.", (const char*)buffer.release, 4)) { ++ fprintf(stderr, "%s was compiled for v2.1 (2.2?) kernel. %s", ++ MYNAME, TERMINATESTR); ++ exit(1); ++} ++#endif + } + + void usage (char* name) + { +- fprintf(stderr, +- "Usage: %s [-bchkqv] [-d <update_delay>] <interface_name>\n", +- name); +- fprintf(stderr, "Example: %s -d 300 ppp0\n", name); +- fprintf(stderr, "Options:\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", +- "\t-b\tDon't go to the background.", +- "\t-c\tFix the CapsLED in VTs. Only for EUID root.", +- "\t-d N\tSet update delay.", +- "\t\tN must be between 1 and 10000 (milliseconds)", +- "\t-h\tHelp. (this)", +- "\t-k\tKill (old) (x)tleds running.", +- "\t-q\tBe quiet.", +- "\t-v\tPrint version information.", +- "\t\t(`cat /proc/net/dev` to see your interfaces.)"); ++printf("Usage: %s [-bchkqv] [-d <update_delay>] [<interface_name>] ...\n", ++ name); ++printf("Example: %s -d 300 ppp0 eth0,1 eth1,2\n", name); ++printf("<interface_name>:\n" ++ "\tinterface (e.g. eth0)\n" ++ "\tOR interface,led (e.g. eth1,1)\n" ++ "\tOR interface,rx_led,tx_led (e.g. eth2,2,1)\n" ++ "led:\n\t1\tNUM LOCK LED\n\t2\tSCROLL LOCK LED\n"); ++printf("Options:\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", ++ "\t-b\tDon't go to the background.", ++ "\t-c\tFix the CapsLED in VTs. Only for EUID root.", ++ "\t-d N\tSet update delay.", ++ "\t\tN must be between 1 and 10000 (milliseconds)", ++ "\t-h\tHelp. (this)", ++ "\t-k\tKill (old) (x)tleds running.", ++ "\t-q\tBe quiet.", ++ "\t-v\tPrint version information.", ++ "\t\t(`cat /proc/net/dev` to see your interfaces.)"); + } + + /* +-If the format of /proc/net/dev is changed this program will prolly not work, +-because the optimizations in e.g. find_device_line() +- ++In v2.0.x kernels: + $ cat /proc/net/dev + Inter-| Receive | Transmit +- face |packets errs drop fifo frame|packets errs drop fifo colls carrier +- lo: 2 0 0 0 0 2 0 0 0 0 0 +- eth0: 3154 0 0 0 0 2553 0 0 0 0 0 +- dummy: No statistics available. +- ppp0: 26619 0 0 0 0 42230 0 0 0 0 0 ++face |packets errs drop fifo frame|packets errs drop fifo colls carrier ++lo: 2 0 0 0 0 2 0 0 0 0 0 ++eth0: 3154 0 0 0 0 2553 0 0 0 0 0 ++dummy: No statistics available. ++ppp0: 26619 0 0 0 0 42230 0 0 0 0 0 ++$ ++ ++In v2.1 kernels they haven't obviously decided yet what it will be in v2.2.x ++ ++In v2.1.72 +/- N kernels: ++$ cat /proc/net/dev ++Inter-| Receive | Transmit ++face |bytes packets errs drop fifo frame|bytes packets errs drop fifo colls carrier ++lo: 388390 7747 0 0 0 0 388390 7747 0 0 0 0 0 0 ++ppp0: 0 496878 19 19 0 0 0 301287 0 0 0 0 0 0 ++$ ++ ++In v2.1.97 +/- N kernels: ++$ cat /proc/net/dev ++Inter-| Receive | Transmit ++face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed ++lo: 4171066 19848 0 0 0 0 0 0 4171066 19848 0 0 0 0 0 0 ++eth0: 2699632 19917 0 0 0 0 0 0 15993153 23079 0 0 0 1983 0 0 ++ppp0: 391413 4588 1 0 0 0 0 0 4447 6560 0 0 0 0 0 0 + $ + */ ++ diff --git a/net-analyzer/tleds/tleds-1.04.ebuild b/net-analyzer/tleds/tleds-1.04.ebuild new file mode 100644 index 000000000000..6016048ef089 --- /dev/null +++ b/net-analyzer/tleds/tleds-1.04.ebuild @@ -0,0 +1,41 @@ +# Copyright 2002 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/net-analyzer/tleds/tleds-1.04.ebuild,v 1.1 2002/07/01 10:57:15 seemant Exp $ + +DESCRIPTION="Blinks keyboard LEDs (Light Emitting Diode) indicating outgoing +and incoming network packets on selected network interface." + +# Homepage, not used by Portage directly but handy for developer reference +HOMEPAGE="http://" + +LICENSE="GPL-2" + +DEPEND="virtual/glibc + X? ( virtual/x11 )" + +SRC_URI="http://www.hut.fi/~jlohikos/tleds/public/${P}.tgz" + +S=${WORKDIR}/${P} + +SLOT="0" + +src_unpack() { + unpack ${A} + cd ${S} + patch < ${FILESDIR}/${P}-FuRy.patch +} + +src_compile() { + + emake all || die +} + +src_install () { + + dobin tleds + + use X && dobin xtleds + + doman tleds.1 + dodoc README COPYING Changes +} |