Onde posso encontrar alguma informação sobre o antigo doshell (8)?

3

Eu verifico o manual openvt executando o comando "man openvt", e encontrei o doshell (8) na seção "VEJA TAMBÉM":

Masnãohámanualseeufizer"man 8 doshell":

Euverifiqueiomanualon-lineno link , o doshell (8) não é um link:

Encontreialguémmencionado"(Há também o antigo doshell (8)", respondido em link

Apenas uma pergunta por curiosidade, há algum lugar onde eu possa encontrar informações sobre o doshell (8)?

    
por 林果皞 21.04.2014 / 06:32

1 resposta

3

Não tenho certeza (já faz um tempo), mas parece-me que é uma referência à rotina antiga do Linux (1992): ftp://ftp2.de.freebsd.org/pub/linux/tsx-11/sources/usr.bin/doshell.c :

#include <stdio.h>
#include <sys/file.h>
#include <errno.h>

extern char *sys_errlist[];

main(int argc, char *argv[])
{

    if (argc != 3) {
    fprintf(stderr, "usage: doshell <ttyname> <shellname> &\n");
    exit(1);
    }

    /* close down fd's */
    close(0);
    close(1);
    close(2);

    /* detach from parent process's group */
    setsid();

    /* open new tty */
    if (open(argv[1], O_RDWR, 0) == -1)
    exit(2);
    dup(0);
    dup(0);
    execlp(argv[2], "-", 0);
    /* should appear on new tty...: */
    fprintf(stderr, "can't exec shell: %s\n", sys_errlist[errno]);
    exit(3);
}

Também pode se referir à rotina antiga do Minux: link

void doshell(command)
char *command;
{
  int waitstat, pid;
  char *shell;

  if (NULL == (shell = getenv("SHELL"))) shell = SHELL;

  if ((pid = fork()) < 0) {
        perror("mail: couldn't fork");
        return;
  } else if (pid != 0) {        /* parent */
        wait(&waitstat);
        return;
  }

  /* Child */
  setgid(getgid());
  setuid(getuid());
  umask(oldmask);

  execl(shell, shell, "-c", command, (char *) NULL);
  fprintf(stderr, "can't exec shell\n");
  exit(127);
} 

As duas rotinas parecem ter a funcionalidade descrita na resposta do stackoverflow, e não parece improvável que a primeira seja derivada da segunda.

    
por 21.04.2014 / 07:10