nuttx/libs/libc/unistd/lib_linkat.c
zhengyu16 ebfe22bfb9 fs: rename PSEUDOFS_SOFTLINKS to FS_LINKS
The link support is no longer limited to the pseudo file system and now
covers both soft (symbolic) links and hard links across the VFS.  Rename
the configuration option PSEUDOFS_SOFTLINKS to the more accurate FS_LINKS
and update all references in the source, headers, Kconfig, documentation
and board defconfigs accordingly.

This is a configuration rename; any out-of-tree defconfig that still
selects PSEUDOFS_SOFTLINKS must be updated to FS_LINKS.

Signed-off-by: zhengyu16 <zhengyu16@xiaomi.com>
2026-08-27 01:12:33 +08:00

122 lines
4.1 KiB
C

/****************************************************************************
* libs/libc/unistd/lib_linkat.c
*
* SPDX-License-Identifier: Apache-2.0
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership. The
* ASF licenses this file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the
* License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations
* under the License.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <errno.h>
#include <unistd.h>
#include "libc.h"
#ifdef CONFIG_FS_LINKS
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: linkat
*
* Description:
* The linkat() system call operates in exactly the same way as link(),
* except for the differences described here.
*
* If the pathname given in pathname is relative, then it is interpreted
* relative to the directory referred to by the file descriptor dirfd
* (rather than relative to the current working directory of the calling
* process)
* If the pathname given in path1 is relative, then it is interpreted
* relative to the directory referred to by the file descriptor olddirfd
* (rather than relative to the current working directory of the calling
* process, as is done by link() for a relative pathname).
*
* If path1 is relative and olddirfd is the special value AT_FDCWD, then
* oldpath is interpreted relative to the current working directory of the
* calling process (like link()).
*
* If path1 is absolute, then olddirfd is ignored.
*
* The interpretation of path2 is as for path1, except that a relative
* pathname is interpreted relative to the directory referred to by the
* file descriptor newdirfd.
*
* Input Parameters:
* olddirfd - The file descriptor of directory.
* path1 - Points to a pathname naming an existing file.
* newdirfd - The file descriptor of directory.
* path2 - Points to a pathname naming the new directory entry to be
* created.
* flags - ignored.
*
* Returned Value:
* Return zero on success, or -1 if an error occurred (in which case,
* errno is set appropriately).
*
****************************************************************************/
int linkat(int olddirfd, FAR const char *path1,
int newdirfd, FAR const char *path2, int flags)
{
FAR char *oldfullpath;
FAR char *newfullpath;
int ret;
oldfullpath = lib_get_pathbuffer();
if (oldfullpath == NULL)
{
set_errno(ENOMEM);
return ERROR;
}
newfullpath = lib_get_pathbuffer();
if (newfullpath == NULL)
{
lib_put_pathbuffer(oldfullpath);
set_errno(ENOMEM);
return ERROR;
}
ret = lib_getfullpath(olddirfd, path1,
oldfullpath, PATH_MAX);
if (ret >= 0)
{
ret = lib_getfullpath(newdirfd, path2,
newfullpath, PATH_MAX);
}
if (ret < 0)
{
lib_put_pathbuffer(oldfullpath);
lib_put_pathbuffer(newfullpath);
set_errno(-ret);
return ERROR;
}
ret = link(oldfullpath, newfullpath);
lib_put_pathbuffer(oldfullpath);
lib_put_pathbuffer(newfullpath);
return ret;
}
#endif /* CONFIG_FS_LINKS */