objects.c

Go to the documentation of this file.
00001 /* this is objects.c file
00002  * this is part of the libspopc library sources
00003  * copyright © 2002 Benoit Rouits <brouits@free.fr>
00004  * released under the terms of GNU LGPL
00005  * (GNU Lesser General Public Licence).
00006  * libspopc offers simple API for a pop3 client (MTA).
00007  * See RFC 1725 for pop3 specifications.
00008  * more information on http://brouits.free.fr/libspopc/
00009  */
00010 #include <stdlib.h>
00011 #include <string.h>
00012 #include <sys/types.h>
00013 
00014 #ifdef _MSC_VER
00015 #include <winsock.h>
00016 #else
00017 #include <sys/socket.h>
00018 #include <netdb.h>
00019 #endif
00020 
00021 #include "libspopc.h"
00022 
00023 /***************************************************
00024  * high-level methods for a SIMPLE MTA *
00025  ***************************************************/
00026 
00027 char* popbegin(const char* servername, const char* user, const char* pass, popsession** sp){
00028 /* prepares, connect and get lists of messages stored on pop server */
00029 /* you must give a valid servername, user and pass */
00030 /* returns an error message if a problem occurs, else NULL */
00031 int r=0;
00032 char* resp=NULL;
00033 char* err=NULL;
00034 popsession* s;
00035         
00036         if(!(servername && user && pass)){
00037                 err=strdup("NULL args !");
00038                 return(err);
00039         }
00040         s=(popsession*)malloc(sizeof(popsession));
00041         if(!s){
00042                 err=strdup("malloc");
00043                 return(err);
00044         }
00045    s->server=NULL;
00046         s->connection=(struct sockaddr_in*)malloc(sizeof(struct sockaddr_in));
00047         if(!(s->connection)){
00048                 err=strdup("malloc");
00049                 free(s);s=NULL;
00050                 return(err);
00051         }
00052         r=pop3_prepare(servername,110,s->connection,s->server);
00053         if(r==-1){
00054                 err=strdup("pop3_prepare");
00055                 free(s->connection);s->connection=NULL;
00056                 free(s);s=NULL;
00057                 return(err);
00058         }
00059         s->sock=r;
00060         resp=pop3_connect(s->sock,s->connection);
00061         if(!resp){
00062                 err=strdup("pop3_connect");
00063                 pop3_disconnect(s->sock);
00064                 free(s->connection);s->connection=NULL;
00065                 free(s);s=NULL;
00066                 return(err);
00067         }
00068         free(resp);
00069         resp=pop3_user(s->sock,user);
00070         if((!resp) || pop3_error(resp)){
00071                 pop3_disconnect(s->sock);
00072                 free(s->connection);s->connection=NULL;
00073                 free(s);s=NULL;
00074                 err=resp?resp:strdup("pop3_user");
00075                 return(err);
00076         }
00077         free(resp);
00078         resp=pop3_pass(s->sock,pass);
00079         if((!resp) || pop3_error(resp)){
00080                 pop3_disconnect(s->sock);
00081                 free(s->connection);s->connection=NULL;
00082                 free(s);s=NULL;
00083                 err=resp?resp:strdup("pop3_pass");
00084                 return(err);
00085         }
00086         s->state=TRANSACTION;
00087         free(resp);resp=NULL;
00088         resp=pop3_stat(s->sock);
00089         if((!resp) || pop3_error(resp)){
00090                 pop3_disconnect(s->sock);
00091                 free(s->connection);s->connection=NULL;
00092                 free(s);s=NULL;
00093                 err=resp?resp:strdup("pop3_stat");
00094                 return(err);
00095         }
00096         s->bytes=stat2bytes(resp);
00097         s->last=stat2last(resp);
00098         free(resp);
00099         resp=pop3_list(s->sock,0);
00100         if((!resp) || pop3_error(resp)){
00101                 pop3_disconnect(s->sock);
00102                 free(s->connection);s->connection=NULL;
00103                 free(s);s=NULL;
00104                 err=resp?resp:strdup("pop3_list");
00105                 return(err);
00106         }
00107         s->list=list2array(resp);
00108         free(resp);resp=NULL;
00109         resp=pop3_uidl(s->sock,0);
00110         if((!resp) || pop3_error(resp)){
00111                 pop3_disconnect(s->sock);
00112                 free(s->connection);s->connection=NULL;
00113                 free(s);s=NULL;
00114                 err=resp?resp:strdup("pop3_uidl");
00115                 return(err);
00116         }
00117         s->uidl=uidl2array(resp);
00118         s->del=0;
00119         (*sp)=s;
00120         free(resp);resp=NULL;
00121         return(NULL);
00122 }
00123 
00124 char* popgethead(popsession* session, int id){
00125 /* returns the header of a message (id from 1 to popnum()) or NULL if bad id */
00126 char* resp;
00127 char* msg;
00128         if(!session){
00129                 return(NULL);
00130         }
00131         if((id>popnum(session)) || (id < 1)){
00132                 return(NULL);
00133         }
00134         resp=pop3_top(session->sock,id,0);
00135         if((!resp) || pop3_error(resp)){
00136                 if(resp){
00137                         free(resp);
00138                 }
00139                 return(NULL);
00140         }
00141         msg=retr2msg(resp);
00142         if(!msg){
00143                 msg=resp;
00144         }else{
00145                 free(resp);
00146         }
00147         return(msg);
00148 }
00149                 
00150 char* popgetmsg(popsession* session, int id){
00151 /* returns a message (id from 1 to popnum()) or NULL if bad id */
00152 char* resp;
00153 char* msg;
00154 
00155         if(!session){
00156                 return(NULL);
00157         }
00158         if((id > popnum(session)) || (id<1)){
00159                 return(NULL);
00160         }
00161         resp=pop3_retr(session->sock,id);
00162         if((!resp) || pop3_error(resp)){
00163                 if(resp){
00164                         free(resp);
00165                 }
00166                 return(NULL);
00167         }
00168         msg=retr2msg(resp);
00169         if(!msg){
00170                 msg=resp;
00171         }else{
00172                 free(resp);
00173         }
00174         if(session->del){
00175                 pop3_dele(session->sock,id);
00176         }
00177         return(msg);    
00178 }
00179 int popdelmsg(popsession* session, int id){
00180 /* deletes a message 'id' on pop server */
00181 /* returns -1 if no deletion (server error), 0 else */
00182 char* resp;
00183         if(!session){
00184                 return(-1);
00185         }
00186         if((id > popnum(session)) || (id < 1)){
00187                 return(-1);
00188         }
00189         resp=pop3_dele(session->sock,id);
00190         if((!resp) || pop3_error(resp)){
00191                 if(resp){
00192                         free(resp);
00193                 }
00194                 return(-1);
00195         }
00196         free(resp);
00197         resp=pop3_stat(session->sock);
00198         if((!resp) || pop3_error(resp)){
00199                 pop3_disconnect(session->sock);
00200                 free(session->connection);session->connection=NULL;
00201                 free(session);session=NULL;
00202                 return(-1);
00203         }
00204         session->bytes=stat2bytes(resp);
00205         session->last=stat2last(resp);
00206         free(resp);
00207         resp=pop3_list(session->sock,0);
00208         if((!resp) || pop3_error(resp)){
00209                 pop3_disconnect(session->sock);
00210                 free(session->connection);session->connection=NULL;
00211                 free(session);session=NULL;
00212                 return(-1);
00213         }
00214    freelistarray(session->list);
00215         session->list=list2array(resp);
00216         free(resp);resp=NULL;
00217         resp=pop3_uidl(session->sock,0);
00218         if((!resp) || pop3_error(resp)){
00219                 pop3_disconnect(session->sock);
00220                 free(session->connection);session->connection=NULL;
00221                 free(session);session=NULL;
00222                 return(-1);
00223         }
00224    freeuidlarray(session->uidl);
00225         session->uidl=uidl2array(resp);
00226    free(resp);resp=NULL;
00227         return(0);
00228 }
00229 int popcancel(popsession* session){
00230 /* cancel all previous deletions on pop server */
00231 /* returns -1 if server error, 0 else */
00232 char* resp;
00233         if(!session){
00234                 return(-1);
00235         }
00236         resp=pop3_rset(session->sock);
00237         if((!resp) || pop3_error(resp)){
00238                 if(resp){
00239                         free(resp);
00240                 }
00241                 return(-1);
00242         }
00243         free(resp);
00244         resp=pop3_stat(session->sock);
00245         if((!resp) || pop3_error(resp)){
00246                 pop3_disconnect(session->sock);
00247                 free(session->connection);session->connection=NULL;
00248                 free(session);session=NULL;
00249                 return(-1);
00250         }
00251         session->bytes=stat2bytes(resp);
00252         session->last=stat2last(resp);
00253         free(resp);
00254         resp=pop3_list(session->sock,0);
00255         if((!resp) || pop3_error(resp)){
00256                 pop3_disconnect(session->sock);
00257                 free(session->connection);session->connection=NULL;
00258                 free(session);session=NULL;
00259                 return(-1);
00260         }
00261    freelistarray(session->list);
00262         session->list=list2array(resp);
00263         free(resp);resp=NULL;
00264         resp=pop3_uidl(session->sock,0);
00265         if((!resp) || pop3_error(resp)){
00266                 pop3_disconnect(session->sock);
00267                 free(session->connection);session->connection=NULL;
00268                 free(session);session=NULL;
00269                 return(-1);
00270         }
00271    freeuidlarray(session->uidl);
00272         session->uidl=uidl2array(resp);
00273         free(resp);resp=NULL;
00274         return(0);
00275 }
00276 
00277 void popend(popsession* session){
00278 /* quit and destroys pop session */
00279 int i;
00280 char* resp;
00281 
00282         if(!session){return;}
00283         resp=pop3_quit(session->sock);
00284    free(resp);resp=NULL;
00285         pop3_disconnect(session->sock);
00286         free(session->connection);
00287         /* do not free(session->server); for it is collected by gethostbyname */
00288         free(session->list);
00289         for(i=0;i<=session->last;i++){
00290                 free(session->uidl[i]);
00291         }
00292         free(session->uidl);
00293         free(session);
00294         return;
00295 }
00296 
00297 
Generated on Wed Feb 29 22:50:05 2012 for CXXUtilities by  doxygen 1.6.3