diff options
| author | Aaro Koskinen <aaro.koskinen@iki.fi> | 2021-11-28 12:11:48 +0200 |
|---|---|---|
| committer | Denys Vlasenko <vda.linux@googlemail.com> | 2021-12-17 21:33:15 +0100 |
| commit | aaade69ce9faac6c05ab8b800fc9e9d4dee8ed54 (patch) | |
| tree | 658918bf99fbc3bef0e8477d43780b9fff6812e5 | |
| parent | 7105e4afddbf47b494accce40e2a701b8833e6ce (diff) | |
| download | busybox-w32-aaade69ce9faac6c05ab8b800fc9e9d4dee8ed54.tar.gz busybox-w32-aaade69ce9faac6c05ab8b800fc9e9d4dee8ed54.tar.bz2 busybox-w32-aaade69ce9faac6c05ab8b800fc9e9d4dee8ed54.zip | |
find: implement -samefile
function old new delta
parse_params 1461 1606 +145
func_samefile - 42 +42
packed_usage 34079 34102 +23
static.params 261 271 +10
------------------------------------------------------------------------------
(add/remove: 1/0 grow/shrink: 3/0 up/down: 220/0) Total: 220 bytes
Signed-off-by: Aaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
| -rw-r--r-- | findutils/find.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/findutils/find.c b/findutils/find.c index fdc5c152d..bb6ad31e5 100644 --- a/findutils/find.c +++ b/findutils/find.c | |||
| @@ -155,6 +155,13 @@ | |||
| 155 | //config: default y | 155 | //config: default y |
| 156 | //config: depends on FIND | 156 | //config: depends on FIND |
| 157 | //config: | 157 | //config: |
| 158 | //config:config FEATURE_FIND_SAMEFILE | ||
| 159 | //config: bool "Enable -samefile: reference file matching" | ||
| 160 | //config: default y | ||
| 161 | //config: depends on FIND | ||
| 162 | //config: help | ||
| 163 | //config: Support the 'find -samefile' option for searching by a reference file. | ||
| 164 | //config: | ||
| 158 | //config:config FEATURE_FIND_EXEC | 165 | //config:config FEATURE_FIND_EXEC |
| 159 | //config: bool "Enable -exec: execute commands" | 166 | //config: bool "Enable -exec: execute commands" |
| 160 | //config: default y | 167 | //config: default y |
| @@ -350,6 +357,9 @@ | |||
| 350 | //usage: IF_FEATURE_FIND_INUM( | 357 | //usage: IF_FEATURE_FIND_INUM( |
| 351 | //usage: "\n -inum N File has inode number N" | 358 | //usage: "\n -inum N File has inode number N" |
| 352 | //usage: ) | 359 | //usage: ) |
| 360 | //usage: IF_FEATURE_FIND_SAMEFILE( | ||
| 361 | //usage: "\n -samefile FILE File is same as FILE" | ||
| 362 | //usage: ) | ||
| 353 | //usage: IF_FEATURE_FIND_USER( | 363 | //usage: IF_FEATURE_FIND_USER( |
| 354 | //usage: "\n -user NAME/ID File is owned by given user" | 364 | //usage: "\n -user NAME/ID File is owned by given user" |
| 355 | //usage: ) | 365 | //usage: ) |
| @@ -444,6 +454,7 @@ IF_FEATURE_FIND_MTIME( ACTS(mtime, unsigned char time_type; unsigned char mtime | |||
| 444 | IF_FEATURE_FIND_MMIN( ACTS(mmin, unsigned char time_type; unsigned char mmin_char; unsigned mmin_mins;)) | 454 | IF_FEATURE_FIND_MMIN( ACTS(mmin, unsigned char time_type; unsigned char mmin_char; unsigned mmin_mins;)) |
| 445 | IF_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) | 455 | IF_FEATURE_FIND_NEWER( ACTS(newer, time_t newer_mtime;)) |
| 446 | IF_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) | 456 | IF_FEATURE_FIND_INUM( ACTS(inum, ino_t inode_num;)) |
| 457 | IF_FEATURE_FIND_SAMEFILE(ACTS(samefile, ino_t inode_num; dev_t device;)) | ||
| 447 | IF_FEATURE_FIND_USER( ACTS(user, uid_t uid;)) | 458 | IF_FEATURE_FIND_USER( ACTS(user, uid_t uid;)) |
| 448 | IF_FEATURE_FIND_SIZE( ACTS(size, char size_char; off_t size;)) | 459 | IF_FEATURE_FIND_SIZE( ACTS(size, char size_char; off_t size;)) |
| 449 | IF_FEATURE_FIND_CONTEXT(ACTS(context, security_context_t context;)) | 460 | IF_FEATURE_FIND_CONTEXT(ACTS(context, security_context_t context;)) |
| @@ -731,6 +742,13 @@ ACTF(inum) | |||
| 731 | return (statbuf->st_ino == ap->inode_num); | 742 | return (statbuf->st_ino == ap->inode_num); |
| 732 | } | 743 | } |
| 733 | #endif | 744 | #endif |
| 745 | #if ENABLE_FEATURE_FIND_SAMEFILE | ||
| 746 | ACTF(samefile) | ||
| 747 | { | ||
| 748 | return statbuf->st_ino == ap->inode_num && | ||
| 749 | statbuf->st_dev == ap->device; | ||
| 750 | } | ||
| 751 | #endif | ||
| 734 | #if ENABLE_FEATURE_FIND_EXEC | 752 | #if ENABLE_FEATURE_FIND_EXEC |
| 735 | static int do_exec(action_exec *ap, const char *fileName) | 753 | static int do_exec(action_exec *ap, const char *fileName) |
| 736 | { | 754 | { |
| @@ -1125,6 +1143,7 @@ static action*** parse_params(char **argv) | |||
| 1125 | IF_FEATURE_FIND_CMIN( PARM_cmin ,) | 1143 | IF_FEATURE_FIND_CMIN( PARM_cmin ,) |
| 1126 | IF_FEATURE_FIND_NEWER( PARM_newer ,) | 1144 | IF_FEATURE_FIND_NEWER( PARM_newer ,) |
| 1127 | IF_FEATURE_FIND_INUM( PARM_inum ,) | 1145 | IF_FEATURE_FIND_INUM( PARM_inum ,) |
| 1146 | IF_FEATURE_FIND_SAMEFILE(PARM_samefile ,) | ||
| 1128 | IF_FEATURE_FIND_USER( PARM_user ,) | 1147 | IF_FEATURE_FIND_USER( PARM_user ,) |
| 1129 | IF_FEATURE_FIND_GROUP( PARM_group ,) | 1148 | IF_FEATURE_FIND_GROUP( PARM_group ,) |
| 1130 | IF_FEATURE_FIND_SIZE( PARM_size ,) | 1149 | IF_FEATURE_FIND_SIZE( PARM_size ,) |
| @@ -1173,6 +1192,7 @@ static action*** parse_params(char **argv) | |||
| 1173 | IF_FEATURE_FIND_CMIN( "-cmin\0" ) | 1192 | IF_FEATURE_FIND_CMIN( "-cmin\0" ) |
| 1174 | IF_FEATURE_FIND_NEWER( "-newer\0" ) | 1193 | IF_FEATURE_FIND_NEWER( "-newer\0" ) |
| 1175 | IF_FEATURE_FIND_INUM( "-inum\0" ) | 1194 | IF_FEATURE_FIND_INUM( "-inum\0" ) |
| 1195 | IF_FEATURE_FIND_SAMEFILE("-samefile\0") | ||
| 1176 | IF_FEATURE_FIND_USER( "-user\0" ) | 1196 | IF_FEATURE_FIND_USER( "-user\0" ) |
| 1177 | IF_FEATURE_FIND_GROUP( "-group\0" ) | 1197 | IF_FEATURE_FIND_GROUP( "-group\0" ) |
| 1178 | IF_FEATURE_FIND_SIZE( "-size\0" ) | 1198 | IF_FEATURE_FIND_SIZE( "-size\0" ) |
| @@ -1511,6 +1531,21 @@ static action*** parse_params(char **argv) | |||
| 1511 | ap->inode_num = xatoul(arg1); | 1531 | ap->inode_num = xatoul(arg1); |
| 1512 | } | 1532 | } |
| 1513 | #endif | 1533 | #endif |
| 1534 | #if ENABLE_FEATURE_FIND_SAMEFILE | ||
| 1535 | else if (parm == PARM_samefile) { | ||
| 1536 | action_samefile *ap; | ||
| 1537 | struct stat stbuf; | ||
| 1538 | dbg("%d", __LINE__); | ||
| 1539 | if (G.recurse_flags & (ACTION_FOLLOWLINKS | | ||
| 1540 | ACTION_FOLLOWLINKS_L0)) | ||
| 1541 | xstat(arg1, &stbuf); | ||
| 1542 | else if (lstat(arg1, &stbuf)) | ||
| 1543 | bb_perror_msg_and_die("can't stat '%s'", arg1); | ||
| 1544 | ap = ALLOC_ACTION(samefile); | ||
| 1545 | ap->inode_num = stbuf.st_ino; | ||
| 1546 | ap->device = stbuf.st_dev; | ||
| 1547 | } | ||
| 1548 | #endif | ||
| 1514 | #if ENABLE_FEATURE_FIND_USER | 1549 | #if ENABLE_FEATURE_FIND_USER |
| 1515 | else if (parm == PARM_user) { | 1550 | else if (parm == PARM_user) { |
| 1516 | action_user *ap; | 1551 | action_user *ap; |
