#include #include #include #include #include #include "arch.h" #ifdef NIX #include #include #else #include #endif #include #include "functions.h" #include "structures.h" #include "vars.h" static int socketdesc = -1; /*---------------------------------------------------------------- * * Connection * * * * Create the socket and connect to server * * --------------------------------------------------------------*/ int Connection(char *server, int port, int helo) { struct hostent *HostEnt; // host server descriptor struct sockaddr_in serv_addr; // server adresse char bufw[80]; // command buffer // socket programming under m$ windows needs theses lines #ifdef NIX #else WSADATA WSAData; WSAStartup(MAKEWORD(2,0), &WSAData); #endif HostEnt = gethostbyname(server); printf("\n%s\n", server); if (HostEnt == NULL) { GtkError("Can't get server ip adress (resolv problem)", 0); return (0); } memset (&serv_addr, 0, sizeof (serv_addr)); // initilization of serv_addr memcpy (&serv_addr.sin_addr, HostEnt->h_addr, HostEnt->h_length); // copy of host server adress serv_addr.sin_port = htons (port); // port to connect to serv_addr.sin_family = AF_INET; // AF_*** : INET=internet if ((socketdesc = socket (AF_INET, SOCK_STREAM, 0)) < 0) { GtkError("Can't create socket !", 0); return (0); } if (connect(socketdesc, (struct sockaddr*) &serv_addr, sizeof(serv_addr)) < 0) { GtkError("Can't connect to socket !", 0); return (0); } else { ReadFromSocket(socketdesc); if(helo) { strcpy (bufw, "HELO "); gethostname(bufw + 5, sizeof(bufw) - 5); SendToSocket(bufw); ReadFromSocket(); } return (1); } } /*---------------------------------------------------------------- * SendToSocket * * * * Send requete to the serveur, ended by CRLF * * --------------------------------------------------------------*/ void SendToSocket(char *buffer) { send(socketdesc, buffer, strlen (buffer), 0); send(socketdesc, "\r\n", 2, 0); } /*---------------------------------------------------------------- * ReadFromSocket * * * * Read from socket till "LF" (\n) * * --------------------------------------------------------------*/ void ReadFromSocket() { int posbuf; posbuf = 0; do recv(socketdesc, ReadBuffer + posbuf, 1, 0); while(ReadBuffer[posbuf++] != '\n' && posbuf < readbuffersize); ReadBuffer[posbuf-1] = '\0'; if(ReadBuffer[posbuf-2] == '\r') ReadBuffer[posbuf-2] = '\0'; } /*---------------------------------------------------------------- * Deconnection * * * * Close the socket safely * * --------------------------------------------------------------*/ void Deconnection() { SendToSocket("QUIT"); ReadFromSocket(); shutdown (socketdesc, 2); close (socketdesc); } /*---------------------------------------------------------------- * CheckM * * * * Check mails (POP) * * --------------------------------------------------------------*/ int CheckM() { int nb, i, flag, posbuf; char *t, *n_, *var_To, *var_From, *var_Date, *var_Subject, *var_Content, *var_Cc; sqlite3_stmt *stmt; var_To = ""; var_From = ""; var_Date = ""; var_Subject = ""; var_Content = ""; var_Cc = ""; if(!Connection(Widgets.AccInfos.POPServer, 110, 0)) { return 1; } SendToSocket(g_strdup_printf("USER %s", Widgets.AccInfos.User)); ReadFromSocket(); SendToSocket(g_strdup_printf("PASS %s", Widgets.AccInfos.Passwd)); ReadFromSocket(); if(strcmp("-ERR authorization failed\0", (char*)ReadBuffer)==0) GtkError("Authorization failed !\nCheck your login and password !", 0); SendToSocket("STAT"); ReadFromSocket(); n_ = 0; n_ = strchr((char *)ReadBuffer, ' '); if(n_) { *n_++ = 0; nb = atoi(n_); } i = 1; for(i = 1; i <= nb; i++) { SendToSocket(g_strdup_printf("RETR %d", i)); ReadFromSocket(); ReadBuffer[0] = '\0'; flag = 0; do { posbuf= 0; if(flag != -1) { flag = 0; do { recv(socketdesc, ReadBuffer + posbuf, 1, 0); posbuf++; } while(ReadBuffer[posbuf-2] != '\r' || ReadBuffer[posbuf-1] != '\n'); ReadBuffer[posbuf-1] = '\0'; if(ReadBuffer[0] == '\r') flag = -1; if(ReadBuffer[posbuf-2] == '\r') ReadBuffer[posbuf-2] = '\0'; t = 0; t = strchr((char *)ReadBuffer, ' '); if(t) { *t++ = 0; if(strcmp((char *)ReadBuffer, "To:") == 0) var_To = g_strdup_printf("%s", t); if(strcmp((char *)ReadBuffer, "From:") == 0) var_From = g_strdup_printf("%s", t); if(strcmp((char *)ReadBuffer, "Date:") == 0) var_Date = g_strdup_printf("%s", t); if(strcmp((char *)ReadBuffer, "Subject:") == 0) var_Subject = g_strdup_printf("%s", t); if(strcmp((char *)ReadBuffer, "CC:") == 0) var_Cc = g_strdup_printf("%s", t); } } else { do { recv(socketdesc, ReadBuffer + posbuf, 1, 0); posbuf++; } while((ReadBuffer[posbuf-4] != '\n' || ReadBuffer[posbuf-3] != '.' || ReadBuffer[posbuf-2] != '\r' || ReadBuffer[posbuf-1] != '\n') && posbuf <= readbuffersize); ReadBuffer[posbuf] = '\0'; var_Content = (char *) ReadBuffer; } } while(ReadBuffer[posbuf-4] != '\n' || ReadBuffer[posbuf-3] != '.' || ReadBuffer[posbuf-2] != '\r' || ReadBuffer[posbuf-1] != '\n'); if ( sqlite3_prepare(Widgets.db, "INSERT INTO mails VALUES (?, ?, ?, ?, ?, ?, ?)", -1, &stmt, 0) != SQLITE_OK) printf("\nCould not prepare statement."); if (sqlite3_bind_text(stmt, 1, Widgets.CurrentAccount, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_bind_text(stmt, 2, var_From, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_bind_text(stmt, 3, var_To, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_bind_text(stmt, 4, var_Cc, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_bind_text(stmt, 5, var_Date, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_bind_text(stmt, 6, var_Subject, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_bind_text(stmt, 7, var_Content, -1, SQLITE_STATIC) != SQLITE_OK) printf("\nCould not bind text.\n"); if (sqlite3_step(stmt) != SQLITE_DONE) printf("\nCould not step (execute) stmt.\n"); SendToSocket(g_strdup_printf("DELE %d", i)); ReadFromSocket(); } Deconnection(); return 0; }