Handle de shell avec posix thread

Handle de shell avec posix thread - C - Programmation

Marsh Posté le 13-08-2004 à 12:07:21    

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 :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <signal.h>
  5. #include <sys/types.h>
  6. #include <sys/socket.h>
  7. #include <netinet/in.h>
  8. #include <string.h>
  9. #include <fcntl.h>
  10. #include <termios.h>
  11. #include <netdb.h>
  12. #include <netinet/in.h>
  13. #include <arpa/inet.h>
  14. #include <errno.h>
  15. #include <sys/ioctl.h>
  16. #define ECHAR 0x1d
  17. #define TIOCGWINSZ      0x5413
  18. #define TIOCSWINSZ      0x5414
  19. int  winsize;
  20. char *envtab[] =
  21. {
  22. "",
  23. "",
  24. "LOGNAME=savy",
  25. "USERNAME=savy",
  26. "USER=savy",
  27. "PS1=[\\u@\\h \\W]\\$ ",
  28. "HISTFILE=/dev/null",
  29. "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:./bin",
  30. "!TERM",
  31. NULL
  32. };
  33. void sendenv(int sock)
  34. {
  35. struct winsize ws;
  36. #define ENVLEN 256
  37. char envbuf[ENVLEN+1];
  38. char buf1[256];
  39. char buf2[256];
  40. int i = 0;
  41. ioctl(0, TIOCGWINSZ, &ws);
  42. sprintf(buf1, "COLUMNS=%d", ws.ws_col);
  43. sprintf(buf2, "LINES=%d", ws.ws_row);
  44. envtab[0] = buf1; envtab[1] = buf2;
  45. while (envtab[i]) {
  46. bzero(envbuf, ENVLEN);
  47. if (envtab[i][0] == '!') {
  48.   char *env;
  49.   env = getenv(&envtab[i][1]);
  50.   if (!env) goto oops;
  51.   sprintf(envbuf, "%s=%s", &envtab[i][1], env);
  52. } else {
  53.   strncpy(envbuf, envtab[i], ENVLEN);
  54. }
  55. write(sock, envbuf, ENVLEN);
  56. oops:
  57. i++;
  58. }
  59. write(sock, "\n\n\n", 3);
  60. }
  61. void winch(int i)
  62. {
  63. signal(SIGWINCH, winch);
  64. winsize++;
  65. }
  66. int usage(char *s)
  67. {
  68. printf("utilisation: %s  [port]\n", s);
  69. return 1;
  70. }
  71. #define BUF 16384
  72. int main(int argc, char *argv[])
  73. {
  74. int  port = 4000;
  75. struct hostent *he;
  76. struct sockaddr_in serv;
  77. struct termios old, new;
  78. int  sock;
  79. unsigned char buf[BUF];
  80. fd_set  fds;
  81. int  eerrno;
  82. struct winsize ws;
  83. /* entrйe */
  84. if (argc < 2) return usage(argv[0]);
  85. if (argc == 3) {
  86. if (sscanf(argv[2], "%d", &port) != 1)
  87.   return usage(argv[0]);
  88. }
  89. /* resolve */
  90. bzero((char *) &serv, sizeof(serv));
  91. serv.sin_addr.s_addr = inet_addr(argv[1]);
  92. if (serv.sin_addr.s_addr == INADDR_NONE) {
  93. printf("%s...", argv[1]); fflush(stdout);
  94. he = gethostbyname(argv[1]);
  95. if (!he) {
  96.   printf("erreur fatale\n" );
  97.   return 1;
  98. }
  99. memcpy((char *) &serv.sin_addr, (char *) he->h_addr,
  100.         sizeof(serv.sin_addr));
  101. printf("OK\n" );
  102. }
  103. printf("Tentative de connexion а %s:%d...\n", inet_ntoa(serv.sin_addr), port);
  104. fflush(stdout);
  105. /* connect */
  106. sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  107. if (sock < 0) {
  108. perror("socket" );
  109. return 1;
  110. }
  111. serv.sin_family = AF_INET;
  112. serv.sin_port = htons(port);
  113. if (connect(sock, (struct sockaddr *) &serv, sizeof(serv)) < 0) {
  114. perror("connect" );
  115. return 1;
  116. }
  117. printf(
  118. "Connected to %s.\n"
  119. "Escape character is '^]'\n", argv[1]);
  120. /* send enviroment */
  121. sendenv(sock);
  122. /* set-up terminal */
  123. tcgetattr(0, &old);
  124. new = old;
  125. new.c_lflag &= ~(ICANON | ECHO | ISIG);
  126. new.c_iflag &= ~(IXON | IXOFF);
  127. tcsetattr(0, TCSAFLUSH, &new);
  128. winch(0);
  129. while (1) {
  130. FD_ZERO(&fds);
  131. FD_SET(0, &fds);
  132. FD_SET(sock, &fds);
  133. if (winsize) {
  134.   if (ioctl(0, TIOCGWINSZ, &ws) == 0) {
  135.    buf[0] = ECHAR;
  136.    buf[1] = (ws.ws_col >> 8) & 0xFF;
  137.    buf[2] = ws.ws_col & 0xFF;
  138.    buf[3] = (ws.ws_row >> 8) & 0xFF;
  139.    buf[4] = ws.ws_row & 0xFF;
  140.    write(sock, buf, 5);
  141.   }
  142.   winsize = 0;
  143. }
  144. if (select(sock+1, &fds, NULL, NULL, NULL) < 0) {
  145.   if (errno == EINTR) continue;
  146.   break;
  147. }
  148. if (winsize) continue;
  149. if (FD_ISSET(0, &fds)) {
  150.   int count = read(0, buf, BUF);
  151.   int i;
  152.   if (count <= 0) break;
  153.   if (memchr(buf, ECHAR, count)) break;
  154.   if (write(sock, buf, count) <= 0) break;
  155. }
  156. if (FD_ISSET(sock, &fds)) {
  157.   int count = read(sock, buf, BUF);
  158.   if (count <= 0) break;
  159.   if (write(0, buf, count) <= 0) break;
  160. }
  161. }
  162. close(sock);
  163. tcsetattr(0, TCSAFLUSH, &old);
  164. printf("\nConnection closed.\n" );
  165. return 0;
  166. }


Reply

Marsh Posté le 13-08-2004 à 12:07:21   

Reply

Marsh Posté le 22-08-2004 à 17:54:02    

[:brainwasher]
je n'ai pas vraiment compris ce que tu voulais faire ...
si ca peux t'aider il existe dàutres invoquation du schelle comme  

Code :
  1. system("/bin/bash" );


et ensuite tu discute avec via des pipes, voir "popen" et consor.

Reply

Marsh Posté le 22-08-2004 à 18:11:07    

[private] :pfff: [/private]


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 22-08-2004 à 18:23:38    

KangOl a écrit :

[private] :pfff: [/private]


[:cyriadis] ou [:chokiller] au choix .

Reply

Marsh Posté le 24-08-2004 à 17:12:40    

Merci :) mais finalement j'ai effectivement utilisé des pidchild meme si c'est un peu plus degeulasse que de threader les clients ca marche plutot bien.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed