savory | Je cherche un exemple d'handle de shell en C ansi.
Par exemple on fait un execve("/bin/sh","sh",envp); et on le garde dans un pthread pour ensuite lui passer en parametre ou en renseignant une structure des commandes de type bash (sans utiliser de path absolu pour les binaires car on aura prealablement rempli l'environnement envp )
Pour le moment le veritable probleme reste celui du handle le passage de parametre pourrait ausi se faire via une variable globale...
Rien sur google rien chez eyrolles Bref si quelqu'un a une idée ou un exemple a me proposer je suis preneur Voila l'emulateur du term si ca peux aider a comprendre ce que je veux faire :
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <signal.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <string.h>
- #include <fcntl.h>
- #include <termios.h>
- #include <netdb.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #include <errno.h>
- #include <sys/ioctl.h>
- #define ECHAR 0x1d
- #define TIOCGWINSZ 0x5413
- #define TIOCSWINSZ 0x5414
- int winsize;
- char *envtab[] =
- {
- "",
- "",
- "LOGNAME=savy",
- "USERNAME=savy",
- "USER=savy",
- "PS1=[\\u@\\h \\W]\\$ ",
- "HISTFILE=/dev/null",
- "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:./bin",
- "!TERM",
- NULL
- };
- void sendenv(int sock)
- {
- struct winsize ws;
- #define ENVLEN 256
- char envbuf[ENVLEN+1];
- char buf1[256];
- char buf2[256];
- int i = 0;
- ioctl(0, TIOCGWINSZ, &ws);
- sprintf(buf1, "COLUMNS=%d", ws.ws_col);
- sprintf(buf2, "LINES=%d", ws.ws_row);
- envtab[0] = buf1; envtab[1] = buf2;
- while (envtab[i]) {
- bzero(envbuf, ENVLEN);
- if (envtab[i][0] == '!') {
- char *env;
- env = getenv(&envtab[i][1]);
- if (!env) goto oops;
- sprintf(envbuf, "%s=%s", &envtab[i][1], env);
- } else {
- strncpy(envbuf, envtab[i], ENVLEN);
- }
- write(sock, envbuf, ENVLEN);
- oops:
- i++;
- }
- write(sock, "\n\n\n", 3);
- }
- void winch(int i)
- {
- signal(SIGWINCH, winch);
- winsize++;
- }
- int usage(char *s)
- {
- printf("utilisation: %s [port]\n", s);
- return 1;
- }
- #define BUF 16384
- int main(int argc, char *argv[])
- {
- int port = 4000;
- struct hostent *he;
- struct sockaddr_in serv;
- struct termios old, new;
- int sock;
- unsigned char buf[BUF];
- fd_set fds;
- int eerrno;
- struct winsize ws;
- /* entrйe */
- if (argc < 2) return usage(argv[0]);
- if (argc == 3) {
- if (sscanf(argv[2], "%d", &port) != 1)
- return usage(argv[0]);
- }
- /* resolve */
- bzero((char *) &serv, sizeof(serv));
- serv.sin_addr.s_addr = inet_addr(argv[1]);
- if (serv.sin_addr.s_addr == INADDR_NONE) {
- printf("%s...", argv[1]); fflush(stdout);
- he = gethostbyname(argv[1]);
- if (!he) {
- printf("erreur fatale\n" );
- return 1;
- }
- memcpy((char *) &serv.sin_addr, (char *) he->h_addr,
- sizeof(serv.sin_addr));
- printf("OK\n" );
- }
- printf("Tentative de connexion а %s:%d...\n", inet_ntoa(serv.sin_addr), port);
- fflush(stdout);
- /* connect */
- sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (sock < 0) {
- perror("socket" );
- return 1;
- }
- serv.sin_family = AF_INET;
- serv.sin_port = htons(port);
- if (connect(sock, (struct sockaddr *) &serv, sizeof(serv)) < 0) {
- perror("connect" );
- return 1;
- }
- printf(
- "Connected to %s.\n"
- "Escape character is '^]'\n", argv[1]);
- /* send enviroment */
- sendenv(sock);
- /* set-up terminal */
- tcgetattr(0, &old);
- new = old;
- new.c_lflag &= ~(ICANON | ECHO | ISIG);
- new.c_iflag &= ~(IXON | IXOFF);
- tcsetattr(0, TCSAFLUSH, &new);
- winch(0);
- while (1) {
- FD_ZERO(&fds);
- FD_SET(0, &fds);
- FD_SET(sock, &fds);
- if (winsize) {
- if (ioctl(0, TIOCGWINSZ, &ws) == 0) {
- buf[0] = ECHAR;
- buf[1] = (ws.ws_col >> 8) & 0xFF;
- buf[2] = ws.ws_col & 0xFF;
- buf[3] = (ws.ws_row >> 8) & 0xFF;
- buf[4] = ws.ws_row & 0xFF;
- write(sock, buf, 5);
- }
- winsize = 0;
- }
- if (select(sock+1, &fds, NULL, NULL, NULL) < 0) {
- if (errno == EINTR) continue;
- break;
- }
- if (winsize) continue;
- if (FD_ISSET(0, &fds)) {
- int count = read(0, buf, BUF);
- int i;
- if (count <= 0) break;
- if (memchr(buf, ECHAR, count)) break;
- if (write(sock, buf, count) <= 0) break;
- }
- if (FD_ISSET(sock, &fds)) {
- int count = read(sock, buf, BUF);
- if (count <= 0) break;
- if (write(0, buf, count) <= 0) break;
- }
- }
- close(sock);
- tcsetattr(0, TCSAFLUSH, &old);
- printf("\nConnection closed.\n" );
- return 0;
- }
|
|