| ... | ... |
@@ -1,3 +1,7 @@ |
| 1 |
+Sun Oct 29 15:36:21 CET 2006 (tk) |
|
| 2 |
+--------------------------------- |
|
| 3 |
+ * clamscan, clamdscan: new option --copy, patch from aCaB |
|
| 4 |
+ |
|
| 1 | 5 |
Sun Oct 29 15:06:21 CET 2006 (tk) |
| 2 | 6 |
--------------------------------- |
| 3 | 7 |
* clamd/thrmgr.c: fix possible memory leaks and improve handling of memory |
| ... | ... |
@@ -53,7 +53,7 @@ int main(int argc, char **argv) |
| 53 | 53 |
time_t starttime; |
| 54 | 54 |
struct optstruct *opt; |
| 55 | 55 |
char *clamdscan_accepted[] = { "help", "version", "verbose", "quiet",
|
| 56 |
- "stdout", "log", "move", "remove", |
|
| 56 |
+ "stdout", "log", "move", "copy", "remove", |
|
| 57 | 57 |
"config-file", "no-summary", |
| 58 | 58 |
"disable-summary", NULL }; |
| 59 | 59 |
|
| ... | ... |
@@ -149,6 +149,7 @@ void help(void) |
| 149 | 149 |
mprintf(" --log=FILE -l FILE Save scan report in FILE\n");
|
| 150 | 150 |
mprintf(" --remove Remove infected files. Be careful!\n");
|
| 151 | 151 |
mprintf(" --move=DIRECTORY Move infected files into DIRECTORY\n");
|
| 152 |
+ mprintf(" --copy=DIRECTORY Copy infected files into DIRECTORY\n");
|
|
| 152 | 153 |
mprintf(" --config-file=FILE Read configuration from FILE.\n");
|
| 153 | 154 |
mprintf(" --infected -i Only print infected files\n");
|
| 154 | 155 |
mprintf(" --no-summary Disable summary at end of scanning\n");
|
| ... | ... |
@@ -80,13 +80,13 @@ static int dsresult(int sockd, const struct optstruct *opt) |
| 80 | 80 |
if(strstr(buff, "FOUND\n")) {
|
| 81 | 81 |
infected++; |
| 82 | 82 |
logg("%s", buff);
|
| 83 |
- if(opt_check(opt, "move")) {
|
|
| 83 |
+ if(opt_check(opt, "move") || opt_check(opt, "copy")) {
|
|
| 84 | 84 |
/* filename: Virus FOUND */ |
| 85 | 85 |
if((pt = strrchr(buff, ':'))) {
|
| 86 | 86 |
*pt = 0; |
| 87 | 87 |
move_infected(buff, opt); |
| 88 | 88 |
} else {
|
| 89 |
- mprintf("@Broken data format. File not moved.\n");
|
|
| 89 |
+ mprintf("@Broken data format. File not %s.\n", opt_check(opt, "move") ? "moved" : "copied");
|
|
| 90 | 90 |
} |
| 91 | 91 |
|
| 92 | 92 |
} else if(opt_check(opt, "remove")) {
|
| ... | ... |
@@ -515,10 +515,12 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 515 | 515 |
char *movedir, *movefilename, *tmp, numext[4 + 1]; |
| 516 | 516 |
struct stat fstat, mfstat; |
| 517 | 517 |
int n, len, movefilename_size; |
| 518 |
+ int moveflag = opt_check(opt, "move"); |
|
| 518 | 519 |
struct utimbuf ubuf; |
| 519 | 520 |
|
| 520 | 521 |
|
| 521 |
- if(!(movedir = opt_arg(opt, "move"))) {
|
|
| 522 |
+ if((moveflag && !(movedir = opt_arg(opt, "move"))) || |
|
| 523 |
+ (!moveflag && !(movedir = opt_arg(opt, "copy")))) {
|
|
| 522 | 524 |
/* Should never reach here */ |
| 523 | 525 |
logg("^opt_arg() returned NULL\n");
|
| 524 | 526 |
notmoved++; |
| ... | ... |
@@ -526,7 +528,7 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 526 | 526 |
} |
| 527 | 527 |
|
| 528 | 528 |
if(access(movedir, W_OK|X_OK) == -1) {
|
| 529 |
- logg("^error moving file '%s': cannot write to '%s': %s\n", filename, movedir, strerror(errno));
|
|
| 529 |
+ logg("^error %s file '%s': cannot write to '%s': %s\n", (moveflag) ? "moving" : "copying", filename, movedir, strerror(errno));
|
|
| 530 | 530 |
notmoved++; |
| 531 | 531 |
return; |
| 532 | 532 |
} |
| ... | ... |
@@ -589,9 +591,9 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 589 | 589 |
} |
| 590 | 590 |
} |
| 591 | 591 |
|
| 592 |
- if(rename(filename, movefilename) == -1) {
|
|
| 592 |
+ if(!moveflag || rename(filename, movefilename) == -1) {
|
|
| 593 | 593 |
if(filecopy(filename, movefilename) == -1) {
|
| 594 |
- logg("^cannot move '%s' to '%s': %s\n", filename, movefilename, strerror(errno));
|
|
| 594 |
+ logg("^cannot %s '%s' to '%s': %s\n", (moveflag) ? "move" : "copy", filename, movefilename, strerror(errno));
|
|
| 595 | 595 |
notmoved++; |
| 596 | 596 |
free(movefilename); |
| 597 | 597 |
return; |
| ... | ... |
@@ -604,7 +606,7 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 604 | 604 |
ubuf.modtime = fstat.st_mtime; |
| 605 | 605 |
utime(movefilename, &ubuf); |
| 606 | 606 |
|
| 607 |
- if(unlink(filename)) {
|
|
| 607 |
+ if(moveflag && unlink(filename)) {
|
|
| 608 | 608 |
logg("^cannot unlink '%s': %s\n", filename, strerror(errno));
|
| 609 | 609 |
notremoved++; |
| 610 | 610 |
free(movefilename); |
| ... | ... |
@@ -612,7 +614,7 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 612 | 612 |
} |
| 613 | 613 |
} |
| 614 | 614 |
|
| 615 |
- logg("%s: moved to '%s'\n", filename, movefilename);
|
|
| 615 |
+ logg("%s: %s to '%s'\n", (moveflag)?"moved":"copied", filename, movefilename);
|
|
| 616 | 616 |
|
| 617 | 617 |
free(movefilename); |
| 618 | 618 |
} |
| ... | ... |
@@ -196,7 +196,7 @@ int main(int argc, char **argv) |
| 196 | 196 |
logg("Not removed: %d\n", claminfo.notremoved);
|
| 197 | 197 |
} |
| 198 | 198 |
if(claminfo.notmoved) {
|
| 199 |
- logg("Not moved: %d\n", claminfo.notmoved);
|
|
| 199 |
+ logg("Not %s: %d\n", opt_check(opt, "copy") ? "moved" : "copied", claminfo.notmoved);
|
|
| 200 | 200 |
} |
| 201 | 201 |
mb = claminfo.blocks * (CL_COUNT_PRECISION / 1024) / 1024.0; |
| 202 | 202 |
logg("Data scanned: %2.2lf MB\n", mb);
|
| ... | ... |
@@ -235,6 +235,7 @@ void help(void) |
| 235 | 235 |
mprintf(" --recursive -r Scan subdirectories recursively\n");
|
| 236 | 236 |
mprintf(" --remove Remove infected files. Be careful!\n");
|
| 237 | 237 |
mprintf(" --move=DIRECTORY Move infected files into DIRECTORY\n");
|
| 238 |
+ mprintf(" --copy=DIRECTORY Copy infected files into DIRECTORY\n");
|
|
| 238 | 239 |
#ifdef HAVE_REGEX_H |
| 239 | 240 |
mprintf(" --exclude=REGEX Don't scan file names matching REGEX\n");
|
| 240 | 241 |
mprintf(" --exclude-dir=REGEX Don't scan directories matching REGEX\n");
|
| ... | ... |
@@ -391,7 +391,7 @@ int scanfile(const char *filename, struct cl_node *root, const struct passwd *us |
| 391 | 391 |
} else {
|
| 392 | 392 |
logg("%s: Removed\n", filename);
|
| 393 | 393 |
} |
| 394 |
- } else if (opt_check(opt, "move")) |
|
| 394 |
+ } else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
|
| 395 | 395 |
move_infected(filename, opt); |
| 396 | 396 |
|
| 397 | 397 |
return 1; |
| ... | ... |
@@ -455,7 +455,7 @@ int scanfile(const char *filename, struct cl_node *root, const struct passwd *us |
| 455 | 455 |
} else {
|
| 456 | 456 |
logg("%s: Removed\n", filename);
|
| 457 | 457 |
} |
| 458 |
- } else if (opt_check(opt, "move")) |
|
| 458 |
+ } else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
|
| 459 | 459 |
move_infected(filename, opt); |
| 460 | 460 |
} |
| 461 | 461 |
return ret; |
| ... | ... |
@@ -618,7 +618,7 @@ int scancompressed(const char *filename, struct cl_node *root, const struct pass |
| 618 | 618 |
} else {
|
| 619 | 619 |
logg("%s: Removed\n", filename);
|
| 620 | 620 |
} |
| 621 |
- } else if (opt_check(opt, "move")) |
|
| 621 |
+ } else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
|
| 622 | 622 |
move_infected(filename, opt); |
| 623 | 623 |
} |
| 624 | 624 |
return ret; |
| ... | ... |
@@ -635,7 +635,7 @@ int scancompressed(const char *filename, struct cl_node *root, const struct pass |
| 635 | 635 |
} else {
|
| 636 | 636 |
logg("%s: Removed\n", filename);
|
| 637 | 637 |
} |
| 638 |
- } else if (opt_check(opt, "move")) |
|
| 638 |
+ } else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
|
| 639 | 639 |
move_infected(filename, opt); |
| 640 | 640 |
} |
| 641 | 641 |
return ret; |
| ... | ... |
@@ -652,7 +652,7 @@ int scancompressed(const char *filename, struct cl_node *root, const struct pass |
| 652 | 652 |
} else {
|
| 653 | 653 |
logg("%s: Removed\n", filename);
|
| 654 | 654 |
} |
| 655 |
- } else if (opt_check(opt, "move")) |
|
| 655 |
+ } else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
|
| 656 | 656 |
move_infected(filename, opt); |
| 657 | 657 |
|
| 658 | 658 |
return 1; |
| ... | ... |
@@ -732,7 +732,7 @@ int scandenied(const char *filename, struct cl_node *root, const struct passwd * |
| 732 | 732 |
} else {
|
| 733 | 733 |
logg("%s: Removed\n", filename);
|
| 734 | 734 |
} |
| 735 |
- } else if (opt_check(opt, "move")) |
|
| 735 |
+ } else if (opt_check(opt, "move") || opt_check(opt, "copy")) |
|
| 736 | 736 |
move_infected(filename, opt); |
| 737 | 737 |
} |
| 738 | 738 |
|
| ... | ... |
@@ -957,10 +957,12 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 957 | 957 |
char *movedir, *movefilename, *tmp, numext[4 + 1]; |
| 958 | 958 |
struct stat fstat, mfstat; |
| 959 | 959 |
int n, len, movefilename_size; |
| 960 |
+ int moveflag = opt_check(opt, "move"); |
|
| 960 | 961 |
struct utimbuf ubuf; |
| 961 | 962 |
|
| 962 | 963 |
|
| 963 |
- if(!(movedir = opt_arg(opt, "move"))) {
|
|
| 964 |
+ if((moveflag && !(movedir = opt_arg(opt, "move"))) || |
|
| 965 |
+ (!moveflag && !(movedir = opt_arg(opt, "copy")))) {
|
|
| 964 | 966 |
/* Should never reach here */ |
| 965 | 967 |
logg("!opt_arg() returned NULL\n", filename);
|
| 966 | 968 |
claminfo.notmoved++; |
| ... | ... |
@@ -968,7 +970,7 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 968 | 968 |
} |
| 969 | 969 |
|
| 970 | 970 |
if(access(movedir, W_OK|X_OK) == -1) {
|
| 971 |
- logg("!Can't move file '%s': cannot write to '%s': %s\n", filename, movedir, strerror(errno));
|
|
| 971 |
+ logg("!Can't %s file '%s': cannot write to '%s': %s\n", (moveflag) ? "move" : "copy", filename, movedir, strerror(errno));
|
|
| 972 | 972 |
claminfo.notmoved++; |
| 973 | 973 |
return; |
| 974 | 974 |
} |
| ... | ... |
@@ -1026,9 +1028,9 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 1026 | 1026 |
} |
| 1027 | 1027 |
} |
| 1028 | 1028 |
|
| 1029 |
- if(rename(filename, movefilename) == -1) {
|
|
| 1029 |
+ if(!moveflag || rename(filename, movefilename) == -1) {
|
|
| 1030 | 1030 |
if(filecopy(filename, movefilename) == -1) {
|
| 1031 |
- logg("!Can't move '%s' to '%s': %s\n", filename, movefilename, strerror(errno));
|
|
| 1031 |
+ logg("!Can't %s '%s' to '%s': %s\n", (moveflag) ? "move" : "copy", filename, movefilename, strerror(errno));
|
|
| 1032 | 1032 |
claminfo.notmoved++; |
| 1033 | 1033 |
free(movefilename); |
| 1034 | 1034 |
return; |
| ... | ... |
@@ -1043,7 +1045,7 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 1043 | 1043 |
ubuf.modtime = fstat.st_mtime; |
| 1044 | 1044 |
utime(movefilename, &ubuf); |
| 1045 | 1045 |
|
| 1046 |
- if(unlink(filename)) {
|
|
| 1046 |
+ if(moveflag && unlink(filename)) {
|
|
| 1047 | 1047 |
logg("!Can't unlink '%s': %s\n", filename, strerror(errno));
|
| 1048 | 1048 |
claminfo.notremoved++; |
| 1049 | 1049 |
free(movefilename); |
| ... | ... |
@@ -1051,7 +1053,7 @@ void move_infected(const char *filename, const struct optstruct *opt) |
| 1051 | 1051 |
} |
| 1052 | 1052 |
} |
| 1053 | 1053 |
|
| 1054 |
- logg("%s: moved to '%s'\n", filename, movefilename);
|
|
| 1054 |
+ logg("%s: %s to '%s'\n", filename, (moveflag) ? "moved" : "copied", movefilename);
|
|
| 1055 | 1055 |
|
| 1056 | 1056 |
free(movefilename); |
| 1057 | 1057 |
} |