Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.10 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <netdb.h>
  4. #include <string.h>
  5. #include <arpa/inet.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <stdarg.h>
  9. #define BUFSIZE 512
  10. #define PSYCHO  NULL
  11.  
  12. /**
  13. * argv[1] -> host
  14. * argv[2] -> port
  15. * argv[3] -> chan
  16. * argv[4] -> nick
  17. * argv[5] -> user
  18. **/
  19.  
  20. struct irc_data {
  21.     char nick[32];
  22.     char user[32];
  23.     char host[64];
  24.     char chan[32];
  25.     char message[512];
  26.     int is_ready;
  27. };
  28.  
  29. void die(const char*,int);
  30. void parse_data(char*,struct irc_data**);
  31. int  sayc(int,const char*,const char*, ...);
  32.  
  33. int main(int argc, char **argv){
  34.  
  35.     if(argc!=6){
  36.         fprintf(stderr,"usage: %s <host> <port> <chan> <nick> <ident>\n",argv[0]);
  37.         exit(1);
  38.     }
  39.  
  40.     const char *host = argv[1];
  41.     const char *port = argv[2];
  42.     const char *chan = argv[3];
  43.     const char *nick = argv[4];
  44.     const char *user = argv[5];
  45.  
  46.     char buff[BUFSIZE], ip[INET_ADDRSTRLEN];
  47.     int sfd,status,sent,recvd,i;
  48.     struct addrinfo hints,*serv;
  49.     struct sockaddr_in *sip;
  50.     struct irc_data *irc = malloc(sizeof(struct irc_data));
  51.  
  52.     memset(&hints,0,sizeof(hints));
  53.     hints.ai_family = AF_INET;
  54.     hints.ai_socktype = SOCK_STREAM;
  55.  
  56.     if((status=getaddrinfo(host,port,&hints,&serv))<0)
  57.         die("getaddrinfo",status);
  58.     if((sfd=socket(serv->ai_family,serv->ai_socktype,serv->ai_protocol))<0)
  59.         die("socket",sfd);
  60.     if((status=connect(sfd,serv->ai_addr,serv->ai_addrlen))<0)
  61.         die("connect",status);
  62.  
  63.     sip = (struct sockaddr_in*)serv->ai_addr;
  64.     inet_ntop(serv->ai_family,&sip->sin_addr,ip,sizeof(ip));
  65.  
  66.     snprintf(buff,BUFSIZE,"USER %s 8 * :\x50\x73\x79\x63\x68\x6F\x20\x42\x6F\x74\r\nNICK %s\r\nJOIN #%s\r\n",user,nick,chan);
  67.     if((sent=send(sfd,buff,strlen(buff),0))<0)
  68.         die("send",sent);
  69.  
  70.     while((recvd=recv(sfd,buff,BUFSIZE-1,0))>=0){
  71.         buff[recvd-1]=0;
  72.         puts(buff);
  73.         parse_data(buff,&irc);
  74.         if(irc->is_ready)
  75.             if(strstr(irc->message,nick) != NULL)
  76.                 sayc(sfd,irc->chan,"sup %s",irc->nick);
  77.         if(sscanf(buff,"PING :%s",buff)==1){
  78.             snprintf(buff,BUFSIZE,"PONG :%s",buff);
  79.             if(send(sfd,buff,strlen(buff),0)>0)
  80.                 puts("PONG!");
  81.             else puts("PONG failed...just sayin");
  82.         }
  83.  
  84.     }
  85.     free(irc);
  86.     close(sfd);
  87.     freeaddrinfo(serv);
  88. }
  89.  
  90. void die(const char *msg, int err){
  91.     fprintf(stderr,"%s: %s\n",msg,gai_strerror(err));
  92.     exit(1);
  93. }
  94.  
  95. void parse_data(char *buff,struct irc_data **fat){
  96.     if(sscanf(buff,":%[^!]!%[^@]@%[^ ] %*[^ ] %[^ :] :%[^\r\n]",(*fat)->nick,(*fat)->user,(*fat)->host,(*fat)->chan,(*fat)->message) == 5){
  97.         (*fat)->is_ready = 1;
  98.         if((*fat)->chan[0] != '#') strcpy((*fat)->chan,(*fat)->nick);
  99.     } else (*fat)->is_ready = 0;
  100. }
  101.  
  102. int sayc(int sockfd, const char *chan, const char *fmt, ...){
  103.     char msg[BUFSIZE], k[BUFSIZE];
  104.     va_list list;
  105.     va_start(list,fmt);
  106.     vsnprintf(k,BUFSIZE,fmt,list);
  107.     snprintf(msg,BUFSIZE,"PRIVMSG %s :%s\r\n",chan,k);
  108.     va_end(list);
  109.     return send(sockfd,msg,strlen(msg),0);
  110. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement