[Bug 216275] Incorrect fts_pathlen in fts(3) man page

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



https://bugzilla.kernel.org/show_bug.cgi?id=216275

--- Comment #2 from Alejandro Colomar (man-pages) (alx.manpages@xxxxxxxxx) ---
Hi Philip,

On 7/23/22 14:56, bugzilla-daemon@xxxxxxxxxx wrote:
> https://bugzilla.kernel.org/show_bug.cgi?id=216275
> 
>              Bug ID: 216275
>             Summary: Incorrect fts_pathlen in fts(3) man page
>             Product: Documentation
>             Version: unspecified
>            Hardware: All
>                  OS: Linux
>              Status: NEW
>            Severity: normal
>            Priority: P1
>           Component: man-pages
>            Assignee: documentation_man-pages@xxxxxxxxxxxxxxxxxxxx
>            Reporter: philj56@xxxxxxxxx
>          Regression: No
> 
> In the fts(3) man page, `fts_pathlen` is described as:
> ```
> short           fts_pathlen;  /* strlen(fts_path) +
>                                   strlen(fts_name) */
> ```
> 
> This was changed from `strlen(fts_path)` in the following commit:
> 
>
> <https://git.kernel.org/pub/scm/docs/man-pages/man-pages.git/commit/?id=10b6adae8ac6026b2bb69bc66d1e0fcb37c81696>
> 
> This is only correct when `fts_children()` is called, however. When
> only `fts_read()` is used, the original `fts_pathlen = strlen(fts_path)`
> is correct. This feels like a glibc bug to me, seeing as the original
> behaviour is listed in the glibc source:
> 
>
> <https://sourceware.org/git/?p=glibc.git;a=blob;f=io/fts.h;h=e00575d154b1457ddd02a0ab67a4a5e3b10237c0;hb=HEAD#l98>
> 
> Assuming that glibc won't change, I think the man page should document
> both behaviours.

I replied CCing the glibc list, in case someone from there wants to comment.

> 
> The following program demonstrates the difference in behaviour:
> 
> ```
> #include <fts.h>
> #include <pwd.h>
> #include <stdio.h>
> #include <string.h>
> #include <unistd.h>
> 
> void test_fts_children(char *paths[])
> {
>          FTS* fts = fts_open(paths, FTS_LOGICAL, NULL);
>          FTSENT* ftsent = fts_read(fts);
>          FTSENT* child = fts_children(fts, 0);
>          while (child != NULL) {
>                  printf("    %s %s %d %lu\n", child->fts_path,
>                  child->fts_name,
>                                  child->fts_pathlen,
>                                  strlen(child->fts_path));
>                  child = child->fts_link;
>          }
>          fts_close(fts);
> }
> 
> void test_fts_read(char *paths[])
> {
>          FTS* fts = fts_open(paths, FTS_LOGICAL, NULL);
>          FTSENT* ftsent = fts_read(fts);
>          for (; ftsent != NULL; ftsent = fts_read(fts)) {
>                  /* Don't go any deeper */
>                  if (ftsent->fts_level > 0 && (ftsent->fts_info & FTS_D)) {
>                          fts_set(fts, ftsent, FTS_SKIP);
>                          continue;
>                  }
>                  printf("    %s %s %d %lu\n", ftsent->fts_path,
> ftsent->fts_name,
>                                  ftsent->fts_pathlen,
>                                  strlen(ftsent->fts_path));
>          }
>          fts_close(fts);
> }
> 
> int main() {
>          struct passwd *pwd_entry = getpwuid(getuid());
>          char *paths[] = {pwd_entry->pw_dir, NULL};
>          printf("fts_children:\n");
>          test_fts_children(paths);
>          printf("\nfts_read:\n");
>          test_fts_read(paths);
>          return 0;
> }
> ```
> 
> Sample output:
> ```
> fts_children:
>      /home/phil/ Templates 20 11
>      /home/phil/ bin 14 11
>      /home/phil/ Pictures 19 11
>      /home/phil/ Public 17 11
>      /home/phil/ Videos 17 11
>      /home/phil/ Downloads 20 11
>      /home/phil/ Music 16 11
>      /home/phil/ Desktop 18 11
>      /home/phil/ Documents 20 11
> 
> fts_read:
>      /home/phil phil 10 10
>      /home/phil/Templates Templates 20 20
>      /home/phil/bin bin 14 14
>      /home/phil/Pictures Pictures 19 19
>      /home/phil/Public Public 17 17
>      /home/phil/Videos Videos 17 17
>      /home/phil/Downloads Downloads 20 20
>      /home/phil/Music Music 16 16
>      /home/phil/Desktop Desktop 18 18
>      /home/phil/Documents Documents 20 20
>      /home/phil phil 10 10
> ```
> 

Thanks,

Alex

-- 
You may reply to this email to add a comment.

You are receiving this mail because:
You are watching the assignee of the bug.



[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux