On Mon Apr 14, 2025 at 4:05 PM CEST, Csókás Bence wrote:
> Hi,
>
> On 2025. 04. 14. 12:16, Sertonix wrote:
>> 
>> GNU grep -r doesn't search in files that are linked to by symlinks.
>> 
>> function                                             old     new   delta
>> file_action_grep                                     219     228      +9
>> ------------------------------------------------------------------------------
>> (add/remove: 0/0 grow/shrink: 1/0 up/down: 9/0)                 Total: 9 
>> bytes
>> ---
>>   findutils/grep.c | 2 ++
>>   1 file changed, 2 insertions(+)
>> 
>> diff --git a/findutils/grep.c b/findutils/grep.c
>> index f6d0a73f4..0bd4898bc 100644
>> --- a/findutils/grep.c
>> +++ b/findutils/grep.c
>> @@ -666,6 +666,8 @@ static int FAST_FUNC file_action_grep(struct 
>> recursive_state *state UNUSED_PARAM
>>       * example will return the raw directory contents). */
>>      if (S_ISLNK(statbuf->st_mode)) {
>>              struct stat sb;
>> +            if (!(option_mask32 & OPT_R))
>
> You mixed it up, -R *does* follow links, -r doesn't (which would be 
> OPT_r here).

Since I used a "not" here it is correct. I wanted to make it easier to
see that it is related to the code below:
        ((option_mask32 & OPT_R) ? ACTION_FOLLOWLINKS : 0)

(And I checked that the binary size doesn't differ)

> But the whole patch is not needed anyway, because 
> recursive_action() (which calls file_action_grep()) only follows 
> symlinks if -R is given: [1]

recursive_action() won't recursivly search directories pointed to by
symlinks but it will still pass the symlinks to file_action_grep().
recursive_action() then uses stat (not lstat) and when the symlink
target is a file it will always search the file regardless of -r or -R.

Just try for yourself:

$ mkdir dir
$ echo test > dir/foo
$ ln -s foo dir/bar
$ busybox grep test dir -r
dir/bar:test
dir/foo:test
$ grep test dir -r
dir/foo:test

> [1] https://git.busybox.net/busybox/tree/findutils/grep.c#n696
>
>> +                    return 0;
>>              if (stat(filename, &sb) != 0) {
>>                      if (!SUPPRESS_ERR_MSGS)
>>                              bb_simple_perror_msg(filename);
>
> Bence
>
> _______________________________________________
> busybox mailing list
> busybox@busybox.net
> https://lists.busybox.net/mailman/listinfo/busybox

_______________________________________________
busybox mailing list
busybox@busybox.net
https://lists.busybox.net/mailman/listinfo/busybox

Reply via email to