Utilizar recursos graficos con PTY Linux C

Iniciado por mester, 27 Abril 2017, 14:21 PM

0 Miembros y 2 Visitantes están viendo este tema.

mester

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:


#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <pty.h>
#include <utmp.h>
#include <sys/select.h>

int
main(void)
{
  int fdm, fds;

  openpty(&fdm, &fds, NULL, NULL, NULL);

  if ( fork() == 0 )
    {
      close(fdm);

      login_tty(fds);

      dup2(fds, 0);
      dup2(fds, 1);
      dup2(fds, 2);

      close(fds);

      char *arg[] = {NULL};

      execvp("/bin/bash", arg);
    }
  else
    {
      fd_set fd;

      while ( 1 )
        {
          char put;

          FD_ZERO(&fd);

          FD_SET(0, &fd);
          FD_SET(fdm, &fd);

          select(fdm+1, &fd, NULL, NULL, NULL);

          if ( FD_ISSET(0, &fd) )
            {
              read(0, &put, 1);
              write(fdm, &put, 1);
            }
          if ( FD_ISSET(fdm, &fd) )
            {
              read(fdm, &put, 1);
              write(1, &put, 1);
            }
        }

      close(fdm);
    }

  return 0;
}


Gracias, de antemano.
Justicia es dar a cada uno lo que se merece

MAFUS

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í.

mester

Cita de: 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í.

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:

tcgetattr(STDIN_FILENO, &term);
cfmakeraw(&term);
tcsetattr(STDIN_FILENO, &term);
Justicia es dar a cada uno lo que se merece