SHA256
3
0
forked from pool/gpm

- Through out the PS/2 patches that lead to gpm not working.

- Add patches from Fedora.

OBS-URL: https://build.opensuse.org/package/show/Base:System/gpm?expand=0&rev=13
This commit is contained in:
Philipp Thomas 2011-01-27 16:00:19 +00:00 committed by Git OBS Bridge
parent 23b560c01a
commit b3ee77c87c
15 changed files with 616 additions and 1701 deletions

16
gpm-close-fds.patch Normal file
View File

@ -0,0 +1,16 @@
--- src/daemon/startup.c.close-fds 2008-06-13 10:08:19.000000000 +0200
+++ src/daemon/startup.c 2008-12-02 10:11:12.000000000 +0100
@@ -135,6 +135,13 @@ void startup(int argc, char **argv)
check_uniqueness();
gpm_report(GPM_PR_INFO,GPM_MESS_STARTED);
+ // close extra fds
+ if (option.run_status == GPM_RUN_STARTUP ) {
+ close(0);
+ close(1);
+ close(2);
+ }
+
//return mouse_table[1].fd; /* the second is handled in the main() */
/****************** OLD CODE from gpn.c END ***********************/

View File

@ -11,33 +11,7 @@ Index: README
directory, test it out and then edit it to suit your feels.
* You'd like to name the gpm info file inside /usr/info/dir. Just insert
Index: doc/README.silitek
===================================================================
--- doc/README.silitek.orig 2010-09-08 13:26:13.916055341 +0200
+++ doc/README.silitek 2010-09-08 13:26:14.084036415 +0200
@@ -14,11 +14,11 @@ This IR commander can be used with two t
Both types of mouse driver uses the system wide configuration file
- /etc/gpm-silitek.conf
+ /etc/gpm/silitek.conf
which defines the return values of any key not being mouse button
or mouse stick. For this keys the drag mouse button works as a
-modifier: pressed once, the last column in /etc/gpm-silitek.conf
+modifier: pressed once, the last column in /etc/gpm/silitek.conf
is used. To switch back to the normal return values, the drag mouse
button has to be pressed again. It is allowed to use escaped
sequences as return values. Characters other than printable can
@@ -169,7 +169,7 @@ EOF
--------------------------------------------------------------------
the Multimedia keys on IR Keyboard SK-7100 are usable (for ncurses
-based programs see below). After editing /etc/gpm-silitek.conf
+based programs see below). After editing /etc/gpm/silitek.conf
to get the similar named keys to work similar, both the IR Keyboard
SK-7100 and the IR commander SM-1000 are usable in parallel.
Index: doc/README.synaptics
===================================================================
--- doc/README.synaptics.orig 2009-02-09 10:58:53.000000000 +0100
@ -118,6 +92,7 @@ Index: doc/doc.gpm.in
$(HOME)/.gpm-root The user configuration file.
/dev/vcs* Virtual Console Screens
.fi
Index: doc/gpm.info
===================================================================
--- doc/gpm.info.orig 2009-02-09 10:59:44.000000000 +0100
@ -131,19 +106,7 @@ Index: doc/gpm.info
configuration information. This option is intended for those
system administrators who fear security could be broken by this
daemon. Things should be sufficiently secure, but if you find a
Index: src/headers/silitek.h
===================================================================
--- src/headers/silitek.h.orig 2010-09-08 13:26:14.000045878 +0200
+++ src/headers/silitek.h 2010-09-08 13:26:14.224020642 +0200
@@ -27,7 +27,7 @@ extern void silitek_keys(unsigned char *
extern void silitek_keys_ps2(unsigned char *data, int *drag);
extern int silitek_ghost_ps2(unsigned char *data);
extern int fd_silitek;
-#define SILI_SYSTEM_FILE SYSCONFDIR "/gpm-silitek.conf"
+#define SILI_SYSTEM_FILE SYSCONFDIR "/silitek.conf"
#define SILISTRLEN 32
#define SILISTRSCN "key %32s %32s %32s"
extern void silitek_mapping(void);
Index: src/headers/twiddler.h
===================================================================
--- src/headers/twiddler.h.orig 2009-02-09 10:58:53.000000000 +0100
@ -171,6 +134,7 @@ Index: src/prog/gpm-root.y
#define DEFAULT_FORE 7
#define DEFAULT_BACK 0
Index: src/synaptics.c
===================================================================
--- src/synaptics.c.orig 2009-02-09 10:58:53.000000000 +0100

10
gpm-gcc4.3.patch Normal file
View File

@ -0,0 +1,10 @@
--- src/daemon/open_console.c.gcc4.3 2008-05-28 11:12:34.000000000 +0200
+++ src/daemon/open_console.c 2008-05-28 11:12:40.000000000 +0200
@@ -21,7 +21,6 @@
#include <fcntl.h> /* open and co. */
#include <sys/stat.h> /* stat() */
-#include <stropts.h> /* ioctl */
/* Linux specific (to be outsourced in gpm2 */
#include <linux/serial.h> /* for serial console check */

19
gpm-lib-silent.patch Normal file
View File

@ -0,0 +1,19 @@
--- src/lib/report-lib.c.lib-silent 2002-12-24 23:57:16.000000000 +0100
+++ src/lib/report-lib.c 2006-01-18 17:55:38.000000000 +0100
@@ -24,8 +24,16 @@
#include "headers/message.h"
+static int gpm_silent() {
+ if ( getenv( "GPM_VERBOSE" ) == NULL ) return 1;
+ return 0;
+}
+
void gpm_report(int line, char *file, int stat, char *text, ... )
{
+ if ( gpm_silent() && stat != GPM_STAT_OOPS )
+ return;
+
char *string = NULL;
int log_level;
va_list ap;

11
gpm-libtool.patch Normal file
View File

@ -0,0 +1,11 @@
--- configure.ac.libtool 2009-02-11 08:12:00.000000000 +0100
+++ configure.ac 2009-02-11 08:12:08.000000000 +0100
@@ -42,7 +42,7 @@ release="`cat $srcdir/.gitversion`"
#
AC_PROG_CC
-AC_PROG_RANLIB
+AC_PROG_LIBTOOL
AC_PROG_INSTALL
AC_PROG_YACC
AC_PROG_LN_S

32
gpm-multilib.patch Normal file
View File

@ -0,0 +1,32 @@
Index: contrib/Makefile.in
===================================================================
--- contrib/Makefile.in.orig 2008-06-19 07:48:48.000000000 +0200
+++ contrib/Makefile.in 2011-01-27 12:31:18.404745581 +0100
@@ -9,10 +9,10 @@ top_builddir = ..
include $(top_builddir)/Makefile.include
-all: $(srcdir)/$(ELISP)
+all: $(filter-out %.elc,$(srcdir)/$(ELISP))
install: all
- if [ -n "$(ELISP)" ]; then for i in `echo $(ELISP)`; do \
+ if [ -n "$(filter-out %.elc,$(ELISP))" ]; then for i in `echo $(filter-out %.elc,$(ELISP))`; do \
$(INSTALL_DATA) $(srcdir)/$$i $(lispdir)/`basename $$i` ;\
done; fi
@@ -20,7 +20,7 @@ install: all
$(EMACS) -batch -l $(srcdir)/emacs/exec.el -exec '(byte-compile-file "$<")'
uninstall:
- if [ -n "$(ELISP)" ]; then for i in `echo $(ELISP)`; do \
+ if [ -n "$(filter-out %.elc,$(ELISP))" ]; then for i in `echo $(filter-out %.elc,$(ELISP))`; do \
rm -f $(lispdir)/$$i ;\
done; fi
@@ -28,4 +28,4 @@ dist:
$(CP) -r $(srcdir) $(top_builddir)/gpm-$(release)/
clean distclean:
- $(RM) -f $(srcdir)/emacs/*.elc Makefile
+ $(RM) $(srcdir)/emacs/*.elc Makefile

View File

@ -1,35 +0,0 @@
Index: src/headers/gpmInt.h
===================================================================
--- src/headers/gpmInt.h.orig 2010-09-08 13:25:25.777479285 +0200
+++ src/headers/gpmInt.h 2010-09-08 13:25:31.112878123 +0200
@@ -50,21 +50,27 @@
/*** mouse commands ***/
-#define GPM_AUX_SEND_ID 0xF2
+#define GPM_AUX_SEND_ID 0xF2 /* Get ID: ACK + 1 byte ID */
#define GPM_AUX_ID_ERROR -1
#define GPM_AUX_ID_PS2 0
#define GPM_AUX_ID_IMPS2 3
/* these are shameless stolen from /usr/src/linux/include/linux/pc_keyb.h */
-#define GPM_AUX_SET_RES 0xE8 /* Set resolution */
#define GPM_AUX_SET_SCALE11 0xE6 /* Set 1:1 scaling */
#define GPM_AUX_SET_SCALE21 0xE7 /* Set 2:1 scaling */
-#define GPM_AUX_GET_SCALE 0xE9 /* Get scaling factor */
+#define GPM_AUX_SET_RES 0xE8 /* Set resolution */
+#define GPM_AUX_GET_SCALE 0xE9 /* Get scaling factor: ACK + 3 byte status pack */
#define GPM_AUX_SET_STREAM 0xEA /* Set stream mode */
+#define GPM_AUX_GET_DATA 0xEB /* Read data: ACK + 3 byte movement pack */
+#define GPM_AUX_RESET_WRAP 0xEC /* From wrap mode to previous */
+#define GPM_AUX_SET_WRAP 0xEE /* Set wrap mode */
+#define GPM_AUX_SET_REMOTE 0xF0 /* Set remote mode */
#define GPM_AUX_SET_SAMPLE 0xF3 /* Set sample rate */
#define GPM_AUX_ENABLE_DEV 0xF4 /* Enable aux device */
#define GPM_AUX_DISABLE_DEV 0xF5 /* Disable aux device */
+#define GPM_AUX_DEFAULTS 0xF6 /* Reset to defaults */
+#define GPM_AUX_RESEND 0xFE /* Resend last pack */
#define GPM_AUX_RESET 0xFF /* Reset aux device */
#define GPM_AUX_ACK 0xFA /* Command byte ACK. */

View File

@ -1,13 +0,0 @@
Index: src/daemon/getmousedata.c
===================================================================
--- src/daemon/getmousedata.c.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/daemon/getmousedata.c 2010-09-07 19:18:52.107824882 +0200
@@ -70,7 +70,7 @@ char *getMouseData(int fd, Gpm_Type *typ
if((i=(which_mouse->m_type)->packetlen-howmany)) /* still to get */
do {
- j = read(fd,edata-i,i); /* edata is pointer just after data */
+ j = read(fd,edata-i,howmany); /* edata is pointer just after data */
if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep && j > 0)
write(fifofd, edata-i, j);
i -= j;

View File

@ -1,459 +0,0 @@
Index: src/mice.c
===================================================================
--- src/mice.c.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/mice.c 2010-09-08 18:38:24.516205731 +0200
@@ -2372,116 +2372,116 @@ Gpm_Type mice[]={
{"mman", "The \"MouseMan\" and similar devices (3/4 bytes per packet).",
"Mouseman", M_mman, I_serial, CS7 | STD_FLG, /* first */
- {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 3, 1, 1, 0, 0, 0},
{"ms", "The original ms protocol, with a middle-button extension.",
"", M_ms, I_serial, CS7 | STD_FLG,
- {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0},
{"acecad", "Acecad tablet absolute mode(Sumagrapics MM-Series mode)",
"", M_summa, I_summa, STD_FLG,
- {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0},
+ {0x80, 0x80, 0x00, 0x00}, 7, 1, 0, 1, 0, 0},
{"bare", "Unadorned ms protocol. Needed with some 2-buttons mice.",
"Microsoft", M_bare, I_serial, CS7 | STD_FLG,
- {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0},
{"bm", "Micro$oft busmice and compatible devices.",
"BusMouse", M_bm, I_empty, STD_FLG, /* bm is sun */
- {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0},
+ {0xf8, 0x80, 0x00, 0x00}, 3, 3, 0, 0, 0, 0},
{"brw", "Fellowes Browser - 4 buttons (and a wheel) (dual protocol?)",
"", M_brw, I_pnp, CS7 | STD_FLG,
- {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0},
+ {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, 0, 0},
{"cal", "Calcomp UltraSlate",
"", M_calus, I_calus, CS8 | CSTOPB | STD_FLG,
- {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0},
+ {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 1, 0, 0},
{"calr", "Calcomp UltraSlate - relative mode",
"", M_calus_rel, I_calus, CS8 | CSTOPB | STD_FLG,
- {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0},
+ {0x80, 0x80, 0x80, 0x00}, 6, 6, 0, 0, 0, 0},
{"etouch", "EloTouch touch-screens (only button-1 events, by now)",
"", M_etouch, I_etouch, STD_FLG,
- {0xFF, 0x55, 0xFF, 0x54}, 7, 1, 0, 1, NULL},
+ {0xFF, 0x55, 0xFF, 0x54}, 7, 1, 0, 1, NULL, 0},
#ifdef HAVE_LINUX_INPUT_H
{"evdev", "Linux Event Device",
"", M_evdev, I_empty, STD_FLG,
- {0x00, 0x00, 0x00, 0x00} , 16, 16, 0, 0, NULL},
+ {0x00, 0x00, 0x00, 0x00} , 16, 16, 0, 0, NULL, 0},
#endif /* HAVE_LINUX_INPUT_H */
{"exps2", "IntelliMouse Explorer (ps2) - 3 buttons, wheel unused",
"ExplorerPS/2", M_imps2, I_exps2, STD_FLG,
- {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0},
+ {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, 0},
#ifdef HAVE_LINUX_JOYSTICK_H
{"js", "Joystick mouse emulation",
"Joystick", M_js, NULL, 0,
- {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0},
+ {0xFC, 0x00, 0x00, 0x00}, 12, 12, 0, 0, 0, 0},
#endif
{"genitizer", "\"Genitizer\" tablet, in relative mode.",
"", M_geni, I_serial, CS8|PARENB|PARODD,
- {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0},
+ {0x80, 0x80, 0x00, 0x00}, 3, 1, 0, 0, 0, 0},
{"gunze", "Gunze touch-screens (only button-1 events, by now)",
"", M_gunze, I_gunze, STD_FLG,
- {0xF9, 0x50, 0xF0, 0x30}, 11, 1, 0, 1, NULL},
+ {0xF9, 0x50, 0xF0, 0x30}, 11, 1, 0, 1, NULL, 0},
{"imps2","Microsoft Intellimouse (ps2)-autodetect 2/3 buttons,wheel unused",
"", M_imps2, I_imps2, STD_FLG,
- {0xC0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, R_imps2},
+ {0xC0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, R_imps2, 1},
{"logi", "Used in some Logitech devices (only serial).",
"Logitech", M_logi, I_logi, CS8 | CSTOPB | STD_FLG,
- {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0},
+ {0xe0, 0x80, 0x80, 0x00}, 3, 3, 0, 0, 0, 0},
{"logim", "Turn logitech into Mouse-Systems-Compatible.",
"", M_logimsc, I_serial, CS8 | CSTOPB | STD_FLG,
- {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0},
+ {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, 0, 0},
{"mm", "MM series. Probably an old protocol...",
"MMSeries", M_mm, I_serial, CS8 | PARENB|PARODD | STD_FLG,
- {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0},
+ {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0, 0},
{"ms3", "Microsoft Intellimouse (serial) - 3 buttons, wheel unused",
"", M_ms3, I_pnp, CS7 | STD_FLG,
- {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3},
+ {0xc0, 0x40, 0xc0, 0x00}, 4, 1, 0, 0, R_ms3, 0},
{"ms+", "Like 'ms', but allows dragging with the middle button.",
"", M_ms_plus, I_serial, CS7 | STD_FLG,
- {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0},
{"ms+lr", "'ms+', but you can reset m by pressing lr (see man page).",
"", M_ms_plus_lr, I_serial, CS7 | STD_FLG,
- {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0},
{"msc", "Mouse-Systems-Compatible (5bytes). Most 3-button mice.",
"MouseSystems", M_msc, I_serial, CS8 | CSTOPB | STD_FLG,
- {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc},
+ {0xf8, 0x80, 0x00, 0x00}, 5, 1, 0, 0, R_msc, 0},
{"mtouch", "MicroTouch touch-screens (only button-1 events, by now)",
"", M_mtouch, I_mtouch, STD_FLG,
- {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL},
+ {0x80, 0x80, 0x80, 0x00}, 5, 1, 0, 1, NULL, 0},
{"ncr", "Ncr3125pen, found on some laptops",
"", M_ncr, NULL, STD_FLG,
- {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0},
+ {0x08, 0x08, 0x00, 0x00}, 7, 7, 0, 1, 0, 0},
{"netmouse","Genius NetMouse (ps2) - 2 buttons and 2 buttons 'up'/'down'.",
"", M_netmouse, I_netmouse, CS7 | STD_FLG,
- {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0},
+ {0xc0, 0x00, 0x00, 0x00}, 4, 1, 0, 0, 0, 1},
{"pnp", "Plug and pray. New mice may not run with '-t ms'.",
"", M_bare, I_pnp, CS7 | STD_FLG,
- {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 3, 1, 0, 0, 0, 0},
{"ps2", "Busmice of the ps/2 series. Most busmice, actually.",
"PS/2", M_ps2, I_ps2, STD_FLG,
- {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, R_ps2},
+ {0xc0, 0x00, 0x00, 0x00}, 3, 1, 0, 0, R_ps2, 1},
{"sun", "'msc' protocol, but only 3 bytes per packet.",
"", M_sun, I_serial, CS8 | CSTOPB | STD_FLG,
- {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, R_sun},
+ {0xf8, 0x80, 0x00, 0x00}, 3, 1, 0, 0, R_sun, 0},
{"summa", "Summagraphics or Genius tablet absolute mode(MM-Series)",
"", M_summa, I_summa, STD_FLG,
- {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_summa},
+ {0x80, 0x80, 0x00, 0x00}, 5, 1, 0, 1, R_summa, 0},
{"syn", "The \"Synaptics\" serial TouchPad.",
"synaptics", M_synaptics_serial, I_serial, CS7 | STD_FLG,
- {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0},
+ {0x40, 0x40, 0x40, 0x00}, 6, 6, 1, 0, 0, 0},
{"synps2", "The \"Synaptics\" PS/2 TouchPad",
"synaptics_ps2", M_synaptics_ps2, I_synps2, STD_FLG,
- {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0},
+ {0x80, 0x80, 0x00, 0x00}, 6, 1, 1, 0, 0, 1},
{"twid", "Twidddler keyboard",
"", M_twid, I_twid, CS8 | STD_FLG,
- {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0},
+ {0x80, 0x00, 0x80, 0x80}, 5, 1, 0, 0, 0, 0},
{"vsxxxaa", "The DEC VSXXX-AA/GA serial mouse on DEC workstations.",
"", M_vsxxx_aa, I_serial, CS8 | PARENB | PARODD | STD_FLG,
- {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0},
+ {0xe0, 0x80, 0x80, 0x00}, 3, 1, 0, 0, 0, 0},
{"wacom","Wacom Protocol IV Tablets: Pen+Mouse, relative+absolute mode",
"", M_wacom, I_wacom, STD_FLG,
- {0x80, 0x80, 0x80, 0x00}, 7, 1, 0, 0, 0},
+ {0x80, 0x80, 0x80, 0x00}, 7, 1, 0, 0, 0, 0},
{"wp", "Genius WizardPad tablet",
"wizardpad", M_wp, I_wp, STD_FLG,
- {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0},
+ {0xFA, 0x42, 0x00, 0x00}, 10, 1, 0, 1, 0, 0},
{"", "",
"", NULL, NULL, 0,
- {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0}
+ {0x00, 0x00, 0x00, 0x00}, 0, 0, 0, 0, 0, 0}
};
/*------------------------------------------------------------------------*/
Index: src/daemon/getmousedata.c
===================================================================
--- src/daemon/getmousedata.c.orig 2010-09-08 18:11:41.925698527 +0200
+++ src/daemon/getmousedata.c 2010-09-08 18:39:50.210572313 +0200
@@ -33,25 +33,58 @@
* fetch the actual device data from the mouse device, dependent on
* what Gpm_Type is being passed.
*-------------------------------------------------------------------*/
-char *getMouseData(int fd, Gpm_Type *type, int kd_mode)
+char *getMouseData(int fd, Gpm_Type *type, int kd_mode,
+ unsigned char *save_byte , int *is_save_byte, int *restart)
{
static unsigned char data[32]; /* quite a big margin :) */
char *edata=data+type->packetlen;
int howmany=type->howmany;
+ int preread;
int i,j;
/*....................................... read and identify one byte */
if (read(fd, data, howmany)!=howmany) {
- if (opt_test) exit(0);
- gpm_report(GPM_PR_ERR,GPM_MESS_READ_FIRST, strerror(errno));
- return NULL;
+ preread = 0;
+ if (*is_save_byte) {
+ /* one byte is saved, howmany must be 1 otherwise this
+ byte hasn't been saved */
+ data[0] = *save_byte;
+ *is_save_byte = 0;
+ preread = 1;
+ } else {
+ if ((preread = read(fd, data, howmany))!=howmany) {
+ if (opt_test) exit(0);
+ gpm_report(GPM_PR_ERR,GPM_MESS_READ_FIRST, strerror(errno));
+ return NULL;
+ }
+ }
+ }
+
+ /* try to find sequence AA 00 which is generated by kernel-2.4.9 or higher
+ when PS/2 mouse was replugged */
+ if (((which_mouse->m_type)->isPS2 == 1) && (data[0] == 0xaa)) {
+ if (preread == 1) {
+ // read second byte
+ if (read(fd, &(data[1]),1) == 1)
+ preread += 1;
+ }
+ if ((preread >= 2) && (data[1] == 0x0)) {
+ gpm_report(GPM_PR_DEBUG,GPM_MESS_REPLUGGED);
+ *restart = 1;
+ return NULL;
+ }
}
if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep)
write(fifofd, data, howmany);
if ((data[0]&((which_mouse->m_type)->proto)[0]) != ((which_mouse->m_type)->proto)[1]) {
+ if (preread > howmany) {
+ /* second byte was involuntary preread in test for PS/2 replugging */
+ *save_byte = data[1];
+ *is_save_byte = 1;
+ }
if ((which_mouse->m_type)->getextra == 1) {
data[1]=GPM_EXTRA_MAGIC_1; data[2]=GPM_EXTRA_MAGIC_2;
gpm_report(GPM_PR_DEBUG,GPM_EXTRA_DATA,data[0]);
@@ -68,13 +101,20 @@ char *getMouseData(int fd, Gpm_Type *typ
* tried ps2 with the original selection package, which called usleep()
*/
- if((i=(which_mouse->m_type)->packetlen-howmany)) /* still to get */
+ if((i=(which_mouse->m_type)->packetlen-preread) > 0) { /* still to get */
do {
j = read(fd,edata-i,howmany); /* edata is pointer just after data */
if (kd_mode!=KD_TEXT && fifofd != -1 && opt_rawrep && j > 0)
write(fifofd, edata-i, j);
i -= j;
} while (i && j);
+ } else {
+ if (preread > (which_mouse->m_type)->packetlen) {
+ /* second byte was involuntary preread in test for PS/2 replugging */
+ *save_byte = data[1];
+ *is_save_byte = 1;
+ }
+ }
if (i) {
gpm_report(GPM_PR_ERR,GPM_MESS_READ_REST, strerror(errno));
Index: src/daemon/gpm.c
===================================================================
--- src/daemon/gpm.c.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/daemon/gpm.c 2010-09-08 18:38:23.256288409 +0200
@@ -73,7 +73,8 @@ struct mouse_features mouse_table[3] = {
DEF_TIME, DEF_CLUSTER, DEF_THREE, DEF_GLIDEPOINT_TAP,
(char *)NULL /* extra */,
(Gpm_Type *)NULL,
- -1
+ -1,
+ 0, 0 /* save byte, is_save_byte */
}
};
struct mouse_features *which_mouse;
Index: src/daemon/old_main.c
===================================================================
--- src/daemon/old_main.c.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/daemon/old_main.c 2010-09-08 19:34:22.279958939 +0200
@@ -37,6 +37,38 @@
#define max(a,b) ((a)>(b) ? (a) : (b))
#endif
+static inline void initMouse(int i, int *fd, int *maxfd)
+{
+ which_mouse=mouse_table+i; /* used to access options */
+
+ if (!(which_mouse->opt_dev))
+ gpm_report(GPM_PR_OOPS,GPM_MESS_NEED_MDEV);
+
+ if(!strcmp((which_mouse->opt_dev),"-"))
+ *fd=0; /* use stdin */
+ else if( (*fd=open((which_mouse->opt_dev),O_RDWR | O_NDELAY)) < 0)
+ gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN,(which_mouse->opt_dev));
+
+ /* and then reset the flag */
+ fcntl(*fd,F_SETFL,fcntl(*fd,F_GETFL) & ~O_NDELAY);
+
+ /* create argc and argv for this device */
+ mouse_argv[i] = build_argv((which_mouse->opt_type),
+ (which_mouse->opt_options),
+ &mouse_argc[i], ',');
+
+ /* init the device, and use the return value as new mouse type */
+ if ((which_mouse->m_type)->init)
+ (which_mouse->m_type)=((which_mouse->m_type)->init)(*fd, (which_mouse->m_type)->flags,
+ (which_mouse->m_type),
+ mouse_argc[i], mouse_argv[i]);
+
+ if (!(which_mouse->m_type)) gpm_report(GPM_PR_OOPS,GPM_MESS_MOUSE_INIT);
+
+ which_mouse->fd=*fd;
+ *maxfd=max(*fd, *maxfd);
+}
+
int old_main()
{
@@ -48,30 +80,8 @@ int old_main()
int pending;
Gpm_Event event;
- for (i = 1; i <= 1+opt_double; i++) {
- which_mouse=mouse_table+i; /* used to access options */
-
- if (!(which_mouse->opt_dev)) gpm_report(GPM_PR_OOPS,GPM_MESS_NEED_MDEV);
-
- if(!strcmp((which_mouse->opt_dev),"-")) fd=0; /* use stdin */
- else if( (fd=open((which_mouse->opt_dev),O_RDWR | O_NDELAY)) < 0)
- gpm_report(GPM_PR_OOPS,GPM_MESS_OPEN,(which_mouse->opt_dev));
-
- /* and then reset the flag */
- fcntl(fd,F_SETFL,fcntl(fd,F_GETFL) & ~O_NDELAY);
-
- /* create argc and argv for this device */
- mouse_argv[i] = build_argv((which_mouse->opt_type), (which_mouse->opt_options), &mouse_argc[i], ',');
-
- /* init the device, and use the return value as new mouse type */
- if ((which_mouse->m_type)->init)
- (which_mouse->m_type)=((which_mouse->m_type)->init)(fd, (which_mouse->m_type)->flags, (which_mouse->m_type), mouse_argc[i],
- mouse_argv[i]);
- if (!(which_mouse->m_type)) gpm_report(GPM_PR_OOPS,GPM_MESS_MOUSE_INIT);
-
- which_mouse->fd=fd;
- maxfd=max(fd, maxfd);
- }
+ for (i = 1; i <= 1+opt_double; i++)
+ initMouse(i, &fd, &maxfd);
/*....................................... catch interesting signals */
@@ -184,10 +194,14 @@ int old_main()
*/
for (i=1; i <= 1+opt_double; i++) {
+ int rc;
which_mouse=mouse_table+i; /* used to access options */
if (FD_ISSET(which_mouse->fd,&selSet)) {
FD_CLR(which_mouse->fd,&selSet); pending--;
- if (processMouse(which_mouse->fd, &event, (which_mouse->m_type), kd_mode))
+ rc = processMouse(which_mouse->fd, &event, (which_mouse->m_type),
+ kd_mode, &(which_mouse->save_byte),
+ &(which_mouse->is_save_byte));
+ if (rc > 0) {
/* pass it to the client, if any
* or to the default handler, if any
* or to the selection handler
@@ -196,7 +210,15 @@ int old_main()
(cinfo[event.vc] && do_client(cinfo[event.vc], &event))
|| (cinfo[0] && do_client(cinfo[0], &event))
|| do_selection(&event);
+ } else if (rc == -1) {
+ /* try to reinitialise the mouse */
+ FD_CLR(which_mouse->fd, &selSet);
+ close(which_mouse->fd);
+ initMouse(i, &fd, &maxfd);
+ FD_CLR(which_mouse->fd, &selSet);
+ which_mouse->is_save_byte=0;
}
+ }
}
/*..................... got connection, process it */
Index: src/daemon/processmouse.c
===================================================================
--- src/daemon/processmouse.c.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/daemon/processmouse.c 2010-09-08 18:11:42.105686598 +0200
@@ -40,7 +40,8 @@
(t2.tv_usec-t1.tv_usec)/1000)
-int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode)
+int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode,
+ unsigned char *save_byte, int *is_save_byte)
{
char *data;
static int fine_dx,
@@ -55,6 +56,7 @@ int processMouse(int fd, Gpm_Event *even
static struct timeval tv1={0,0}, tv2; /* tv1==0: first click is single */
static struct timeval timeout={0,0};
fd_set fdSet;
+ int restart;
oldT = event->type;
@@ -78,9 +80,12 @@ int processMouse(int fd, Gpm_Event *even
FD_SET(fd,&fdSet);
do { /* cluster loop */
- if(((data=getMouseData(fd, (which_mouse->m_type), kd_mode)) == NULL)
+ restart = 0;
+ if(((data=getMouseData(fd, (which_mouse->m_type), kd_mode,
+ save_byte,is_save_byte,&restart)) == NULL)
|| ((*((which_mouse->m_type)->fun))(&nEvent,data)==-1) ) {
-
+
+ if (restart) return -1;
if (!i) {
return 0;
} else {
Index: src/headers/daemon.h
===================================================================
--- src/headers/daemon.h.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/headers/daemon.h 2010-09-08 19:26:01.901761337 +0200
@@ -76,6 +76,7 @@ typedef struct Gpm_Type {
/* repeat this event into fd */
int (*repeat_fun)(Gpm_Event *state, int fd);
+ int isPS2; /* 1 for PS/2 mouses, 0 otherwise */
} Gpm_Type;
/* this structure is used to hide the dual-mouse stuff */
@@ -96,6 +97,8 @@ struct mouse_features {
char *opt_options; /* extra textual configuration */
Gpm_Type *m_type;
int fd;
+ unsigned char save_byte;
+ int is_save_byte;
};
/*************************************************************************
@@ -197,7 +200,9 @@ int do_selection(Gpm_Event *event);
void get_console_size(Gpm_Event *ePtr);
int get_data(Gpm_Connect *where, int whence);
-char *getMouseData(int fd, Gpm_Type *type, int kd_mode);
+char *getMouseData(int fd, Gpm_Type *type, int kd_mode,
+ unsigned char *save_byte , int *is_save_byte,
+ int *restart);
int getsym(const unsigned char *p0, unsigned char *res);
void gpm_exited(void);
@@ -207,7 +212,8 @@ int open_console(const int mode);
int old_main();
int processConn(int fd);
-int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode);
+int processMouse(int fd, Gpm_Event *event, Gpm_Type *type, int kd_mode,
+ unsigned char *save_byte, int *is_save_byte);
int processRequest(Gpm_Cinfo *ci, int vc);
int processSpecial(Gpm_Event *event);
Index: src/headers/message.h
===================================================================
--- src/headers/message.h.orig 2009-02-09 10:58:53.000000000 +0100
+++ src/headers/message.h 2010-09-08 18:38:24.516205731 +0200
@@ -65,6 +65,7 @@
#define GPM_MESS_VERSION "gpm " PACKAGE_VERSION
#define GPM_MESS_STARTED "Started gpm successfully. Entered daemon mode."
#define GPM_MESS_KILLED "Killed gpm(%d)."
+#define GPM_MESS_REPLUGGED "Mouse was replugged"
#define GPM_MESS_SKIP_DATA "Skipping a data packet (?)"
#define GPM_MESS_DATA_4 "Data %02x %02x %02x (%02x)"
#define GPM_MESS_NO_MAGIC "No magic"

View File

@ -1,20 +0,0 @@
Index: src/lib/report-lib.c
===================================================================
--- src/lib/report-lib.c.orig 2010-09-08 13:35:23.166173284 +0200
+++ src/lib/report-lib.c 2010-09-08 13:36:23.207409061 +0200
@@ -26,6 +26,7 @@
void gpm_report(int line, char *file, int stat, char *text, ... )
{
+#ifndef QUIET_LIBGPM
char *string = NULL;
int log_level;
va_list ap;
@@ -57,5 +58,7 @@ void gpm_report(int line, char *file, in
va_end(ap);
+#endif /* QUIET_LIBGPM */
+
if(stat == GPM_STAT_OOPS) exit(1); /* may a lib function call exit ???? */
}

File diff suppressed because it is too large Load Diff

26
gpm-weak-wgetch.patch Normal file
View File

@ -0,0 +1,26 @@
--- src/lib/libcurses.c.weak-wgetch 2002-12-24 17:57:16.000000000 -0500
+++ src/lib/libcurses.c 2004-03-22 15:51:24.000000000 -0500
@@ -41,7 +41,12 @@
#endif /* HAVE_NCURSES_CURSES_H */
#endif /* HAVE_NCURSES_H */
-#define GET(win) ((win) ? wgetch(win) : getch())
+/* If win != NULL, it must have been created by ncurses anyway.
+ Avoid circular library dependencies. */
+#pragma weak wgetch
+#pragma weak stdscr
+
+#define GET(win) ((win && wgetch) ? wgetch(win) : getch())
int Gpm_Wgetch(WINDOW *win)
{
--- configure.ac.weak-wgetch 2004-03-22 15:49:51.000000000 -0500
+++ configure.ac 2004-03-22 15:51:24.000000000 -0500
@@ -115,7 +115,7 @@
AC_CHECK_LIB($i, wgetch,,,$TERMLIBS)
else :; fi
done
- SHARED_LIBS="$LIBS $TERMLIBS -lc"
+ SHARED_LIBS="-lc"
LIBS=$SAVELIBS ;;
esac

View File

@ -1,3 +1,9 @@
-------------------------------------------------------------------
Thu Jan 27 16:57:52 CET 2011 - pth@suse.de
- Through out the PS/2 patches that lead to gpm not working.
- Add patches from Fedora.
-------------------------------------------------------------------
Tue Oct 26 16:44:52 UTC 2010 - cristian.rodriguez@opensuse.org

View File

@ -40,15 +40,11 @@ Source2: rcgpm
Source3: sysconfig.mouse-%{name}
Source4: README.SuSE
Source5: baselibs.conf
Source6: inputattach.c
Patch0: gpm-DESTDIR.patch
Patch1: gpm-ps2_command_bytes.patch
Patch2: gpm-ps2_read.patch
Patch3: gpm-ps2_reconnection.patch
Patch4: gpm-syn_conf.patch
Patch5: gpm-silitek.patch
Patch6: gpm-conf.patch
Patch7: gpm-va_arg.patch
Patch8: gpm-quiet_libgpm.patch
Patch9: gpm-no_templates_for_new_multiple_mode.patch
Patch10: gpm-ceil.patch
Patch11: gpm-Gpm_Open.patch
@ -58,6 +54,12 @@ Patch17: gpm-log.patch
Patch18: gpm-glibc210.patch
Patch19: gpm-use_getdtablesize.patch
Patch20: gpm-int_ptr_casts.patch
Patch21: gpm-close-fds.patch
Patch22: gpm-gcc4.3.patch
Patch23: gpm-lib-silent.patch
Patch24: gpm-libtool.patch
Patch25: gpm-multilib.patch
Patch26: gpm-weak-wgetch.patch
BuildRoot: %{_tmppath}/%{name}-%{version}-build
PreReq: %install_info_prereq
@ -86,14 +88,9 @@ Development files for the gpm (general purpose mouse) package.
%prep
%setup -q
%patch0
%patch1
%patch2
%patch3
%patch4
%patch5
%patch6
%patch7
%patch8
%patch9
%patch10
%patch11
@ -103,7 +100,12 @@ Development files for the gpm (general purpose mouse) package.
%patch18
%patch19
%patch20
%patch21
%patch22
%patch23
%patch24
%patch25
%patch26
cp %{S:2} %{S:3} %{S:4} .
%build
@ -117,10 +119,11 @@ CFLAGS="$RPM_OPT_FLAGS -DQUIET_LIBGPM" \
%ifarch %arm
make CC="gcc -lm"
%endif
make
make %{?_smp_mflags}
%__cc %{optflags} -o inputattach %{SOURCE6}
%install
make ROOT="" DESTDIR=$RPM_BUILD_ROOT install
%makeinstall ROOT=""
#
# gpm confings
install -d $RPM_BUILD_ROOT/etc/${file/conf\/gpm-/gpm\/}
@ -138,6 +141,7 @@ done
install -m 755 -d $RPM_BUILD_ROOT/var/adm/fillup-templates
install -m 755 -d $RPM_BUILD_ROOT/etc/init.d
install -m 755 -d $RPM_BUILD_ROOT/usr/sbin
install -m 755 inputattach %{buildroot}%{_sbindir}
install -m 644 sysconfig.mouse-%{name} $RPM_BUILD_ROOT/var/adm/fillup-templates
install -m 755 rcgpm $RPM_BUILD_ROOT/etc/init.d/gpm
ln -sf ../../etc/init.d/gpm $RPM_BUILD_ROOT/usr/sbin/rcgpm

475
inputattach.c Normal file
View File

@ -0,0 +1,475 @@
/*
* $Id: inputattach.c,v 1.2 2007/04/02 14:18:54 tjanouse Exp $
*
* Copyright (c) 1999-2000 Vojtech Pavlik
*
* Sponsored by SuSE
*
* Twiddler support Copyright (c) 2001 Arndt Schoenewald
* Sponsored by Quelltext AG (http://www.quelltext-ag.de), Dortmund, Germany
*/
/*
* Input line discipline attach program
*/
/*
* 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
*
* Should you need to contact me, the author, you can do so either by
* e-mail - mail your message to <vojtech@ucw.cz>, or by paper mail:
* Vojtech Pavlik, Simunkova 1594, Prague 8, 182 00 Czech Republic
*/
#include <linux/serio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <string.h>
#include <assert.h>
#include <ctype.h>
int readchar(int fd, unsigned char *c, int timeout)
{
struct timeval tv;
fd_set set;
tv.tv_sec = 0;
tv.tv_usec = timeout * 1000;
FD_ZERO(&set);
FD_SET(fd, &set);
if (!select(fd+1, &set, NULL, NULL, &tv)) return -1;
if (read(fd, c, 1) != 1) return -1;
return 0;
}
void setline(int fd, int flags, int speed)
{
struct termios t;
tcgetattr(fd, &t);
t.c_cflag = flags | CREAD | HUPCL | CLOCAL;
t.c_iflag = IGNBRK | IGNPAR;
t.c_oflag = 0;
t.c_lflag = 0;
t.c_cc[VMIN ] = 1;
t.c_cc[VTIME] = 0;
cfsetispeed(&t, speed);
cfsetospeed(&t, speed);
tcsetattr(fd, TCSANOW, &t);
}
int logitech_command(int fd, char *c)
{
int i;
unsigned char d;
for (i = 0; c[i]; i++) {
write(fd, c + i, 1);
if (readchar(fd, &d, 1000))
return -1;
if (c[i] != d)
return -1;
}
return 0;
}
int magellan_init(int fd, long *id, long *extra)
{
write(fd, "m3\rpBB\rz\r", 9);
return 0;
}
int warrior_init(int fd, long *id, long *extra)
{
if (logitech_command(fd, "*S")) return -1;
setline(fd, CS8, B4800);
return 0;
}
int spaceball_waitchar(int fd, unsigned char c, unsigned char *d, int timeout)
{
unsigned char b = 0;
while (!readchar(fd, &b, timeout)) {
if (b == 0x0a) continue;
*d++ = b;
if (b == c) break;
}
*d = 0;
return -(b != c);
}
int spaceball_waitcmd(int fd, char c, char *d)
{
int i;
for (i = 0; i < 8; i++) {
if (spaceball_waitchar(fd, 0x0d, d, 1000))
return -1;
if (d[0] == c)
return 0;
}
return -1;
}
int spaceball_cmd(int fd, char *c, char *d)
{
int i;
for (i = 0; c[i]; i++)
write(fd, c + i, 1);
write(fd, "\r", 1);
i = spaceball_waitcmd(fd, toupper(c[0]), d);
return i;
}
#define SPACEBALL_1003 1
#define SPACEBALL_2003B 3
#define SPACEBALL_2003C 4
#define SPACEBALL_3003C 7
#define SPACEBALL_4000FLX 8
#define SPACEBALL_4000FLX_L 9
int spaceball_init(int fd, long *id, long *extra)
{
char r[64];
if (spaceball_waitchar(fd, 0x11, r, 4000) ||
spaceball_waitchar(fd, 0x0d, r, 1000))
return -1;
if (spaceball_waitcmd(fd, '@', r))
return -1;
if (strncmp("@1 Spaceball alive", r, 18))
return -1;
if (spaceball_waitcmd(fd, '@', r))
return -1;
if (spaceball_cmd(fd, "hm", r))
return -1;
if (!strncmp("Hm2003B", r, 7))
*id = SPACEBALL_2003B;
if (!strncmp("Hm2003C", r, 7))
*id = SPACEBALL_2003C;
if (!strncmp("Hm3003C", r, 7))
*id = SPACEBALL_3003C;
if (!strncmp("HvFirmware", r, 10)) {
if (spaceball_cmd(fd, "\"", r))
return -1;
if (strncmp("\"1 Spaceball 4000 FLX", r, 21))
return -1;
if (spaceball_waitcmd(fd, '"', r))
return -1;
if (strstr(r, " L "))
*id = SPACEBALL_4000FLX_L;
else
*id = SPACEBALL_4000FLX;
if (spaceball_waitcmd(fd, '"', r))
return -1;
if (spaceball_cmd(fd, "YS", r))
return -1;
if (spaceball_cmd(fd, "M", r))
return -1;
return 0;
}
if (spaceball_cmd(fd, "P@A@A", r) ||
spaceball_cmd(fd, "FT@", r) ||
spaceball_cmd(fd, "MSS", r))
return -1;
return 0;
}
int stinger_init(int fd, long *id, long *extra)
{
int i;
unsigned char c;
unsigned char *response = "\r\n0600520058C272";
if (write(fd, " E5E5", 5) != 5) /* Enable command */
return -1;
for (i = 0; i < 16; i++) /* Check for Stinger */
if (readchar(fd, &c, 200) || (c != response[i]))
return -1;
return 0;
}
int mzp_init(int fd, long *id, long *extra)
{
if (logitech_command(fd, "*X*q")) return -1;
setline(fd, CS8, B9600);
return 0;
}
int newton_init(int fd, long *id, long *extra)
{
int i;
unsigned char c;
unsigned char response[35] =
{ 0x16, 0x10, 0x02, 0x64, 0x5f, 0x69, 0x64, 0x00,
0x00, 0x00, 0x0c, 0x6b, 0x79, 0x62, 0x64, 0x61,
0x70, 0x70, 0x6c, 0x00, 0x00, 0x00, 0x01, 0x6e,
0x6f, 0x66, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x10,
0x03, 0xdd, 0xe7 };
for (i = 0; i < 35; i++)
if (readchar(fd, &c, 400) || (c != response[i]))
return -1;
return 0;
}
int twiddler_init(int fd, long *id, long *extra)
{
unsigned char c[10];
int count, line;
/* Turn DTR off, otherwise the Twiddler won't send any data. */
if (ioctl(fd, TIOCMGET, &line)) return -1;
line &= ~TIOCM_DTR;
if (ioctl(fd, TIOCMSET, &line)) return -1;
/* Check whether the device on the serial line is the Twiddler.
*
* The Twiddler sends data packets of 5 bytes which have the following
* properties: the MSB is 0 on the first and 1 on all other bytes, and
* the high order nibble of the last byte is always 0x8.
*
* We read and check two of those 5 byte packets to be sure that we
* are indeed talking to a Twiddler. */
/* Read at most 5 bytes until we find one with the MSB set to 0 */
for (count = 0; count < 5; count++) {
if (readchar(fd, c+0, 500)) return -1;
if ((c[0] & 0x80) == 0) break;
}
if (count == 5) {
/* Could not find header byte in data stream */
return -1;
}
/* Read remaining 4 bytes plus the full next data packet */
for (count = 1; count < 10; count++) {
if (readchar(fd, c+count, 500)) return -1;
}
/* Check whether the bytes of both data packets obey the rules */
for (count = 1; count < 10; count++) {
if ((count % 5 == 0 && (c[count] & 0x80) != 0)
|| (count % 5 == 4 && (c[count] & 0xF0) != 0x80)
|| (count % 5 != 0 && (c[count] & 0x80) != 0x80)) {
/* Invalid byte in data packet */
return -1;
}
}
return 0;
}
int dump_init(int fd, long *id, long *extra)
{
unsigned char c, o = 0;
c = 0x80;
if (write(fd, &c, 1) != 1) /* Enable command */
return -1;
while (1)
if (!readchar(fd, &c, 1)) {
printf("%02x (%c) ", c, ((c > 32) && (c < 127)) ? c : 'x');
o = 1;
} else {
if (o) {
printf("\n");
o = 0;
}
}
}
struct input_types {
char name[16];
char name2[16];
int speed;
int flags;
unsigned long type;
unsigned long id;
unsigned long extra;
int flush;
int (*init)(int fd, long *id, long *extra);
};
struct input_types input_types[] = {
{ "--sunkbd", "-skb", B1200, CS8, SERIO_SUNKBD, 0, 0, 1, NULL },
{ "--lkkbd", "-lk", B4800, CS8|CSTOPB, SERIO_LKKBD, 0, 0, 1, NULL },
{ "--vsxxx-aa", "-vs", B4800, CS8|CSTOPB|PARENB|PARODD,SERIO_VSXXXAA, 0, 0, 1, NULL },
{ "--spaceorb", "-orb", B9600, CS8, SERIO_SPACEORB, 0, 0, 1, NULL },
{ "--spaceball", "-sbl", B9600, CS8, SERIO_SPACEBALL,0, 0, 0, spaceball_init },
{ "--magellan", "-mag", B9600, CS8 | CSTOPB | CRTSCTS, SERIO_MAGELLAN, 0, 0, 1, magellan_init },
{ "--warrior", "-war", B1200, CS7 | CSTOPB, SERIO_WARRIOR, 0, 0, 1, warrior_init },
{ "--stinger", "-sting", B1200, CS8, SERIO_STINGER, 0, 0, 1, stinger_init },
{ "--mousesystems", "-msc", B1200, CS8, SERIO_MSC, 0, 0x01, 1, NULL },
{ "--sunmouse", "-sun", B1200, CS8, SERIO_SUN, 0, 0x01, 1, NULL },
{ "--microsoft", "-bare", B1200, CS7, SERIO_MS, 0, 0, 1, NULL },
{ "--mshack", "-ms", B1200, CS7, SERIO_MS, 0, 0x01, 1, NULL },
{ "--mouseman", "-mman", B1200, CS7, SERIO_MP, 0, 0x01, 1, NULL },
{ "--intellimouse", "-ms3", B1200, CS7, SERIO_MZ, 0, 0x11, 1, NULL },
{ "--mmwheel", "-mmw", B1200, CS7 | CSTOPB, SERIO_MZP, 0, 0x13, 1, mzp_init },
{ "--iforce", "-ifor", B38400, CS8, SERIO_IFORCE, 0, 0, 0, NULL },
{ "--newtonkbd", "-newt", B9600, CS8, SERIO_NEWTON, 0, 0, 0, newton_init },
{ "--h3600ts", "-ipaq", B115200, CS8, SERIO_H3600, 0, 0, 0, NULL },
{ "--stowawaykbd", "-ipaqkbd", B115200, CS8, SERIO_STOWAWAY, 0, 0, 0, NULL },
{ "--ps2serkbd", "-ps2ser", B1200, CS8, SERIO_PS2SER, 0, 0, 1, NULL },
{ "--twiddler", "-twid", B2400, CS8, SERIO_TWIDKBD, 0, 0, 0, twiddler_init },
{ "--twiddler-joy", "-twidjoy", B2400, CS8, SERIO_TWIDJOY, 0, 0, 0, twiddler_init },
{ "--elotouch", "-elo", B9600, CS8 | CRTSCTS, SERIO_ELO, 0, 0, 0, NULL },
{ "--elo4002", "-elo6b", B9600, CS8 | CRTSCTS, SERIO_ELO, 1, 0, 0, NULL },
{ "--elo271-140", "-elo4b", B9600, CS8 | CRTSCTS, SERIO_ELO, 2, 0, 0, NULL },
{ "--elo261-280", "-elo3b", B9600, CS8 | CRTSCTS, SERIO_ELO, 3, 0, 0, NULL },
{ "--dump", "-dump", B2400, CS8, 0, 0, 0, 0, dump_init },
{ "", "", 0, 0 }
};
int main(int argc, char **argv)
{
unsigned long devt;
int ldisc;
int type;
long id, extra;
int fd;
char c;
if (argc < 2 || argc > 4 || (argc == 4 && strcmp(argv[3], "--daemon")) || !strcmp("--help", argv[1])) {
puts("");
puts("Usage: inputttach <mode> <device>");
puts("");
puts("Modes:");
puts(" --sunkbd -skb Sun Type 4 and Type 5 keyboards");
puts(" --lkkbd -lk DEC LK201 / LK401 keyboards");
puts(" --vsxxx-aa -vs DEC VSXXX-AA / VSXXX-GA mouse and VSXXX-AB tablet");
puts(" --spaceorb -orb SpaceOrb 360 / SpaceBall Avenger");
puts(" --spaceball -sbl SpaceBall 2003 / 3003 / 4000 FLX");
puts(" --magellan -mag Magellan / SpaceMouse");
puts(" --warrior -war WingMan Warrior");
puts(" --stinger -stng Gravis Stinger");
puts(" --mousesystems -msc 3-button Mouse Systems mice");
puts(" --sunmouse -sun 3-button Sun mice");
puts(" --microsoft -bare 2-button Microsoft mice");
puts(" --mshack -ms 3-button mice in Microsoft mode");
puts(" --mouseman -mman 3-button Logitech and Genius mice");
puts(" --intellimouse -ms3 Microsoft IntelliMouse");
puts(" --mmwheel -mmw Logitech mice with 4-5 buttons or wheel");
puts(" --iforce -ifor I-Force joysticks and wheels");
puts(" --h3600ts -ipaq Ipaq h3600 touchscreen");
puts(" --stowawaykbd -ipaqkbd Stowaway keyboard");
puts(" --ps2serkbd -ps2ser PS/2 via serial keyboard");
puts(" --twiddler -twid Handykey Twiddler chording keyboard");
puts(" --twiddler-joy -twidjoy Handykey Twiddler used as a joystick");
puts("");
return 1;
}
for (type = 0; input_types[type].speed; type++) {
if (!strncasecmp(argv[1], input_types[type].name, 16) ||
!strncasecmp(argv[1], input_types[type].name2, 16))
break;
}
if (!input_types[type].speed) {
fprintf(stderr, "inputattach: invalid mode\n");
return 1;
}
if ((fd = open(argv[2], O_RDWR | O_NOCTTY | O_NONBLOCK)) < 0) {
perror("inputattach");
return 1;
}
setline(fd, input_types[type].flags, input_types[type].speed);
if (input_types[type].flush)
while (!readchar(fd, &c, 100));
id = input_types[type].id;
extra = input_types[type].extra;
if (input_types[type].init && input_types[type].init(fd, &id, &extra)) {
fprintf(stderr, "inputattach: device initialization failed\n");
return 1;
}
ldisc = N_MOUSE;
if(ioctl(fd, TIOCSETD, &ldisc)) {
fprintf(stderr, "inputattach: can't set line discipline\n");
return 1;
}
devt = input_types[type].type | (id << 8) | (extra << 16);
if(ioctl(fd, SPIOCSTYPE, &devt)) {
fprintf(stderr, "inputattach: can't set device type\n");
return 1;
}
if (argc == 4 && !strcmp(argv[3],"--daemon"))
daemon(0,0);
read(fd, NULL, 0);
ldisc = 0;
ioctl(fd, TIOCSETD, &ldisc);
close(fd);
return 0;
}