diff --git a/src/sbbs3/GNUmakefile b/src/sbbs3/GNUmakefile index b644bf9183b465845dc845a5be042870c4143ebf..5094d89a61d7342b2489742abab55656f34ae928 100644 --- a/src/sbbs3/GNUmakefile +++ b/src/sbbs3/GNUmakefile @@ -180,7 +180,7 @@ CON_OBJS = $(EXEODIR)/sbbscon.o $(EXEODIR)/conwrap.o \ $(EXEODIR)/ini_file.o $(EXEODIR)/sbbs_ini.o FTP_OBJS = $(LIBODIR)/ftpsrvr.o MAIL_OBJS = $(LIBODIR)/mailsrvr.o $(LIBODIR)/mxlookup.o \ - $(LIBODIR)/mime.o + $(LIBODIR)/mime.o $(LIBODIR)/base64.o WEB_OBJS = $(LIBODIR)/websrvr.o $(LIBODIR)/sockwrap.o $(LIBODIR)/base64.o SERVICE_OBJS= $(LIBODIR)/services.o diff --git a/src/sbbs3/mime.c b/src/sbbs3/mime.c index dfba7322d2985985896838f839ad78fa0feda0b8..d32223577997a19f3de0e8a56b222ffb611b3696 100644 --- a/src/sbbs3/mime.c +++ b/src/sbbs3/mime.c @@ -43,14 +43,9 @@ #include "sbbs.h" #include "mailsrvr.h" +#include "base64.h" #define SIZEOF_MIMEBOUNDARY 36 -#define BASE64_BITMASK 0x0000003F - -static const char * base64alphabet = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; - -static void tobase64(char * in, char * out, int bytesread); char * mimegetboundary() { @@ -106,36 +101,23 @@ void mimetextpartheader(SOCKET socket, char * boundary) BOOL base64out(SOCKET socket, char * pathfile) { FILE * fp; - char in[3]={0}; - char out[5]; /* one for the '\0' */ - char line[77]; /* one for the '\0' */ + char in[57]; + char out[77]; int bytesread; - int i = 0; if((fp=fopen(pathfile,"rb"))==NULL) return(FALSE); while(1) { - bytesread=fread(in,1,3,fp); - tobase64(in,out,bytesread); - if(i==0) - strcpy(line,out); - else - strcat(line,out); - if(i==18) { - if(!sockprintf(socket,line)) { - fclose(fp); - return(FALSE); - } - i=-1; - } - if(bytesread!=3 || feof(fp)) + bytesread=fread(in,1,57,fp); + if((b64_encode(out,in,sizeof(out),bytesread)==NULL) + || !sockprintf(socket,out)) { + fclose(fp); + return(FALSE); + } + if(bytesread!=57 || feof(fp)) break; - i++; - memset(in,0,3); } fclose(fp); - if(i!=-1) /* already printed the last line */ - sockprintf(socket,line); sockprintf(socket,""); return(TRUE); } @@ -181,38 +163,3 @@ void endmime(SOCKET socket, char * boundary) sockprintf(socket,bndline); sockprintf(socket,""); } - -static void tobase64(char * in, char * out, int bytesread) -{ -#define BITCAST_MASK 0x000000FF - unsigned int tmpnum0 = ((unsigned int)in[0])&BITCAST_MASK; - unsigned int tmpnum1 = ((unsigned int)in[1])&BITCAST_MASK; - unsigned int data = ((unsigned int)in[2])&BITCAST_MASK; - - data|=(tmpnum1<<8); - data|=(tmpnum0<<16); - if(bytesread==0) { - out[0]='\0'; - return; - } - out[4]='\0'; - out[3]=base64alphabet[(data&BASE64_BITMASK)]; - out[2]=base64alphabet[((data>>6)&BASE64_BITMASK)]; - out[1]=base64alphabet[((data>>12)&BASE64_BITMASK)]; - out[0]=base64alphabet[((data>>18)&BASE64_BITMASK)]; - if(bytesread==1) { - /* pad last bytes */ - out[3]=base64alphabet[64]; - out[2]=base64alphabet[64]; - } - else if(bytesread==2) - out[3]=base64alphabet[64]; - -#undef BITCAST_MASK -} - - - - - -