tioclinux() numbers in <linux/tiocl.h> ?

From: Samuel Thibault (Samuel.Thibault@ens-lyon.fr)
Date: Sun Jun 08 2003 - 01:54:10 EST


Hi,

Tioclinux() uses "magic numbers" that applications should know to use it.
Here is a patch against 2.5.70-bk12 which adds an include/linux/tiocl.h
which holds them and can be used by applications to properly call
iotcl(TIOCLINUX). It might stand for documentation as well, replacing
the not up-to-date man ioctl_list.

A structure for the selection argument is also defined.

I shortened TIOCLINUX_* into TIOCL_*, maybe is this too short ?

Regards,
Samuel Thibault

diff -urN linux-2.5.70-bk12/include/linux/tiocl.h linux-2.5.70-bk12-perso/include/linux/tiocl.h
--- linux-2.5.70-bk12/include/linux/tiocl.h 1969-12-31 19:00:00.000000000 -0500
+++ linux-2.5.70-bk12-perso/include/linux/tiocl.h 2003-06-08 01:59:59.000000000 -0400
@@ -0,0 +1,38 @@
+#ifndef _LINUX_TIOCL_H
+#define _LINUX_TIOCL_H
+
+#define TIOCL_SETSEL 2 /* set a selection */
+#define TIOCL_SELCHAR 0 /* select characters */
+#define TIOCL_SELWORD 1 /* select whole words */
+#define TIOCL_SELLINE 2 /* select whole lines */
+#define TIOCL_SELPOINTER 3 /* show the pointer */
+#define TIOCL_SELCLEAR 4 /* clear visibility of selection */
+#define TIOCL_SELMOUSEREPORT 16 /* report beginning of selection */
+#define TIOCL_SELBUTTONMASK 15 /* button mask for report */
+/* selection extent */
+struct tiocl_selection {
+ unsigned short xs; /* X start */
+ unsigned short ys; /* Y start */
+ unsigned short xe; /* X end */
+ unsigned short ye; /* Y end */
+ unsigned short sel_mode; /* selection mode */
+};
+
+#define TIOCL_PASTESEL 3 /* paste previous selection */
+#define TIOCL_UNBLANKSCREEN 4 /* unblank screen */
+
+#define TIOCL_SELLOADLUT 5
+ /* set characters to be considered alphabetic when selecting */
+ /* u32[8] bit array, 4 bytes-aligned with type */
+
+/* these two don't return a value: they write it back in the type */
+#define TIOCL_GETSHIFTSTATE 6 /* write shift state */
+#define TIOCL_GETMOUSEREPORTING 7 /* write whether mouse event are reported */
+#define TIOCL_SETVESABLANK 10 /* set vesa blanking mode */
+#define TIOCL_SETKMSGREDIRECT 11 /* restrict kernel messages to a vt */
+#define TIOCL_GETFGCONSOLE 12 /* get foreground vt */
+#define TIOCL_SCROLLCONSOLE 13 /* scroll console */
+#define TIOCL_BLANKSCREEN 14 /* keep screen blank even if a key is pressed */
+#define TIOCL_BLANKEDSCREEN 15 /* return which vt was blanked */
+
+#endif /* _LINUX_TIOCL_H */
diff -urN linux-2.5.70-bk12/drivers/char/selection.c linux-2.5.70-bk12-perso/drivers/char/selection.c
--- linux-2.5.70-bk12/drivers/char/selection.c 2003-06-08 00:03:46.000000000 -0400
+++ linux-2.5.70-bk12-perso/drivers/char/selection.c 2003-06-08 00:38:19.000000000 -0400
@@ -23,6 +23,7 @@
 #include <linux/vt_kern.h>
 #include <linux/consolemap.h>
 #include <linux/selection.h>
+#include <linux/tiocl.h>
 
 #ifndef MIN
 #define MIN(a,b) ((a) < (b) ? (a) : (b))
@@ -111,7 +112,7 @@
 }
 
 /* set the current selection. Invoked by ioctl() or by kernel code. */
-int set_selection(const unsigned long arg, struct tty_struct *tty, int user)
+int set_selection(const struct tiocl_selection *sel, struct tty_struct *tty, int user)
 {
         int sel_mode, new_sel_start, new_sel_end, spc;
         char *bp, *obp;
@@ -120,23 +121,22 @@
 
         poke_blanked_console();
 
- { unsigned short *args, xs, ys, xe, ye;
+ { unsigned short xs, ys, xe, ye;
 
- args = (unsigned short *)(arg + 1);
           if (user) {
- if (verify_area(VERIFY_READ, args, sizeof(short) * 5))
+ if (verify_area(VERIFY_READ, sel, sizeof(*sel)))
                           return -EFAULT;
- __get_user(xs, args++);
- __get_user(ys, args++);
- __get_user(xe, args++);
- __get_user(ye, args++);
- __get_user(sel_mode, args);
+ __get_user(xs, &sel->xs);
+ __get_user(ys, &sel->ys);
+ __get_user(xe, &sel->xe);
+ __get_user(ye, &sel->ye);
+ __get_user(sel_mode, &sel->sel_mode);
           } else {
- xs = *(args++); /* set selection from kernel */
- ys = *(args++);
- xe = *(args++);
- ye = *(args++);
- sel_mode = *args;
+ xs = sel->xs; /* set selection from kernel */
+ ys = sel->ys;
+ xe = sel->xe;
+ ye = sel->ye;
+ sel_mode = sel->sel_mode;
           }
           xs--; ys--; xe--; ye--;
           xs = limit(xs, video_num_columns - 1);
@@ -146,14 +146,14 @@
           ps = ys * video_size_row + (xs << 1);
           pe = ye * video_size_row + (xe << 1);
 
- if (sel_mode == 4) {
+ if (sel_mode == TIOCL_SELCLEAR) {
               /* useful for screendump without selection highlights */
               clear_selection();
               return 0;
           }
 
- if (mouse_reporting() && (sel_mode & 16)) {
- mouse_report(tty, sel_mode & 15, xs, ys);
+ if (mouse_reporting() && (sel_mode & TIOCL_SELMOUSEREPORT)) {
+ mouse_report(tty, sel_mode & TIOCL_SELBUTTONMASK, xs, ys);
               return 0;
           }
         }
@@ -172,11 +172,11 @@
 
         switch (sel_mode)
         {
- case 0: /* character-by-character selection */
+ case TIOCL_SELCHAR: /* character-by-character selection */
                         new_sel_start = ps;
                         new_sel_end = pe;
                         break;
- case 1: /* word-by-word selection */
+ case TIOCL_SELWORD: /* word-by-word selection */
                         spc = isspace(sel_pos(ps));
                         for (new_sel_start = ps; ; ps -= 2)
                         {
@@ -198,12 +198,12 @@
                                         break;
                         }
                         break;
- case 2: /* line-by-line selection */
+ case TIOCL_SELLINE: /* line-by-line selection */
                         new_sel_start = ps - ps % video_size_row;
                         new_sel_end = pe + video_size_row
                                     - pe % video_size_row - 2;
                         break;
- case 3:
+ case TIOCL_SELPOINTER:
                         highlight_pointer(pe);
                         return 0;
                 default:
diff -urN linux-2.5.70-bk12/drivers/char/vt.c linux-2.5.70-bk12-perso/drivers/char/vt.c
--- linux-2.5.70-bk12/drivers/char/vt.c 2003-06-08 00:03:46.000000000 -0400
+++ linux-2.5.70-bk12-perso/drivers/char/vt.c 2003-06-08 02:00:56.000000000 -0400
@@ -90,6 +90,7 @@
 #include <linux/devfs_fs_kernel.h>
 #include <linux/vt_kern.h>
 #include <linux/selection.h>
+#include <linux/tiocl.h>
 #include <linux/kbd_kern.h>
 #include <linux/consolemap.h>
 #include <linux/timer.h>
@@ -2235,21 +2236,21 @@
         ret = 0;
         switch (type)
         {
- case 2:
+ case TIOCL_SETSEL:
                         acquire_console_sem();
- ret = set_selection(arg, tty, 1);
+ ret = set_selection((struct tiocl_selection *)((char *)arg+1), tty, 1);
                         release_console_sem();
                         break;
- case 3:
+ case TIOCL_PASTESEL:
                         ret = paste_selection(tty);
                         break;
- case 4:
+ case TIOCL_UNBLANKSCREEN:
                         unblank_screen();
                         break;
- case 5:
+ case TIOCL_SELLOADLUT:
                         ret = sel_loadlut(arg);
                         break;
- case 6:
+ case TIOCL_GETSHIFTSTATE:
                         
         /*
          * Make it possible to react to Shift+Mousebutton.
@@ -2260,14 +2261,14 @@
                          data = shift_state;
                         ret = __put_user(data, (char *) arg);
                         break;
- case 7:
+ case TIOCL_GETMOUSEREPORTING:
                         data = mouse_reporting();
                         ret = __put_user(data, (char *) arg);
                         break;
- case 10:
+ case TIOCL_SETVESABLANK:
                         set_vesa_blanking(arg);
                         break;;
- case 11: /* set kmsg redirect */
+ case TIOCL_SETKMSGREDIRECT:
                         if (!capable(CAP_SYS_ADMIN)) {
                                 ret = -EPERM;
                         } else {
@@ -2277,10 +2278,10 @@
                                         kmsg_redirect = data;
                         }
                         break;
- case 12: /* get fg_console */
+ case TIOCL_GETFGCONSOLE:
                         ret = fg_console;
                         break;
- case 13: /* scroll console */
+ case TIOCL_SCROLLCONSOLE:
                         if (get_user(lines, (char *)arg+1)) {
                                 ret = -EFAULT;
                         } else {
@@ -2288,11 +2289,11 @@
                                 ret = 0;
                         }
                         break;
- case 14: /* blank screen until explicitly unblanked, not only poked */
+ case TIOCL_BLANKSCREEN: /* until explicitly unblanked, not only poked */
                         ignore_poke = 1;
                         do_blank_screen(0);
                         break;
- case 15: /* which console is blanked ? */
+ case TIOCL_BLANKEDSCREEN:
                         ret = console_blanked;
                         break;
                 default:
diff -urN linux-2.5.70-bk12/include/linux/selection.h linux-2.5.70-bk12-perso/include/linux/selection.h
--- linux-2.5.70-bk12/include/linux/selection.h 2003-05-26 21:00:41.000000000 -0400
+++ linux-2.5.70-bk12-perso/include/linux/selection.h 2003-06-08 00:32:30.000000000 -0400
@@ -7,12 +7,13 @@
 #ifndef _LINUX_SELECTION_H_
 #define _LINUX_SELECTION_H_
 
+#include <linux/tiocl.h>
 #include <linux/vt_buffer.h>
 
 extern int sel_cons;
 
 extern void clear_selection(void);
-extern int set_selection(const unsigned long arg, struct tty_struct *tty, int user);
+extern int set_selection(const struct tiocl_selection *sel, struct tty_struct *tty, int user);
 extern int paste_selection(struct tty_struct *tty);
 extern int sel_loadlut(const unsigned long arg);
 extern int mouse_reporting(void);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Sun Jun 15 2003 - 22:00:18 EST