📄 poll.c
字号:
{ if(smtppointer->down==1) { send_to_server("HTTP","INFO", 1, smtppointer, "respmd: HTTP server: %s is up.", smtppointer->name); } smtppointer->down=0; smtppointer->up=1; } else { len=0; len2=0; while(len2!=2) //find end of the first line of response { if(*(tmp_buff+len)==' ') len2++; len++; } read_buf[0]='\0'; strncpy(read_buf,tmp_buff,len); read_buf[len]='\0'; len2=len; //Lets see if we can find end of line while(len2!=0) { if(read_buf[len2]=='\r') break; else len2--; } if(len2!=0) read_buf[len2]='\0'; if(smtppointer->url[0]=='\0') strcat(smtppointer->url,"/"); switch(return_code) { case 300: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (300) Multiple WWW page choices in: %s", smtppointer->name); break; case 301: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (301) WWW page %s from: %s Moved Permanently", smtppointer->url, smtppointer->name); break; case 302: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (302) WWW page %s from: %s Moved Temporarily", smtppointer->url, smtppointer->name); break; case 305: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (305) Use proxy to get WWW page %s from: %s", smtppointer->url, smtppointer->name); break; case 401: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (401) Unauthorized to get WWW page %s from: %s", smtppointer->url, smtppointer->name); break; case 403: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (403) Forbidden to get WWW page %s from: %s", smtppointer->url, smtppointer->name); break; case 404: send_to_server("HTTP","WARNING", 1, smtppointer, "respmd: (404) WWW page %s not found from: %s", smtppointer->url, smtppointer->name); break; case 407: send_to_server("HTTP","ERROR", 1, smtppointer, "respmd: (407) Proxy Authentication required to get WWW page %s from: %s", smtppointer->url, smtppointer->name); break; default : send_to_server("HTTP","ERROR", 2, smtppointer, "respmd: Failed to get WWW page %s from: %s. %d %s", smtppointer->url, smtppointer->name,return_code,read_buf); } } //Lets process the results ends close(sockfd); //if(tmp_buff!=NULL) free(p_tmp_buff); return(0);}/****************************************************************///NNTP POLL CODE/***************************************************************/int poll_nntp(struct smtps_t *smtppointer){ int sockfd; // socket. int n=0,len=0,ok=0; char read_buf[301]="\0"; char response[4]="\0"; char error_msg[100]="\0"; //we use this to send entry to server char err_msg[100]="\0"; //store error we get from polled server char *serv="119"; struct addrinfo hints, *res, *ressave; struct timeval tv; tv.tv_sec = 40; tv.tv_usec = 0; bzero(&hints, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype=SOCK_STREAM; if(smtppointer->port[0] == '\0') n = getaddrinfo(smtppointer->name,serv,&hints, &res); else n = getaddrinfo(smtppointer->name,smtppointer->port,&hints, &res); if(n != 0) { sprintf(error_msg,"respmd: getaddrinfo failed for NNTP server: %s, %s",smtppointer->name,gai_strerror(n)); if(client(SERVER_IP, SERVER_PORT, LOCALHOSTN, "ERROR", error_msg, smtppointer->name, "NONE", "DOWN", "NNTP") < 0) slog(2, "poll.c:nntp: error while sending to server."); else slog(2,"poll.c: getaddrinfo failed for NNTP server: %s, %s",smtppointer->name,gai_strerror(n)); smtppointer->down=1; smtppointer->up=0; return 0; } n=0; ressave=res; do { //connect loop starts sockfd=socket(res->ai_family, res->ai_socktype, res->ai_protocol); if(sockfd<0) { slog(2,"poll.c:nntp: Error socket: %s",strerror(errno)); return -1; } // 'Call' the server. n = connect(sockfd, res->ai_addr,res->ai_addrlen); if(n < 0) { if(errno == ETIMEDOUT || errno == EINTR) { // status 1up 2down send_to_server("NNTP","ERROR", 2, smtppointer, "respmd: NNTP server: %s is down. Connection timeout.", smtppointer->name); } else if(errno == ECONNREFUSED) { send_to_server("NNTP","ERROR", 2, smtppointer, "respmd: NNTP server: %s is down. Connection refused.", smtppointer->name); } else { sprintf(error_msg,"respmd: NNTP server: %s down. Unknown error.",smtppointer->name); send_to_server("NNTP","ERROR", 2, smtppointer, "respmd: NNTP server: %s is down. %s", smtppointer->name,strerror(errno)); } smtppointer->down=1; smtppointer->up=0; freeaddrinfo(ressave); return 0; } else { break; } //alarm(0); } while( (res = res->ai_next) != NULL); //connect loop end if(res == NULL) slog(2,"poll.c:nntp: connection to: %s failed",smtppointer->name); freeaddrinfo(ressave); //set write timeout setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,&tv,sizeof(tv)); //set read timeout setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)); len=read(sockfd, read_buf, 300); // Read from the server. if(len<0) { len = send_to_server("NNTP","ERROR", 2, smtppointer, "poll.c: Error while reading from: %s %s", smtppointer->name,strerror(errno)); if(len!=0) slog(2,"poll.c:nntp: Error while reading from: %s %s",smtppointer->name,strerror(errno)); close(sockfd); return(0); } read_buf[len]='\0'; strncpy(response,read_buf,3); response[3]='\0'; //slog(1,"DEBUG RESPONSE1: %s",response); if(strcmp(response,"200")==0 || strcmp(response,"201")==0) //did we get connection { ok++; read_buf[0]='\0'; strcat(read_buf,"mode reader"); //We request reader mode shud work allways strcat(read_buf,"\r\n"); len=strlen(read_buf); len=write(sockfd, read_buf, len); read_buf[0]='\0'; len=read(sockfd, read_buf, 300); // Read from the server. if(len<0) { len = send_to_server("NNTP","ERROR", 2, smtppointer, "poll.c: Error while reading from: %s %s", smtppointer->name,strerror(errno)); if(len!=0) slog(2,"poll.c:nntp: Error while reading from: %s %s",smtppointer->name,strerror(errno)); close(sockfd); return(0); } read_buf[len]='\0'; strncpy(response,read_buf,3); response[3]='\0'; //slog(1,"DEBUG RESPONSE2: %s LEN: %d",read_buf,len); if(strcmp(response,"200")==0 || strcmp(response,"201")==0) ok++; else strncpy(err_msg,read_buf,99); len=write(sockfd, "quit\r\n", 6); //We wantto close connection read_buf[0]='\0'; len=read(sockfd, read_buf, 300); // Read from the server if(len<0) { len = send_to_server("NNTP","ERROR", 2, smtppointer, "poll.c: Error while reading from: %s %s", smtppointer->name,strerror(errno)); if(len!=0) slog(2,"poll.c:nntp: Error while reading from: %s %s",smtppointer->name,strerror(errno)); close(sockfd); return(0); } read_buf[len]='\0'; strncpy(response,read_buf,3); response[3]='\0'; if(strcmp(response,"205")==0) //did QUIT go ok ok++; else { err_msg[0]='\0'; strncpy(err_msg,read_buf,99); } //slog(1,"DEBUG RESPONSE3: %s LEN: %d",read_buf,len); //Lets process the results if(ok==3) { if(smtppointer->down==1) //if it has been down we tell its up now. { // status 1up 2down send_to_server("NNTP","INFO", 1, smtppointer, "respmd: NNTP server: %s is up.", smtppointer->name); } smtppointer->down=0; smtppointer->up=1; } else { // status 1up 2down send_to_server("NNTP","ERROR", 2, smtppointer, "respmd: NNTP server: %s is down. %s", smtppointer->name,read_buf); } //Lets process the results ends } else { //did we get connection else if(strcmp(response,"400")==0) send_to_server("NNTP","WARNING", 1, smtppointer, "respmd: NNTP server: %s Service discontinued. %s", smtppointer->name,read_buf); else send_to_server("NNTP","ERROR", 2, smtppointer, "respmd: NNTP server: %s is down. %s", smtppointer->name,read_buf); //1=up 2=down } //did we get connection ends close(sockfd); return(0);}/****************************************************************///IMAP POLL CODE/***************************************************************/int poll_imap(struct smtps_t *smtppointer){ int sockfd; // socket. int n=0,len=0,ok=0; char read_buf[301]="\0"; char response[4]="\0"; char error_msg[100]="\0"; //we use this to send entry to server char err_msg[100]="\0"; //store error we get from polled server char *serv="143"; struct addrinfo hints, *res, *ressave; struct timeval tv; tv.tv_sec = 40; tv.tv_usec = 0; bzero(&hints, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype=SOCK_STREAM; if(smtppointer->port[0] == '\0') n = getaddrinfo(smtppointer->name,serv,&hints, &res); else n = getaddrinfo(smtppointer->name,smtppointer->port,&hints, &res); if(n != 0) { sprintf(error_msg,"respmd: getaddrinfo failed for IMAP server: %s, %s",smtppointer->name,gai_strerror(n)); if(client(SERVER_IP, SERVER_PORT, LOCALHOSTN, "ERROR", error_msg, smtppointer->name, "NONE", "DOWN", "IMAP") < 0) slog(2, "poll.c:imap: error while sending to server."); //else // slog(2,"poll.c: getaddrinfo failed for IMAP server: %s, %s",smtppointer->name,gai_strerror(n)); smtppointer->down=1; smtppointer->up=0; return 0; } n=0; ressave=res; do { //connect loop starts sockfd=socket(res->ai_family, res->ai_socktype, res->ai_protocol); if(sockfd<0) { slog(2,"poll.c:imap: Error socket: %s",strerror(errno)); return -1; } // 'Call' the server. n = connect(sockfd, res->ai_addr,res->ai_addrlen); if(n < 0) { if(errno == ETIMEDOUT || errno == EINTR) { // status 1up 2down send_to_server("IMAP","ERROR", 2, smtppointer, "respmd: IMAP server: %s is down. Connection timeout.", smtppointer->name); } else if(errno == ECONNREFUSED) { send_to_server("IMAP","ERROR", 2, smtppointer, "respmd: IMAP server: %s is down. Connection refused.", smtppointer->name); } else { sprintf(error_msg,"respmd: IMAP server: %s down. Unknown error.",smtppointer->name); send_to_server("IMAP","ERROR", 2, smtppointer, "respmd: IMAP server: %s is down. %s", smtppointer->name,strerror(errno)); } smtppointer->down=1; smtppointer->up=0; freeaddrinfo(ressave); return 0; } else { break; } //alarm(0); } while( (res = res->ai_next) != NULL); //connect loop end if(res == NULL) slog(2,"poll.c:imap: connection to: %s failed",smtppointer->name); freeaddrinfo(ressave); //set write timeout setsockopt(sockfd,SOL_SOCKET,SO_SNDTIMEO,&tv,sizeof(tv)); //set read timeout setsockopt(sockfd,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv)); len=read(sockfd, read_buf, 300); // Read from the server. if(len<0) { len = send_to_server("IMAP","ERROR", 2, smtppointer, "poll.c: Error while reading from: %s %s", smtppointer->name,strerror(errno)); if(len!=0) slog(2,"poll.c:imap: Error while reading from: %s %s",smtppointer->name,strerror(errno)); close(sockfd); return(0); } read_buf[len]='\0'; strncpy(response,read_buf,4); response[4]='\0'; //slog(1,"DEBUG RESPONSE1: %s",response); if(strcmp(response,"* OK")==0) //did we get connection { ok++; read_buf[0]='\0'; strcat(read_buf,"a100 NOOP"); //We request reader mode shud work allways strcat(read_buf,"\r\n"); len=strlen(read_buf); len=write(sockfd, read_buf, len); read_buf[0]='\0'; len=read(sockfd, read_buf, 300); // Read from the server. if(len<0) { len = send_to_server("IMAP","ERROR", 2, smtppointer, "poll.c: Error while reading from: %s %s", smtppointer->name,strerror(errno)); if(len!=0) slog(2,"poll.c:imap: Error while reading from: %s %s",smtppointer->name,strerror(errno)); close(sockfd); return(0); } read_buf[len]='\0'; strncpy(response,read_buf,12); response[12]='\0'; if(strcmp(response,"a100 OK NOOP")==0) ok++; else strncpy(err_msg,read_buf,99); len=write(sockfd, "a100 LOGOUT\r\n", 13); //We wantto close connection read_buf[0]='\0'; len=read(sockfd, read_buf, 300); // Read from the server if(len<0) { len = send_to_server("IMAP","ERROR", 2, smtppointer, "poll.c: Error while reading from: %s %s", smtppointer->name,strerror(errno)); if(len!=0) slog(2,"poll.c:imap: Error while reading from: %s %s",smtppointer->name,strerror(errno)); close(sockfd); return(0); } read_buf[len]='\0'; strncpy(response,read_buf,6); response[6]='\0'; if(strcmp(response,"* BYE ")==0) //did QUIT go ok ok++; else { err_msg[0]='\0'; strncpy(err_msg,read_buf,99); } //Lets process the results if(ok==3) { if(smtppointer->down==1) //if it has been down we tell its up now. { // status 1up 2down send_to_server("IMAP","INFO", 1, smtppointer, "respmd: IMAP server: %s is up.", smtppointer->name); } smtppointer->down=0; smtppointer->up=1; } else { // status 1up 2down send_to_server("IMAP","ERROR", 2, smtppointer, "respmd: IMAP server: %s is down. %s", smtppointer->name,read_buf); } //Lets process the results ends } else { //did we get connection else send_to_server("IMAP","ERROR", 2, smtppointer, "respmd: IMAP server: %s is down. %s", smtppointer->name,read_buf); //1=up 2=down } //did we get connection ends close(sockfd); return(0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -