summaryrefslogtreecommitdiffstats
path: root/src/klammail/options.c
diff options
context:
space:
mode:
authorMavridis Philippe <[email protected]>2021-01-13 19:26:24 +0200
committerMavridis Philippe <[email protected]>2021-01-13 19:26:24 +0200
commit8c20dc919f7d54eb48fb60f39ba5e1d466a70763 (patch)
tree44d89f278d5dd066603e5ab9c0b270bc8eb4ad51 /src/klammail/options.c
downloadklamav-8c20dc919f7d54eb48fb60f39ba5e1d466a70763.tar.gz
klamav-8c20dc919f7d54eb48fb60f39ba5e1d466a70763.zip
Initial commit
Signed-off-by: Mavridis Philippe <[email protected]>
Diffstat (limited to 'src/klammail/options.c')
-rwxr-xr-xsrc/klammail/options.c358
1 files changed, 358 insertions, 0 deletions
diff --git a/src/klammail/options.c b/src/klammail/options.c
new file mode 100755
index 0000000..ffefd48
--- /dev/null
+++ b/src/klammail/options.c
@@ -0,0 +1,358 @@
+/*
+ * Copyright (C) 2001-2002 Tomasz Kojm <[email protected]>
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * Sat Sep 14 22:18:20 CEST 2002: included getfirst*(), getnext*() functions
+ * from Alejandro Dubrovsky <[email protected]>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <clamav.h>
+#define _GNU_SOURCE
+#include "getopt.h"
+
+#if defined(C_LINUX) && defined(CL_DEBUG)
+#include <sys/resource.h>
+#endif
+
+#include "options.h"
+//#include "others.h"
+//#include "shared.h"
+#include "memory.h"
+
+void clamdscan(struct optstruct *opt);
+
+int main(int argc, char **argv)
+{
+ int ret, opt_index, i, len;
+ struct optstruct *opt;
+
+ const char *getopt_parameters = "hvfd:wriVql:";
+
+ static struct option long_options[] = {
+ {"help", 0, 0, 'h'},
+ {"quiet", 0, 0, 0},
+ {"verbose", 0, 0, 'v'},
+ {"version", 0, 0, 'V'},
+ {"config-file", 1, 0, 0},
+ {"tempdir", 1, 0, 0},
+ {"database", 1, 0, 'd'},
+ {"quick", 0, 0, 'q'},
+ {"whole-file", 0, 0, 'w'}, /* not used */
+ {"force", 0, 0, 0},
+ {"recursive", 0, 0, 'r'},
+ {"disable-summary", 0, 0, 0},
+ {"infected", 0, 0, 'i'},
+ {"log", 1, 0, 'l'},
+ {"log-verbose", 0, 0, 0},
+ {"threads", 1, 0, 0},
+ {"one-virus", 0, 0, 0}, /* not used */
+
+ {"remove", 0, 0, 0},
+ {"exclude", 1, 0, 0},
+ {"include", 1, 0, 0},
+ {"max-files", 1, 0, 0},
+ {"max-space", 1, 0, 0},
+ {"max-recursion", 1, 0, 0},
+ {"disable-archive", 0, 0, 0},
+
+ {"tag", 0, 0, 0},
+ {"foobar", 0, 0, 'f'},
+ {"admin", 1, 0, 0},
+ {"quar", 1, 0, 0},
+ {"mta", 1, 0, 0},
+ {"spam", 0, 0, 0},
+ {"unzip", 2, 0, 0},
+ {"unrar", 2, 0, 0},
+ {"unace", 2, 0, 0},
+ {"unarj", 2, 0, 0},
+ {"zoo", 2, 0, 0},
+ {"lha", 2, 0, 0},
+ {"jar", 2, 0, 0},
+ {"tar", 2, 0, 0},
+ {"tgz", 2, 0, 0},
+ {"deb", 2, 0, 0},
+ {0, 0, 0, 0}
+ };
+
+#if defined(C_LINUX) && defined(CL_DEBUG)
+ /* [email protected]: create a dump if needed */
+ struct rlimit rlim;
+
+ rlim.rlim_cur = rlim.rlim_max = RLIM_INFINITY;
+ if(setrlimit(RLIMIT_CORE, &rlim) < 0)
+ perror("setrlimit");
+#endif
+
+ opt=(struct optstruct*) mmalloc(sizeof(struct optstruct));
+ opt->optlist = NULL;
+
+ while(1) {
+
+ opt_index=0;
+ ret=getopt_long(argc, argv, getopt_parameters, long_options, &opt_index);
+
+ if (ret == -1)
+ break;
+
+ switch (ret) {
+ case 0:
+ register_long_option(opt, long_options[opt_index].name);
+ break;
+
+ default:
+ if(strchr(getopt_parameters, ret))
+ register_char_option(opt, ret);
+ else {
+ mprintf("!Unknown option passed.\n");
+ free_opt(opt);
+ exit(40);
+ }
+ }
+ }
+
+ if (optind < argc) {
+
+ len=0;
+
+ /* count length of non-option arguments */
+
+ for(i=optind; i<argc; i++)
+ len+=strlen(argv[i]);
+
+ len=len+argc-optind-1; /* add spaces between arguments */
+ opt->filename=(char*)mcalloc(len + 256, sizeof(char));
+
+ for(i=optind; i<argc; i++) {
+ strncat(opt->filename, argv[i], strlen(argv[i]));
+ if(i != argc-1)
+ strncat(opt->filename, " ", 1);
+ }
+
+ } else
+ /* FIXME !!! Without this, we have segfault */
+ opt->filename=(char*)mcalloc(1, sizeof(char));
+
+
+ clamdscan(opt);
+
+ return(0);
+}
+
+void register_char_option(struct optstruct *opt, char ch)
+{
+ struct optnode *newnode;
+
+ newnode = (struct optnode *) mmalloc(sizeof(struct optnode));
+ newnode->optchar = ch;
+ if(optarg != NULL) {
+ newnode->optarg = (char *) mcalloc(strlen(optarg) + 1, sizeof(char));
+ strcpy(newnode->optarg, optarg);
+ } else newnode->optarg = NULL;
+
+ newnode->optname = NULL;
+ newnode->next = opt->optlist;
+ opt->optlist = newnode;
+}
+
+void register_long_option(struct optstruct *opt, const char *optname)
+{
+ struct optnode *newnode;
+
+ newnode = (struct optnode *) mmalloc(sizeof(struct optnode));
+ newnode->optchar = 0;
+ if(optarg != NULL) {
+ newnode->optarg = (char *) mcalloc(strlen(optarg) + 1, sizeof(char));
+ strcpy(newnode->optarg, optarg);
+ } else newnode->optarg = NULL;
+
+ newnode->optname = (char *) mcalloc(strlen(optname) + 1, sizeof(char));
+ strcpy(newnode->optname, optname);
+ newnode->next = opt->optlist;
+ opt->optlist = newnode;
+}
+
+int optc(const struct optstruct *opt, char ch)
+{
+ struct optnode *handler;
+
+ handler = opt->optlist;
+
+ while(1) {
+ if(handler) {
+ if(handler->optchar == ch) return 1;
+ } else break;
+ handler = handler->next;
+ }
+
+ return(0);
+}
+
+int optl(const struct optstruct *opt, const char *optname)
+{
+ struct optnode *handler;
+
+ handler = opt->optlist;
+
+ while(1) {
+ if(handler) {
+ if(handler->optname)
+ if(!strcmp(handler->optname, optname)) return 1;
+ } else break;
+ handler = handler->next;
+ }
+
+ return(0);
+}
+
+char *getargc(const struct optstruct *opt, char ch)
+{
+ struct optnode *handler;
+
+ handler = opt->optlist;
+
+ while(1) {
+ if(handler) {
+ if(handler->optchar == ch) return handler->optarg;
+ } else break;
+ handler = handler->next;
+ }
+
+ return(NULL);
+}
+
+char *getfirstargc(const struct optstruct *opt, char ch, struct optnode **optnode)
+{
+ struct optnode *handler;
+
+ handler = opt->optlist;
+
+ while(1) {
+ if(handler) {
+ if(handler->optchar == ch) {
+ *optnode = handler;
+ return handler->optarg;
+ }
+ } else break;
+ handler = handler->next;
+ }
+ *optnode = NULL;
+ return(NULL);
+}
+
+char *getnextargc(struct optnode **optnode, char ch)
+{
+ struct optnode *handler;
+
+ handler = (*optnode)->next;
+
+ while(1) {
+ if(handler) {
+ if(handler->optchar == ch) {
+ *optnode = handler;
+ return handler->optarg;
+ }
+ } else break;
+ handler = handler->next;
+ }
+ *optnode = NULL;
+ return(NULL);
+}
+
+char *getargl(const struct optstruct *opt, const char *optname)
+{
+ struct optnode *handler;
+
+ handler = opt->optlist;
+
+ while(1) {
+ if(handler) {
+ if(handler->optname)
+ if(!strcmp(handler->optname, optname)) return handler->optarg;
+ } else break;
+ handler = handler->next;
+ }
+
+ return(NULL);
+}
+
+char *getfirstargl(const struct optstruct *opt, const char *optname, struct optnode **optnode)
+{
+ struct optnode *handler;
+
+ handler = opt->optlist;
+
+ while(1) {
+ if(handler) {
+ if(handler->optname)
+ if(!strcmp(handler->optname, optname)) {
+ *optnode = handler;
+ return handler->optarg;
+ }
+ } else break;
+ handler = handler->next;
+ }
+
+ *optnode = NULL;
+ return(NULL);
+}
+
+char *getnextargl(struct optnode **optnode, const char *optname)
+{
+ struct optnode *handler;
+
+ handler = (*optnode)->next;
+
+ while(1) {
+ if(handler) {
+ if(handler->optname)
+ if(!strcmp(handler->optname, optname)) {
+ *optnode = handler;
+ return handler->optarg;
+ }
+ } else break;
+ handler = handler->next;
+ }
+
+ *optnode = NULL;
+ return(NULL);
+}
+
+void free_opt(struct optstruct *opt)
+{
+ struct optnode *handler, *prev;
+
+ if(!opt || !opt->optlist)
+ return;
+
+ mprintf("*Freeing option list... ");
+ handler = opt->optlist;
+
+ while(handler != NULL) {
+ handler->optchar = 0;
+ if(handler->optarg) free(handler->optarg);
+ if(handler->optname) free(handler->optname);
+ prev = handler;
+ handler = handler->next;
+ free(prev);
+ }
+
+ free(opt->filename);
+ free(opt);
+ mprintf("*done\n");
+}