blob: 1676056fbfdb839724f0b9a9032da6598f56f735 [file] [edit]
/* -*- c-set-style: "K&R"; c-basic-offset: 8 -*-
*
* This file is part of PRoot.
*
* Copyright (C) 2014 STMicroelectronics
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA.
*/
#ifndef PATH_H
#define PATH_H
#include <sys/types.h> /* pid_t, */
#include <fcntl.h> /* AT_FDCWD, */
#include <limits.h> /* PATH_MAX, */
#include <stdbool.h>
#include "tracee/tracee.h"
/* File type. */
typedef enum {
REGULAR,
SYMLINK,
} Type;
/* Path point-of-view. */
typedef enum {
GUEST,
HOST,
/* Used for bindings as specified by the user but not
* canonicalized yet (new_binding, initialize_binding). */
PENDING,
} Side;
/* Path with cached attributes. */
typedef struct {
char path[PATH_MAX];
size_t length;
Side side;
} Path;
/* Path ending type. */
typedef enum {
NOT_FINAL,
FINAL_NORMAL,
FINAL_SLASH,
FINAL_DOT
} Finality;
#define IS_FINAL(a) ((a) != NOT_FINAL)
/* Comparison between two paths. */
typedef enum Comparison {
PATHS_ARE_EQUAL,
PATH1_IS_PREFIX,
PATH2_IS_PREFIX,
PATHS_ARE_NOT_COMPARABLE,
} Comparison;
extern int which(Tracee *tracee, const char *paths, char host_path[PATH_MAX], const char *command);
extern int realpath2(Tracee *tracee, char host_path[PATH_MAX], const char *path, bool deref_final);
extern int getcwd2(Tracee *tracee, char guest_path[PATH_MAX]);
extern void chop_finality(char *path);
extern int translate_path(Tracee *tracee, char host_path[PATH_MAX],
int dir_fd, const char *guest_path, bool deref_final);
extern int detranslate_path(Tracee *tracee, char path[PATH_MAX], const char t_referrer[PATH_MAX]);
extern bool belongs_to_guestfs(const Tracee *tracee, const char *path);
extern int join_paths(int number_paths, char result[PATH_MAX], ...);
extern int list_open_fd(const Tracee *tracee);
extern Comparison compare_paths(const char *path1, const char *path2);
extern Comparison compare_paths2(const char *path1, size_t length1, const char *path2, size_t length2);
extern size_t substitute_path_prefix(char path[PATH_MAX], size_t old_prefix_length,
const char *new_prefix, size_t new_prefix_length);
extern int readlink_proc_pid_fd(pid_t pid, int fd, char path[PATH_MAX]);
/* Check if path interpretable relatively to dirfd, see openat(2) for details. */
#define AT_FD(dirfd, path) ((dirfd) != AT_FDCWD && ((path) != NULL && (path)[0] != '/'))
#endif /* PATH_H */