[Pkg-clamav-commits] [SCM] Debian repository for ClamAV branch, debian/unstable, updated. debian/0.95+dfsg-1-6156-g094ec9b
aCaB
acab at clamav.net
Sun Apr 4 01:08:05 UTC 2010
The following commit has been merged in the debian/unstable branch:
commit 29ec8246ee33511071477e66b6d2b36316aeece9
Author: aCaB <acab at clamav.net>
Date: Sun Oct 18 16:52:17 2009 +0200
win32: globbing complete
diff --git a/ChangeLog b/ChangeLog
index f9ced8b..b20c189 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Sun Oct 18 16:52:41 CEST 2009 (acab)
+------------------------------------
+ * win32: glob() complete
+
Sun Oct 18 02:30:14 CEST 2009 (acab)
------------------------------------
* win32: glob() before main (WIP)
diff --git a/win32/compat/setargv.c b/win32/compat/setargv.c
index 8bbd00d..00d3821 100644
--- a/win32/compat/setargv.c
+++ b/win32/compat/setargv.c
@@ -21,206 +21,235 @@
#if HAVE_CONFIG_H
#include "clamav-config.h"
#endif
-
-#include "dirent.h"
-#include "libgen.h"
-
-/* THIS IS A HACK ! */
-/* _setargv is the designed way to customize command line parsing which we use here
- for globbing reasons (incidentally the globbing in setargv.obj is badly broken)
-
- The crt first calls OUR _setargv from pre_c_init but later, from within pre_cpp_init,
- it also calls ITS OWN BUILTIN NATIVE CRAP, which re-parses the command line and
- eventually overrides our override.
-
- So, we additionally replace the command line global pointer _acmdln with a
- crafted set of arguments in order to fool buggy CRT's.
-*/
-#define _MY_CRT_INSISTS_ON_PARSING_THE_COMMAND_LINE_TWICE_FOR_NO_REASONS_
-#ifdef _MY_CRT_INSISTS_ON_PARSING_THE_COMMAND_LINE_TWICE_FOR_NO_REASONS_
-extern char ** __p__acmdln(void);
-#endif
-
-void glob_add(const char *path, int *argc, char ***argv);
-
-int _setargv() {
- char *cur = GetCommandLineA(), *begparm = NULL, *endparm = NULL;
- char **argv = NULL, c;
- int argc = 0, i, in_sq = 0, in_dq = 0, need_glob = 0;
- int *g_argc = __p___argc();
- char ***g_argv = __p___argv();
-
- do {
- c = *cur;
- switch(c) {
- case '\0':
- endparm = cur;
- break;
- case ' ':
- if(begparm && !(in_sq | in_dq))
- endparm = cur;
- break;
- case '\'':
- if(!in_dq) {
- in_sq = !in_sq;
- if(!in_sq)
- endparm = cur;
- }
- break;
- case '"':
- if(!in_sq) {
- in_dq = !in_dq;
- if(!in_dq)
- endparm = cur;
- }
- break;
- case '*':
-// case '?':
- if(!in_sq)
- need_glob = 1;
- default:
- if(!begparm) {
- begparm = cur;
- endparm = NULL;
- }
- }
- if (begparm && endparm) {
- if(begparm < endparm) {
- char *path = malloc(endparm - begparm + 1);
-
- memcpy(path, begparm, endparm - begparm);
- path[endparm - begparm] = '\0';
- if(argc || need_glob)
- glob_add(path, &argc, &argv);
- else {
- argv = realloc(argv, sizeof(*argv) * (argc + 1));
- argv[argc] = path;
- argc++;
- }
- }
- need_glob = 0;
- in_sq = 0;
- in_dq = 0;
- begparm = NULL;
- endparm = NULL;
- }
- cur++;
- } while (c);
-
- if(argc) {
- int i, argvlen = sizeof(*argv) * (argc + 1), argclen = 0;
- argv = realloc(argv, argvlen);
- argv[argc] = NULL;
- for(i=0; i<argc; i++) {
- int curlen = strlen(argv[i]) + 1;
- char *curarg;
- argv = realloc(argv, argvlen + argclen + curlen);
- curarg = (char *)argv + argvlen + argclen;
- memcpy(curarg, argv[i], curlen);
- argclen += curlen;
- free(argv[i]);
- argv[i] = curarg;
- }
-#ifdef _MY_CRT_INSISTS_ON_PARSING_THE_COMMAND_LINE_TWICE_FOR_NO_REASONS_
- {
- char *fake_cmdl = malloc(argclen + 1 + 2*argc);
- char *curarg = fake_cmdl;
- char **g_cmdl = __p__acmdln();
- for(i=0; i<argc; i++)
- curarg += sprintf(curarg, "\"%s\" ", argv[i]);
- curarg--;
- *curarg = '\0';
- *g_cmdl = fake_cmdl;
- }
-#endif
- *g_argc = argc;
- *g_argv = argv;
- }
- return 0;
-}
-
-void glob_add(const char *path, int *argc, char ***argv) {
- char *tail = strchr(path, '*');
- char *dup1, *dup2, *dir, *base, *taildirsep, *tailwldsep;
- struct dirent *de;
- int baselen, taillen, dirlen, mergedir = 0;
- DIR *d;
-
- if(!tail) {
- MessageBox(0, path, 0, MB_ICONINFORMATION);
- *argv = realloc(*argv, sizeof(**argv) * (*argc + 1));
- (*argv)[*argc] = path;
- (*argc)++;
- return;
- }
-
- if(tail!=path && tail[-1] == '\\') {
- tail[-1] = '\0';
- mergedir = 1;
- }
- *tail = '\0';
- tail++;
- taillen = strlen(tail);
- taildirsep = strchr(tail, '\\');
- if(taildirsep && taildirsep - tail == taillen - 1) {
- *taildirsep = '\0';
- taildirsep = NULL;
- taillen--;
- }
- if(!taildirsep)
- taildirsep = tail + taillen;
- if(!(tailwldsep = strchr(tail, '*')))
- tailwldsep = tail + taillen;
-
- dup1 = strdup(path);
- dup2 = strdup(path);
-
- if(!mergedir) {
- dir = dirname(dup1);
- base = basename(dup2);
- } else {
- dir = dup1;
- base = dup2;
- *dup2 = '\0';
- }
-
- dirlen = strlen(dir);
- baselen = strlen(base);
-
- d = opendir(dir);
- while(d && (de = readdir(d))) {
- int namelen = strlen(de->d_name);
- char *newpath;
-
- if(namelen < baselen) continue;
- if(strncasecmp(base, de->d_name, baselen)) continue;
- if(de->d_type == DT_DIR && taildirsep <= tailwldsep) {
- int d_taillen = taildirsep - tail;
- if(namelen < baselen + d_taillen) continue;
- if(strncasecmp(tail, &de->d_name[namelen - d_taillen], d_taillen)) continue;
- newpath = malloc(dirlen + namelen + taillen - d_taillen + 3);
- sprintf(newpath, "%s\\%s\\%s", dir, de->d_name, &tail[d_taillen+1]);
- glob_add(newpath, argc, argv);
- } else {
- int d_taillen = tailwldsep - tail;
- char *start;
- if(namelen < baselen + d_taillen) continue;
-
- start = &de->d_name[baselen];
- namelen -= baselen;
-
- for(; namelen >= d_taillen; start++, namelen--) {
- if(strncasecmp(start, tail, d_taillen)) continue;
- newpath = malloc(dirlen + (start - de->d_name) + taillen + 2);
- sprintf(newpath, "%s\\", dir);
- memcpy(&newpath[dirlen + 1], de->d_name, start - de->d_name);
- strcpy(&newpath[dirlen + 1 + start - de->d_name], tail);
- glob_add(newpath, argc, argv);
- }
- }
- }
- if(d) closedir(d);
- free(dup1);
- free(dup2);
- free(path);
-}
+
+#include "dirent.h"
+#include "libgen.h"
+
+/* THIS IS A HACK ! */
+/* _setargv is the designed way to customize command line parsing which we use here
+ for globbing reasons (incidentally the globbing in setargv.obj is badly broken)
+
+ The crt first calls OUR _setargv from pre_c_init but later, from within pre_cpp_init,
+ it also calls ITS OWN BUILTIN NATIVE CRAP, which re-parses the command line and
+ eventually overrides our override.
+
+ So, we additionally replace the command line global pointer _acmdln with a
+ crafted set of arguments in order to fool buggy CRT's.
+*/
+#define _MY_CRT_INSISTS_ON_PARSING_THE_COMMAND_LINE_TWICE_FOR_NO_REASONS_
+#ifdef _MY_CRT_INSISTS_ON_PARSING_THE_COMMAND_LINE_TWICE_FOR_NO_REASONS_
+extern char ** __p__acmdln(void);
+#endif
+
+int glob_add(const char *path, int *argc, char ***argv);
+
+int _setargv() {
+ char *cur = GetCommandLineA(), *begparm = NULL, *endparm = NULL;
+ char **argv = NULL, c;
+ int argc = 0, i, in_sq = 0, in_dq = 0, need_glob = 0, allarglen = 0;
+ int *g_argc = __p___argc();
+ char ***g_argv = __p___argv();
+
+ do {
+ c = *cur;
+ switch(c) {
+ case '\0':
+ endparm = cur;
+ break;
+ case ' ':
+ if(begparm && !(in_sq | in_dq))
+ endparm = cur;
+ break;
+ case '\'':
+ if(!in_dq) {
+ in_sq = !in_sq;
+ if(!in_sq)
+ endparm = cur;
+ }
+ break;
+ case '"':
+ if(!in_sq) {
+ in_dq = !in_dq;
+ if(!in_dq)
+ endparm = cur;
+ }
+ break;
+ case '*':
+ case '?':
+ if(!in_sq)
+ need_glob = 1;
+ default:
+ if(!begparm) {
+ begparm = cur;
+ endparm = NULL;
+ }
+ }
+ if (begparm && endparm) {
+ if(begparm < endparm) {
+ char *path = malloc(endparm - begparm + 1);
+ int arglen = 0;
+
+ memcpy(path, begparm, endparm - begparm);
+ path[endparm - begparm] = '\0';
+ if(!argc || !need_glob || !(arglen = glob_add(path, &argc, &argv))) {
+ argv = realloc(argv, sizeof(*argv) * (argc + 1));
+ argv[argc] = path;
+ argc++;
+ arglen = endparm - begparm;
+ }
+ allarglen += arglen;
+ }
+ need_glob = 0;
+ in_sq = 0;
+ in_dq = 0;
+ begparm = NULL;
+ endparm = NULL;
+ }
+ cur++;
+ } while (c);
+
+ if(argc) {
+ int i, argvlen = sizeof(*argv) * (argc + 1), argclen = 0;
+ argv = realloc(argv, argvlen + allarglen + argc);
+ argv[argc] = NULL;
+ for(i=0; i<argc; i++) {
+ int curlen = strlen(argv[i]) + 1;
+ char *curarg = (char *)argv + argvlen + argclen;
+ memcpy(curarg, argv[i], curlen);
+ argclen += curlen;
+ free(argv[i]);
+ argv[i] = curarg;
+ }
+#ifdef _MY_CRT_INSISTS_ON_PARSING_THE_COMMAND_LINE_TWICE_FOR_NO_REASONS_
+ {
+ char *fake_cmdl = malloc(argclen + 1 + 2*argc);
+ char *curarg = fake_cmdl;
+ char **g_cmdl = __p__acmdln();
+ for(i=0; i<argc; i++)
+ curarg += sprintf(curarg, "\"%s\" ", argv[i]);
+ curarg--;
+ *curarg = '\0';
+ *g_cmdl = fake_cmdl;
+ }
+#endif
+ *g_argc = argc;
+ *g_argv = argv;
+ }
+ return 0;
+}
+
+int glob_add(const char *path, int *argc, char ***argv) {
+ char *tail = strchr(path, '*'), *tailqmark;
+ char *dup1, *dup2, *dir, *base, *taildirsep, *tailwldsep;
+ struct dirent *de;
+ int baselen, taillen, dirlen, mergedir = 0, outlen = 0;
+ int qmarklen = 0;
+ DIR *d;
+
+ if(strlen(path) > 4 && !memcmp(path, "\\\\?\\", 4))
+ tailqmark = strchr(&path[4], '?');
+ else
+ tailqmark = strchr(path, '?');
+
+ if(tailqmark && (!tail || tailqmark < tail))
+ tail = tailqmark;
+
+ if(!tail) {
+ *argv = realloc(*argv, sizeof(**argv) * (*argc + 1));
+ (*argv)[*argc] = path;
+ (*argc)++;
+ return strlen(path);
+ }
+
+ if(tail!=path && tail[-1] == '\\') {
+ tail[-1] = '\0';
+ mergedir = 1;
+ }
+ while(*tail) {
+ if(*tail == '?') {
+ if(tail == tailqmark || qmarklen)
+ qmarklen++;
+ *tail = 0;
+ } else if(*tail == '*') {
+ *tail = '\0';
+ qmarklen = 0;
+ } else
+ break;
+ tail++;
+ }
+ taillen = strlen(tail);
+ taildirsep = strchr(tail, '\\');
+ if(taildirsep && taildirsep - tail == taillen - 1) {
+ *taildirsep = '\0';
+ taildirsep = NULL;
+ taillen--;
+ }
+ if(!taildirsep)
+ taildirsep = tail + taillen;
+
+ tailwldsep = strchr(tail, '*');
+ tailqmark = strchr(tail, '?');
+ if(tailqmark && (!tailwldsep || tailqmark < tailwldsep))
+ tailwldsep = tailqmark;
+ if(!tailwldsep)
+ tailwldsep = tail + taillen;
+
+ dup1 = strdup(path);
+ dup2 = strdup(path);
+
+ if(!mergedir) {
+ dir = dirname(dup1);
+ base = basename(dup2);
+ } else {
+ dir = dup1;
+ base = dup2;
+ *dup2 = '\0';
+ }
+
+ dirlen = strlen(dir);
+ baselen = strlen(base);
+
+ d = opendir(dir);
+ while(d && (de = readdir(d))) {
+ int namelen = strlen(de->d_name);
+ char *newpath;
+
+ if(!strcmp(de->d_name, ".") || !strcmp(de->d_name, "..")) continue;
+ if(namelen < baselen) continue;
+ if(strncasecmp(base, de->d_name, baselen)) continue;
+ if(de->d_type == DT_DIR && taildirsep < tailwldsep) {
+ int d_taillen = taildirsep - tail;
+ if(namelen < baselen + d_taillen) continue;
+ if(strncasecmp(tail, &de->d_name[namelen - d_taillen], d_taillen)) continue;
+ newpath = malloc(dirlen + namelen + taillen - d_taillen + 3);
+ sprintf(newpath, "%s\\%s\\%s", dir, de->d_name, &tail[d_taillen+1]);
+ outlen += glob_add(newpath, argc, argv);
+ } else {
+ int d_taillen = tailwldsep - tail;
+ char *start;
+ if(namelen < baselen + d_taillen) continue;
+ if(qmarklen && baselen + qmarklen + d_taillen != namelen) continue;
+ if(d_taillen == taillen) {
+ start = &de->d_name[namelen - d_taillen];
+ namelen = d_taillen;
+ } else {
+ start = &de->d_name[baselen];
+ namelen -= baselen;
+ }
+
+ for(; namelen >= d_taillen; start++, namelen--) {
+ if(strncasecmp(start, tail, d_taillen)) continue;
+ newpath = malloc(dirlen + (start - de->d_name) + taillen + 2);
+ sprintf(newpath, "%s\\", dir);
+ memcpy(&newpath[dirlen + 1], de->d_name, start - de->d_name);
+ strcpy(&newpath[dirlen + 1 + start - de->d_name], tail);
+ outlen += glob_add(newpath, argc, argv);
+ }
+ }
+ }
+ if(d) closedir(d);
+ free(dup1);
+ free(dup2);
+ free(path);
+ return outlen;
+}
--
Debian repository for ClamAV
More information about the Pkg-clamav-commits
mailing list