Skip to content

Conversation

@R4ken
Copy link
Contributor

@R4ken R4ken commented Sep 1, 2025

Implement missing POSIX functions (fdopendir,seekdir, telldir) working on DIR structs

JIRA: RTOS-1088

Description

Implemented fdopendir,seekdir and telldir functions.

Motivation and Context

Missing POSIX functions useful in porting applications

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)
  • Chore (refactoring, style fixes, git/CI config, submodule management, no code logic changes)

How Has This Been Tested?

  • Already covered by automatic testing.
  • New test added: (add PR link here).
  • Tested by hand on: (ia32-generic-qemu, armv7a9-zynq7000-qemu)

Checklist:

  • My change requires a change to the documentation.
  • I have updated the documentation accordingly.
  • I have added tests to cover my changes.
  • All new and existing linter checks and tests passed.
  • My changes generate no new compilation warnings for any of the targets.

Special treatment

  • This PR needs additional PRs to work (list the PRs, preferably in merge-order).
  • I will merge this PR by myself when appropriate.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary of Changes

Hello @R4ken, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request introduces three essential POSIX directory functions: fdopendir, seekdir, and telldir. These additions are crucial for improving the system's compatibility with POSIX standards, thereby simplifying the porting of various applications that rely on these common directory operations. The changes enhance the system's file system interaction capabilities without altering existing functionality.

Highlights

  • New POSIX Directory Functions: Implemented fdopendir, seekdir, and telldir functions to provide more comprehensive POSIX-compliant directory manipulation capabilities.
  • Header Updates: Added declarations for the new directory functions in include/dirent.h.
  • Core Logic Implementation: Provided the full implementation for fdopendir, seekdir, and telldir within unistd/dir.c, including necessary error handling and file descriptor management.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in issue comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request implements the missing POSIX directory functions fdopendir, seekdir, and telldir. The implementations are a good start, but I've identified a few high-severity issues related to null pointer dereferences and error handling that could lead to crashes or undefined behavior. I've provided detailed comments and code suggestions to address these points, which also include a small efficiency improvement in fdopendir.


void seekdir(DIR *dirp, long loc)
{
dirp->pos = loc;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The function should handle the case where dirp is NULL to prevent a segmentation fault. Dereferencing a NULL pointer is undefined behavior.

	if (dirp != NULL)
		dirp->pos = loc;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Other libphoenix functions don't validate whether dirp is non NULL pointer

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you are right, although I think that this might be a good opportunity to introduce those checks here.
Linux's behaviour in these calls is not unreasonable and helping the programmer by making this deterministic is IMO good


long telldir(DIR *dirp)
{
return dirp->pos;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

The function should handle the case where dirp is NULL. According to the POSIX standard, if dirp does not refer to a valid directory stream, telldir() should return -1 and set errno to EBADF.

	if (dirp == NULL) {
		errno = EBADF;
		return -1;
	}
	return dirp->pos;

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, this behavior exists in Linux, POSIX does not specify it

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As above

@R4ken R4ken marked this pull request as draft September 1, 2025 14:46
@github-actions
Copy link

github-actions bot commented Sep 1, 2025

Unit Test Results

9 462 tests  +185   8 872 ✅ +185   51m 13s ⏱️ - 3m 22s
  561 suites + 16     589 💤 ±  0 
    1 files   ±  0       1 ❌ ±  0 

For more details on these failures, see this check.

Results for commit ca26bd4. ± Comparison against base commit ebfb737.

♻️ This comment has been updated with latest results.

@R4ken R4ken requested a review from jlatusek September 2, 2025 06:48
@R4ken R4ken requested a review from Darchiv September 8, 2025 15:08
@R4ken R4ken marked this pull request as ready for review September 25, 2025 07:39
free(s);
return NULL;
}
if ((fd_flags & O_RDONLY) == 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What if O_RDWR is set, so O_RDONLY is not? I think a file descriptor open for reading can be as well open for writing, as long as it is still readable

Copy link
Contributor Author

@R4ken R4ken Sep 30, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

open from libphoenix sets EISDIR on errno while opening directory with either O_WRONLY or O_RDWR flag.
Thus opening directory with O_RDWR is not possible

Fragment of open function from libphoenix

if (oflag & (O_WRONLY | O_RDWR)) {
  if ((err = stat(filename, &st)) < 0) {
	  if (errno != ENOENT)
		  return err;
  }
  else if (S_ISDIR(st.st_mode)) {
	  return SET_ERRNO(-EISDIR);
  }
}

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This behaviour seems common, I can replicate it on both Linux and one of the BSD's, I think we can keep it like that for the sake of compatibility.

Implement missing POSIX functions (fdopendir,seekdir, telldir) working
on DIR structs

JIRA: RTOS-1088
@Darchiv Darchiv removed the request for review from jlatusek November 26, 2025 13:51
Copy link
Member

@oI0ck oI0ck left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'd be good to introduce NULL checks while we are at it.


void seekdir(DIR *dirp, long loc)
{
dirp->pos = loc;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, you are right, although I think that this might be a good opportunity to introduce those checks here.
Linux's behaviour in these calls is not unreasonable and helping the programmer by making this deterministic is IMO good


long telldir(DIR *dirp)
{
return dirp->pos;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As above

free(s);
return NULL;
}
if ((fd_flags & O_RDONLY) == 0) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This behaviour seems common, I can replicate it on both Linux and one of the BSD's, I think we can keep it like that for the sake of compatibility.

@oI0ck oI0ck requested a review from Darchiv November 26, 2025 14:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants