]> rtime.felk.cvut.cz Git - sojka/can-utils.git/commitdiff
slcanpty: Add support for the Unix 98 pseudo-terminal interface
authorOliver Hartkopp <socketcan@hartkopp.net>
Thu, 20 Dec 2012 10:37:43 +0000 (11:37 +0100)
committerOliver Hartkopp <socketcan@hartkopp.net>
Thu, 20 Dec 2012 10:37:43 +0000 (11:37 +0100)
Most Linux distributions do not configure their kernels to use the BSD
pseudo-terminal interface (/dev/pty* and /dev/tty*) anymore; they uses the
Unix 98 pseudo-terminal interface instead (/dev/ptmx and /dev/pts/*).

http://www.kernel.org/doc/man-pages/online/pages/man4/pts.4.html

This change follows the slcan_attach changes:
http://sourceforge.net/tracker/index.php?func=detail&aid=3467521&group_id=146269&atid=764681

Signed-off-by: Ulrich Escher<git@myvdr.de>
Signed-off-by: Oliver Hartkopp <socketcan@hartkopp.net>
slcanpty.c

index 67a7491390d06ee874f42a6e2e8fa07481faa5a4..f3628b9e9701c260d5d86eafa31d5750c31dbe26 100644 (file)
@@ -22,6 +22,9 @@
  *
  */
 
+/* To get ptsname grantpt and unlockpt definitions from stdlib.h */
+#define _GNU_SOURCE
+
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -40,6 +43,7 @@
 
 /* maximum rx buffer len: extended CAN frame with timestamp */
 #define SLC_MTU (sizeof("T1111222281122334455667788EA5F\r")+1)
+#define DEVICE_NAME_PTMX "/dev/ptmx"
 
 #define DEBUG
 
@@ -383,6 +387,8 @@ int main(int argc, char **argv)
                fprintf(stderr, "Usage: %s <pty> <can interface>\n", argv[0]);
                fprintf(stderr, "e.g. '%s /dev/ptyc0 can0' creates"
                        " /dev/ttyc0 for the slcan application\n", argv[0]);
+               fprintf(stderr, "e.g. for pseudo-terminal '%s %s can0' creates"
+                       " /dev/pts/N\n", argv[0], DEVICE_NAME_PTMX);
                fprintf(stderr, "\n");
                return 1;
        }
@@ -404,6 +410,29 @@ int main(int argc, char **argv)
                           ECHONL | ECHOPRT | ECHOKE | ICRNL);
        tcsetattr(p, TCSANOW, &topts);
 
+       /* Support for the Unix 98 pseudo-terminal interface /dev/ptmx /dev/pts/N */
+       if  (strcmp(argv[1], DEVICE_NAME_PTMX) == 0) {
+
+               char *name_pts = NULL;  /* slave pseudo-terminal device name */
+
+               if (grantpt(p) < 0) {
+                       perror("grantpt");
+                       return 1;
+               }
+
+               if (unlockpt(p) < 0) {
+                       perror("unlockpt");
+                       return 1;
+               }
+
+               name_pts = ptsname(p);
+               if (name_pts == NULL) {
+                       perror("ptsname");
+                       return 1;
+               }
+               printf("open: %s: slave pseudo-terminal is %s\n", argv[1], name_pts);
+       }
+
        /* open socket */
        s = socket(PF_CAN, SOCK_RAW, CAN_RAW);
        if (s < 0) {