wmclockmon: update change-log
[dockapps.git] / wmpop3 / wmpop3 / Pop3Client.c
blobf7e5f538bf50643b7274709f3afe8c0037748960
1 /* Author : Scott Holden ( scotth@thezone.net )
3 * Pop3 Email checker.
5 * Last Updated : Mar 20, 1999
7 */
10 #include "Pop3Client.h"
11 #include <string.h>
12 #include <sys/types.h>
13 #include <sys/socket.h>
14 #include <netinet/in.h>
15 #include <netdb.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <unistd.h>
20 struct pop3_struct{
21 struct sockaddr_in server;
22 struct hostent *hp;
23 enum {CONNECTED, NOT_CONNECTED} connected;
24 char inBuf[1024];
25 int inBufSize;
26 char outBuf[1024];
27 int outBufSize;
28 int s;
29 char password[256];
30 char userName[256];
31 int serverPort;
32 int localPort;
33 int numOfMessages;
34 int numOfUnreadMessages;
38 Pop3 pop3Create(void){
40 Pop3 pc;
42 pc = (Pop3)malloc( sizeof(*pc) );
43 if( pc == 0)
44 return 0;
45 strcpy(pc->password , "");
46 strcpy(pc->userName , "");
47 pc->connected = NOT_CONNECTED;
48 pc->serverPort = 110;
49 pc->localPort = 0;
50 pc->numOfMessages = 0;
51 pc->numOfUnreadMessages = 0;
52 pc->inBufSize = 0;
53 pc->outBufSize = 0;
55 return pc;
57 int pop3MakeConnection(Pop3 pc, char *serverName, int port){
59 pc->s = socket(AF_INET, SOCK_STREAM, 0 );
60 memset( &(pc->server), 0 , sizeof(pc->server));
61 pc->server.sin_family = AF_INET;
62 pc->hp = gethostbyname(serverName);
63 if( pc->hp == 0)
64 return -1;
65 memcpy( &(pc->server.sin_addr), pc->hp->h_addr, pc->hp->h_length);
66 pc->server.sin_port = htons(port);
67 if ( connect(pc->s, (struct sockaddr *)&(pc->server)
68 , sizeof(pc->server)) < 0 )
69 return -1;
70 pc->connected = CONNECTED;
71 return 0;
74 int pop3IsConnected(Pop3 pc){
76 if( pc->connected == CONNECTED)
77 return 1;
78 return 0;
81 int pop3Login(Pop3 pc, char *name, char *pass){
83 int size;
84 char temp[1024];
86 if( pc->connected == NOT_CONNECTED ){
87 perror("Not Connected To Server\n");
88 return -1;
91 size = recv(pc->s,&pc->inBuf,1024,0);
92 memset(temp,0,1024);
93 memcpy(temp,pc->inBuf,size);
94 if( temp[0] != '+' ){
95 fprintf(stderr,"Error Logging in\n");
96 return -1;
99 sprintf(pc->outBuf,"USER %s\r\n",name);
100 send(pc->s, &pc->outBuf,strlen(pc->outBuf),0);
101 size =recv(pc->s,pc->inBuf,1024,0);
102 memset(temp,0,1024);
103 memcpy(temp,pc->inBuf,size);
104 if( temp[0] != '+' ){
105 fprintf(stderr,"Invalid User Name\n");
106 return -1;
109 memset(pc->outBuf,0,1024);
110 sprintf(pc->outBuf,"PASS %s\r\n",pass);
111 send(pc->s, pc->outBuf, strlen(pc->outBuf),0 );
112 size =recv(pc->s,&pc->inBuf,1024,0);
113 memset(temp,0,1024);
114 memcpy(temp,pc->inBuf,size);
115 if( temp[0] != '+' ){
116 fprintf(stderr,"Incorrect Password\n");
117 return -1;
120 return 0;
123 int pop3CheckMail(Pop3 pc){
124 int size;
125 char temp[1024];
126 char *ptr;
127 if( pc->connected == NOT_CONNECTED )
128 return -1;
130 /* Find total number of messages in mail box */
131 sprintf(pc->outBuf,"STAT\r\n");
132 send(pc->s, pc->outBuf, strlen(pc->outBuf),0 );
133 size =recv(pc->s,pc->inBuf,1024,0);
134 memset(temp,0,1024);
135 memcpy(temp,pc->inBuf,size);
136 ptr = strtok(temp, " ");
137 ptr = strtok( 0," ");
138 pc->numOfMessages = atoi(ptr);
140 if( temp[0] != '+' ){
141 perror("Error Reciving Stats");
142 return -1;
145 sprintf(pc->outBuf,"LAST\r\n");
146 send(pc->s, pc->outBuf, strlen(pc->outBuf),0 );
147 size =recv(pc->s,pc->inBuf,1024,0);
148 memset(temp,0,1024);
149 memcpy(temp,pc->inBuf,size);
150 ptr = strtok(temp, " ");
151 ptr = strtok( 0," ");
152 pc->numOfUnreadMessages = pc->numOfMessages - atoi(ptr);
154 if( temp[0] != '+' ){
155 perror("Error Reciving Stats");
156 return -1;
158 return 1;
162 int pop3GetTotalNumberOfMessages( Pop3 pc ){
163 if( pc != 0 )
164 return pc->numOfMessages;
165 return -1;
168 int pop3GetNumberOfUnreadMessages( Pop3 pc ){
169 if( pc != 0)
170 return pc->numOfUnreadMessages;
171 return -1;
174 int pop3Quit(Pop3 pc){
175 int size;
176 if( pc->connected == NOT_CONNECTED )
177 return -1;
178 send(pc->s, "quit\r\n", 6,0 );
179 size =recv(pc->s,&pc->inBuf,1024,0);
180 pc->connected = NOT_CONNECTED;
181 if(pc->s != 0)
182 close(pc->s);
183 return 0;