repo: libidc
action: blob
revision: 
path_from: ircify.c
revision_from: refs/heads/master:
path_to: 
revision_to: 
git.thebackupbox.net
libidc
git clone git://git.thebackupbox.net/libidc

blob of:

libidc

/ ircify.c

blob_plain of this file

refs/heads/master:/ircify.c

 #include 
 #include 
 #include 
 #include "idc.h"

 extern struct idc_global idc;

 int pin[2];
 int pout[2];

 char channel[256];

 void irc_handler(struct shit *me,char *line) {
   char tmp[1024];
   if(!strncmp(line,"PING ",5)) {
     printf("PONG %s\r\n",line+5);
     fflush(stdout);
   }
   if(*line == ':') {
     if(strchr(line,' ')) {
       if(!strncmp(strchr(line,' ')," 376 ",5)) {
         printf("JOIN %s\r\n",channel);
         fflush(stdout);
       }
       if(!strncmp(strchr(line,' ')," PRIVMSG ",9)) {
         if(strchr(line+1,':')) {
           snprintf(tmp,sizeof(tmp),"%s\n",strchr(line+1,':')+1);
           write(pin[1],tmp,strlen(tmp));
         }
       }
     }
   }
   fprintf(stderr,"%s\n",line);
 }

 void subproc_handler(struct shit *me,char *line) {
   printf("PRIVMSG %s :%s\r\n",channel,line);
 }

 int main(int argc,char *argv[]) {
   setlinebuf(stdout);
   if(argc < 3) {
     fprintf(stderr,"usage: ircify nick channel program\n");
     return 1;
   }
   printf("NICK %s\r\n",argv[1]);
   printf("USER %s %s %s :%s\r\n",argv[1],argv[1],argv[1],argv[1]);
   fflush(stdout);
   strcpy(channel,argv[2]);
   argv+=3;
   int i=0;
   for(i=0;i<100;i++) {
     idc.fds[i].fd=-1;
   }
   idc.shitlen=0;
   pipe(pin);
   pipe(pout);
   if(!fork()) {
     close(0);
     close(1);
     dup2(pin[0],0);
     dup2(pout[1],1);
     execv(argv[0],argv);
   }
   add_fd(0,irc_handler);
   add_fd(pout[0],subproc_handler);
   select_on_everything();
 }