File: dirfd.c

package info (click to toggle)
strace 6.13%2Bds-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 71,488 kB
  • sloc: ansic: 176,497; sh: 9,675; makefile: 4,133; cpp: 885; awk: 353; perl: 267; exp: 62; sed: 9
file content (43 lines) | stat: -rw-r--r-- 830 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/*
 * Copyright (c) 2021 The strace developers.
 * All rights reserved.
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 */

#include "tests.h"

#include <dirent.h>
#include <limits.h>
#include <stdlib.h>
#include <unistd.h>

#include "xmalloc.h"

int
get_dir_fd(const char *dir_path)
{
	DIR *dir = opendir(dir_path);
	if (dir == NULL)
		perror_msg_and_fail("opendir: %s", dir_path);
	int dfd = dirfd(dir);
	if (dfd == -1)
		perror_msg_and_fail("dirfd");
	return dfd;
}

char *
get_fd_path(int fd)
{
	char *proc = xasprintf("/proc/self/fd/%u", fd);
	char *buf = xmalloc(PATH_MAX);
	ssize_t n = readlink(proc, buf, PATH_MAX);
	if (n < 0)
		perror_msg_and_skip("readlink: %s", proc);
	if (n >= PATH_MAX)
		error_msg_and_fail("readlink: %s: %s", proc,
				   "symlink value is too long");
	buf[n] = '\0';
	free(proc);
	return buf;
}