ioctl() και πιθανή ανάγκη ανανέωσης των man pages
Giorgos Keramidas
keramida at ceid.upatras.gr
Tue Jun 20 16:31:42 EEST 2006
On 2006-06-20 15:47, Panagiotis Atmatzidis <p.atmatzidis at gmail.com> wrote:
>Giorgos Keramidas wrote:
>> Γιατί να χάνει χρόνο κανείς με τέτοιες μπούρδες όταν υπάρχουν
>> λειτουργικά συστήματα που οι developers αλληλοελέγχονται όταν γίνεται
>> commit κώδικας χωρίς να ενημερώνεται το manpage;
>
> Γιατί δεν γουστάρει το Free Riding? (Βλέπε GPL vs BSD)
Ναι, βέβαια. Επειδή είναι καλύτερα να χαίρεσαι που είναι GPL'd το
manpage που λέει:
,--------------------------------------------------------------
| revdep-rebuild (1) Nov 2003 gentoolkit
|
| NAME
| revdep-rebuild - Gentoo: Reverse dependency rebuilder
|
| SYNOPSIS
| revdep-rebuild
|
| BUGS
| This tool does not yet have a man page. Feel free to
| submit a bug about it to http://bugs.gentoo.org
|
| AUTHORS
| This informative man page was written by Karl Trygve
| Kalleberg <karltk at gentoo.org>.
`--------------------------------------------------------------
Αυτό το manpage _δεν_ είναι informative. Καλό το αστείο, αλλά όταν
πρέπει να κάνει σοβαρή δουλειά ο κόσμος χρειάζεται authoritative
references, όπως το:
http://www.freebsd.org/cgi/man.cgi?query=tty&sektion=4&apropos=0&manpath=FreeBSD+6.1-RELEASE
Επίσης, σε manpages δεν θα έπρεπε να υπάρχουν τόσο προχειρογραμμένα
παραδείγματα όπως αυτό του αρχικού post, γιατί δίνουν το κακό παράδειγμα
στους νέους προγραμματιστές, οι οποίοι πολύ πιθανόν να αντιγράψουν το
στυλ που έχει το manpage με ολέθριες συνέπειες για το portability των
προγραμμάτων τους αργότερα.
Ενα *ΣΩΣΤΟ* παράδειγμα για tty flags θα 'πρεπε να είναι κάπως έτσι:
1 #include <sys/types.h>
2
3 #include <sys/ioctl.h>
4 #include <sys/stat.h>
5
6 #include <errno.h>
7 #include <fcntl.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <string.h>
11 #include <termios.h>
12 #include <unistd.h>
13
14 #ifndef SERIAL
15 #define SERIAL "/dev/ttyS0"
16 #endif
17
18 /*
19 * Print the state bits of a terminal line.
20 *
21 * From the tty(4) manpage of FreeBSD:
22 *
23 * TIOCMSET int *state
24 * The integer pointed to by state contains bits that
25 * correspond to modem state. Following is a list of defined
26 * variables and the modem state they represent:
27 *
28 * TIOCM_LE Line Enable.
29 * TIOCM_DTR Data Terminal Ready.
30 * TIOCM_RTS Request To Send.
31 * TIOCM_ST Secondary Transmit.
32 * TIOCM_SR Secondary Receive.
33 * TIOCM_CTS Clear To Send.
34 * TIOCM_CAR Carrier Detect.
35 * TIOCM_CD Carrier Detect (synonym).
36 * TIOCM_RNG Ring Indication.
37 * TIOCM_RI Ring Indication (synonym).
38 * TIOCM_DSR Data Set Ready.
39 *
40 * This call sets the terminal modem state to that represented
41 * by state. Not all terminals may support this.
42 *
43 * TIOCMGET int *state
44 * Return the current state of the terminal modem lines as
45 * represented above in the integer pointed to by state.
46 */
47
48 struct tty_flag {
49 int tf_mask; /* TIOCM_LE, ... */
50 const char *tf_name; /* Short flag name */
51 const char *tf_desc; /* Long flag description */
52 };
53
54 struct tty_flag flags[] = {
55 #ifdef TIOCM_LE
56 { TIOCM_LE, "TIOCM_LE", "Line Enable", },
57 #endif
58 #ifdef TIOCM_DTR
59 { TIOCM_DTR, "TIOCM_DTR", "Data Terminal Ready", },
60 #endif
61 #ifdef TIOCM_RTS
62 { TIOCM_RTS, "TIOCM_RTS", "Request To Send", },
63 #endif
64 #ifdef TIOCM_ST
65 { TIOCM_ST, "TIOCM_ST", "Secondary Transmit", },
66 #endif
67 #ifdef TIOCM_SR
68 { TIOCM_SR, "TIOCM_SR", "Secondary Receive", },
69 #endif
70 #ifdef TIOCM_CTS
71 { TIOCM_CTS, "TIOCM_CTS", "Clear To Send", },
72 #endif
73 #ifdef TIOCM_CAR
74 { TIOCM_CAR, "TIOCM_CAR", "Carrier Detect", },
75 #endif
76 #ifdef TIOCM_CD
77 { TIOCM_CD, "TIOCM_CD", "Carrier Detect (synonym)", },
78 #endif
79 #ifdef TIOCM_RING
80 { TIOCM_RNG, "TIOCM_RNG", "Ring Indication", },
81 #endif
82 #ifdef TIOCM_RI
83 { TIOCM_RI, "TIOCM_RI", "Ring Indication (synonym)", },
84 #endif
85 #ifdef TIOCM_DSR
86 { TIOCM_DSR, "TIOCM_DSR", "Data Set Ready", },
87 #endif
88 { 0, NULL, NULL, },
89 };
90
91 int
92 main(void)
93 {
94 int fd, serial;
95 struct tty_flag *tfp;
96
97 if ((fd = open(SERIAL, O_RDONLY, S_IRUSR)) == -1) {
98 fprintf(stderr, "open: %s: error: %s\n", SERIAL,
99 strerror(errno));
100 exit(EXIT_FAILURE);
101 }
102 if (ioctl(fd, TIOCMGET, &serial) == -1) {
103 fprintf(stderr, "ioctl: TIOCMGET: fd %d: error: %s", fd,
104 strerror(errno));
105 exit(EXIT_FAILURE);
106 }
107 close(fd);
108
109 for (tfp = flags; tfp != NULL; tfp++) {
110 if (tfp->tf_mask == 0 && tfp->tf_name == NULL &&
111 tfp->tf_desc == NULL)
112 break;
113 printf("%-40s [%-12s]: %s\n",
114 tfp->tf_desc != NULL ? tfp->tf_desc : "Unknown",
115 tfp->tf_name != NULL ? tfp->tf_name : "UNKNOWN",
116 tfp->tf_mask == 0 ? "unknown" :
117 ((tfp->tf_mask & serial) ? "set" : "unset"));
118 }
119 return (EXIT_SUCCESS);
120 }
Ναι, είναι λίγο μεγαλύτερο από το έκτρωμα που έχει τώρα το manpage, αλλά
είναι σαφώς πιο portable, και τυπώνει όλα τα flags του tty κι όχι μόνο
ένα τυχαίο από αυτά, το οποίο ``by the way'' τυχαίνει να είναι πλέον
εντελώς unsupported:
( Solaris )
# uname -a
SunOS kobe 5.10 Generic_118844-28 i86pc i386 i86pc
# cc -Xc -v -xc99=all -DSERIAL=\"/dev/cua0\" -o tt tt.c
# ./a.out
Line Enable [TIOCM_LE ]: unset
Data Terminal Ready [TIOCM_DTR ]: set
Request To Send [TIOCM_RTS ]: set
Secondary Transmit [TIOCM_ST ]: unset
Secondary Receive [TIOCM_SR ]: unset
Clear To Send [TIOCM_CTS ]: unset
Carrier Detect [TIOCM_CAR ]: unset
Carrier Detect (synonym) [TIOCM_CD ]: unset
Ring Indication (synonym) [TIOCM_RI ]: unset
Data Set Ready [TIOCM_DSR ]: unset
( Linux )
# uname -a
Linux olorin 2.4.22-smp #1 SMP Wed Aug 4 11:48:29 EDT 2004 i686 i686 i386 GNU/Linux
# gcc -W -Wall -std=c99 -pedantic -o tt tt.c
# ./tt
Line Enable [TIOCM_LE ]: unset
Data Terminal Ready [TIOCM_DTR ]: set
Request To Send [TIOCM_RTS ]: set
Secondary Transmit [TIOCM_ST ]: unset
Secondary Receive [TIOCM_SR ]: unset
Clear To Send [TIOCM_CTS ]: set
Carrier Detect [TIOCM_CAR ]: unset
Carrier Detect (synonym) [TIOCM_CD ]: unset
Ring Indication (synonym) [TIOCM_RI ]: unset
Data Set Ready [TIOCM_DSR ]: set
( FreeBSD )
# uname -a
FreeBSD gothmog.pc 7.0-CURRENT FreeBSD 7.0-CURRENT #0: Wed Jun 14 14:35:46 EEST 2006\
build at gothmog.pc:/home/build/obj/home/build/src/sys/GOTHMOG i386
# env CFLAGS='-DSERIAL=\"/dev/cuad0\"' make WARNS=6 WFORMAT=2 clean all
cc -DSERIAL=\"/dev/cuad0\" -g -Wsystem-headers -Werror -Wall \
-Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
-Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
-Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls \
-Wformat=2 -Wno-format-extra-args -Werror -c tt.c
cc -DSERIAL=\"/dev/cuad0\" -g -Wsystem-headers -Werror -Wall \
-Wno-format-y2k -W -Wno-unused-parameter -Wstrict-prototypes \
-Wmissing-prototypes -Wpointer-arith -Wreturn-type -Wcast-qual \
-Wwrite-strings -Wswitch -Wshadow -Wcast-align -Wunused-parameter \
-Wchar-subscripts -Winline -Wnested-externs -Wredundant-decls \
-Wformat=2 -Wno-format-extra-args -Werror -o tt tt.o
# ./tt
Line Enable [TIOCM_LE ]: set
Data Terminal Ready [TIOCM_DTR ]: set
Request To Send [TIOCM_RTS ]: set
Secondary Transmit [TIOCM_ST ]: unset
Secondary Receive [TIOCM_SR ]: unset
Clear To Send [TIOCM_CTS ]: unset
Carrier Detect [TIOCM_CAR ]: unset
Carrier Detect (synonym) [TIOCM_CD ]: unset
Ring Indication (synonym) [TIOCM_RI ]: unset
Data Set Ready [TIOCM_DSR ]: unset
#
Οταν φτάσει το Linux να έχει _ΤΕΤΟΙΑ_ manpages, τότε θα έχει αξία η GPL.
Μέχρι τότε, εγώ τουλάχιστον, δε συμβιβάζομαι με ειρωνικές
προχειροδουλειές του στυλ "Αυτή η εξαιρετική αλλά εντελώς άδεια σελίδα
δεν έχει γραφτεί ακόμα... Παράτα μας και άνοιξε bug report" :(
More information about the Linux-greek-users
mailing list