Dennis Wronka
Soulcollector
So, nachdem deepthroat mir schon dabei auf die Spruenge geholfen hat wie ich vernuenftig mit Strings in C umgehen kann hab ich meinen Virenscanner soweit laufen und wuerde gerne, da ich ja schon ewig nichts mehr mit C gemacht hab, und auch zuvor nie wirklich sehr viel damit gearbeitet hab, und somit vieles wieder vergessen hab darum bitten mir aufzuzeigen wo man den Source noch optimierien kann.
Ich hab schon die festgesetzten Grenzen der Char-Arrays beseitigt indem ich mit Pointern und malloc() und realloc() arbeite, da die Groesse der zu scannenden eMails ja nicht im Voraus bekannt ist.
Ich weiss, dass ich eine der strcat()-Anweisungen zusammenfassen koennte, dies habe ich aber bewusst nicht gemacht um diese aus Gruenden der Lesbarkeit nicht endlos lang werden zu lassen.
Aber zum Beispiel wuerde ich gern wissen ob ich diese 3 Anweisungen zusammenfassen kann.
Stringverkettung mit . wie in PHP hat auf jeden Fall nicht geholfen, aber vielleicht kann man das in C auch irgendwie machen.
Naja, wie gesagt, ich wuerde mich freuen wenn mal jemand einen Blick auf den Source werfen koennte und mir Tipps zur Verbesserung geben koennte.
Ich hab schon die festgesetzten Grenzen der Char-Arrays beseitigt indem ich mit Pointern und malloc() und realloc() arbeite, da die Groesse der zu scannenden eMails ja nicht im Voraus bekannt ist.
Ich weiss, dass ich eine der strcat()-Anweisungen zusammenfassen koennte, dies habe ich aber bewusst nicht gemacht um diese aus Gruenden der Lesbarkeit nicht endlos lang werden zu lassen.
Aber zum Beispiel wuerde ich gern wissen ob ich diese 3 Anweisungen zusammenfassen kann.
Code:
strcat(email,"X-Virus-Checker: Scanned by mailscan ");
strcat(email,mailscanversion);
strcat(email," (No virus found)\r\n");
Naja, wie gesagt, ich wuerde mich freuen wenn mal jemand einen Blick auf den Source werfen koennte und mir Tipps zur Verbesserung geben koennte.
Code:
/***************************************************************************
* Copyright (C) 2005 by Dennis Wronka *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program; if not, write to the *
* Free Software Foundation, Inc., *
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
***************************************************************************/
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <clamav.h>
const char mailscanversion[4]="0.8";
const unsigned long initialmemsize=1024;
int ret,length;
unsigned int signo;
unsigned long memsize,memcount;
struct cl_node *node;
const char *virname;
char input[1],scantmpname[128];
char *data,*email,*part1,*part2;
FILE *scantmpfile;
int main(int argc, char *argv[])
{
cl_loaddbdir(cl_retdbdir(),&node,&signo);
cl_build(node);
memsize=initialmemsize;
data=malloc(memsize);
data[0]=(char)NULL;
memcount=0;
while (scanf("%c",&input)!=EOF)
{
memcount++;
if (memcount>=memsize)
{
memsize+=initialmemsize;
data=realloc(data,memsize);
}
strcat(data,input);
}
email=malloc(memsize);
email[0]=(char)NULL;
sprintf(scantmpname,"/tmp/mailscan%u",rand());
scantmpfile=fopen(scantmpname,"w");
fwrite(data,sizeof(char),strlen(data),scantmpfile);
fclose(scantmpfile);
ret=cl_scanfile(scantmpname,&virname,NULL,node,NULL,CL_SCAN_MAIL);
unlink(scantmpname);
part1=strstr(data,"Subject:");
part2=strstr(part1,"\n");
strncpy(email,data,strlen(data)-strlen(part2)+2);
email[strlen(data)-strlen(part2)+1]=(char)NULL;
if (ret==CL_VIRUS)
{
strcat(email,"X-Virus-Status: Yes\r\n");
strcat(email,"X-Virus-Checker: Scanned by mailscan ");
strcat(email,mailscanversion);
strcat(email," (Virus found: ");
strcat(email,virname);
strcat(email,")\r\n");
}
else if (ret==CL_CLEAN)
{
strcat(email,"X-Virus-Status: No\r\n");
strcat(email,"X-Virus-Checker: Scanned by mailscan ");
strcat(email,mailscanversion);
strcat(email," (No virus found)\r\n");
}
else
{
strcat(email,"X-Virus-Status: Error\r\n");
strcat(email,"X-Virus-Checker: Scanned by mailscan ");
strcat(email,mailscanversion);
strcat(email," (Scan error: ");
strcat(email,cl_strerror(ret));
strcat(email,")\r\n");
}
cl_free(node);
strcat(email,part2+1);
printf("%s",email);
free(email);
free(data);
return EXIT_SUCCESS;
}