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