Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1827 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Handle de shell avec posix thread

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Handle de shell avec posix thread

n°822234
savory
Posté le 13-08-2004 à 12:07:21  profilanswer
 

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


mood
Publicité
Posté le 13-08-2004 à 12:07:21  profilanswer
 

n°828985
psebcopath​e
Posté le 22-08-2004 à 17:54:02  profilanswer
 

[: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.

n°828993
KangOl
Profil : pointeur
Posté le 22-08-2004 à 18:11:07  profilanswer
 

[private] :pfff: [/private]


---------------
Nos estans firs di nosse pitite patreye...
n°828998
psebcopath​e
Posté le 22-08-2004 à 18:23:38  profilanswer
 

KangOl a écrit :

[private] :pfff: [/private]


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

n°830961
savory
Posté le 24-08-2004 à 17:12:40  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Handle de shell avec posix thread

 

Sujets relatifs
shell de aix a red hat [Shell - Rsh - Java] Rendez moi la main !
commande shellShell Linux : récupérer pièce attachée mail
shell /récuperer des infos[VB] nom exe (ou chemin) du handle d'une appli en cours
[shell] commande pour lister les fichier executables[C#] Passer des paramètres à un Thread ? [Résolu]
[Scripts Shell] Commandes find & echo - probleme d'affichageque tout le monde lise ce thread et vite!
Plus de sujets relatifs à : Handle de shell avec posix thread


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR