Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: mester en 27 Abril 2017, 14:21 pm



Título: Utilizar recursos graficos con PTY Linux C
Publicado por: mester en 27 Abril 2017, 14:21 pm
Hola.

Estaba trasteando con los pty's y al hacer unos cuantos me he dado cuenta de que no puedo utilizar correctamente NCURSES o moverme por el input del terminal como desearía.
Buscando imitar a SSH he mirado su codigo para ver como lo hace, pero al imitarlo me sale prácticamente lo mismo. Ejemplo del codigo:

Código
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. #include <fcntl.h>
  5. #include <pty.h>
  6. #include <utmp.h>
  7. #include <sys/select.h>
  8.  
  9. int
  10. main(void)
  11. {
  12.  int fdm, fds;
  13.  
  14.  openpty(&fdm, &fds, NULL, NULL, NULL);
  15.  
  16.  if ( fork() == 0 )
  17.    {
  18.      close(fdm);
  19.  
  20.      login_tty(fds);
  21.  
  22.      dup2(fds, 0);
  23.      dup2(fds, 1);
  24.      dup2(fds, 2);
  25.  
  26.      close(fds);
  27.  
  28.      char *arg[] = {NULL};
  29.  
  30.      execvp("/bin/bash", arg);
  31.    }
  32.  else
  33.    {
  34.      fd_set fd;
  35.  
  36.      while ( 1 )
  37.        {
  38.          char put;
  39.  
  40.          FD_ZERO(&fd);
  41.  
  42.          FD_SET(0, &fd);
  43.          FD_SET(fdm, &fd);
  44.  
  45.          select(fdm+1, &fd, NULL, NULL, NULL);
  46.  
  47.          if ( FD_ISSET(0, &fd) )
  48.            {
  49.              read(0, &put, 1);
  50.              write(fdm, &put, 1);
  51.            }
  52.          if ( FD_ISSET(fdm, &fd) )
  53.            {
  54.              read(fdm, &put, 1);
  55.              write(1, &put, 1);
  56.            }
  57.        }
  58.  
  59.      close(fdm);
  60.    }
  61.  
  62.  return 0;
  63. }

Gracias, de antemano.


Título: Re: Utilizar recursos graficos con PTY Linux C
Publicado por: MAFUS en 27 Abril 2017, 15:41 pm
El penúltimo argumento de openpty es const struct termios *termp. Con ella controlas el comportamiento del terminal. A lo mejor tu solución está por aquí.


Título: Re: Utilizar recursos graficos con PTY Linux C
Publicado por: mester en 27 Abril 2017, 15:53 pm
El penúltimo argumento de openpty es const struct termios *termp. Con ella controlas el comportamiento del terminal. A lo mejor tu solución está por aquí.

Casi, ya he encontrado el error. Tenía que haberme fijado un poco más.
No hay que usar la estrutura termios para controlarlo. Depende totalmente del usuario, por así decirlo.
Demostración: https://github.com/Mester19/glibc/blob/master/login/openpty.c
Cuando accedes a la funcion, sólo se establece la estructura termios para el esclavo. La idea es que el STDIN reciba y envíe los datos en RAW. Se arregla poniendo el siguiente codigo en la parte del proceso padre:
Código
  1. tcgetattr(STDIN_FILENO, &term);
  2. cfmakeraw(&term);
  3. tcsetattr(STDIN_FILENO, &term);
  4.