source: mainline/uspace/lib/posix/source/sys/stat.c@ a6fc88a

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since a6fc88a was a6fc88a, checked in by Jakub Jermar <jakub@…>, 9 years ago

Let vfs_link() and vfs_link_path() return the linked file handle

Add an output argument to both vfs_link() and vfs_link_path() so that the
client may receive the file handle of the linked file or directory. This
makes it easy to work with the new file or directory as it is ready to be
opened or in case of a directory to use it as a parent for further
operations without the need for additional vfs_lookup().

  • Property mode set to 100644
File size: 4.4 KB
Line 
1/*
2 * Copyright (c) 2011 Jiri Zarevucky
3 * Copyright (c) 2011 Petr Koupy
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup libposix
31 * @{
32 */
33/** @file File status handling.
34 */
35
36#define LIBPOSIX_INTERNAL
37#define __POSIX_DEF__(x) posix_##x
38
39#include "../internal/common.h"
40#include "posix/sys/stat.h"
41#include "libc/vfs/vfs.h"
42
43#include "posix/errno.h"
44#include "libc/mem.h"
45
46/**
47 * Convert HelenOS stat struct into POSIX stat struct (if possible).
48 *
49 * @param dest POSIX stat struct.
50 * @param src HelenOS stat struct.
51 */
52static void stat_to_posix(struct posix_stat *dest, struct stat *src)
53{
54 memset(dest, 0, sizeof(struct posix_stat));
55
56 dest->st_dev = src->service;
57 dest->st_ino = src->index;
58
59 /* HelenOS doesn't support permissions, so we set them all */
60 dest->st_mode = S_IRWXU | S_IRWXG | S_IRWXO;
61 if (src->is_file) {
62 dest->st_mode |= S_IFREG;
63 }
64 if (src->is_directory) {
65 dest->st_mode |= S_IFDIR;
66 }
67
68 dest->st_nlink = src->lnkcnt;
69 dest->st_size = src->size;
70}
71
72/**
73 * Retrieve file status for file associated with file descriptor.
74 *
75 * @param fd File descriptor of the opened file.
76 * @param st Status structure to be filled with information.
77 * @return Zero on success, -1 otherwise.
78 */
79int posix_fstat(int fd, struct posix_stat *st)
80{
81 struct stat hst;
82 int rc = rcerrno(vfs_stat, fd, &hst);
83 if (rc < 0)
84 return -1;
85 stat_to_posix(st, &hst);
86 return 0;
87}
88
89/**
90 * Retrieve file status for symbolic link.
91 *
92 * @param path Path to the symbolic link.
93 * @param st Status structure to be filled with information.
94 * @return Zero on success, -1 otherwise.
95 */
96int posix_lstat(const char *restrict path, struct posix_stat *restrict st)
97{
98 /* There are currently no symbolic links in HelenOS. */
99 return posix_stat(path, st);
100}
101
102/**
103 * Retrieve file status for regular file (or symbolic link target).
104 *
105 * @param path Path to the file/link.
106 * @param st Status structure to be filled with information.
107 * @return Zero on success, -1 otherwise.
108 */
109int posix_stat(const char *restrict path, struct posix_stat *restrict st)
110{
111 struct stat hst;
112 int rc = rcerrno(vfs_stat_path, path, &hst);
113 if (rc < 0)
114 return -1;
115 stat_to_posix(st, &hst);
116 return 0;
117}
118
119/**
120 * Change permission bits for the file if possible.
121 *
122 * @param path Path to the file.
123 * @param mode Permission bits to be set.
124 * @return Zero on success, -1 otherwise.
125 */
126int posix_chmod(const char *path, mode_t mode)
127{
128 /* HelenOS doesn't support permissions, return success. */
129 return 0;
130}
131
132/**
133 * Set the file mode creation mask of the process.
134 *
135 * @param mask Set permission bits are cleared in the related creation
136 * functions. Non-permission bits are ignored.
137 * @return Previous file mode creation mask.
138 */
139mode_t posix_umask(mode_t mask)
140{
141 /* HelenOS doesn't support permissions, return empty mask. */
142 return 0;
143}
144
145/**
146 * Create a directory.
147 *
148 * @param path Path to the new directory.
149 * @param mode Permission bits to be set.
150 * @return Zero on success, -1 otherwise.
151 */
152int posix_mkdir(const char *path, mode_t mode)
153{
154 int rc = rcerrno(vfs_link_path, path, KIND_DIRECTORY, NULL);
155 if (rc != EOK)
156 return -1;
157 else
158 return 0;
159}
160
161/** @}
162 */
Note: See TracBrowser for help on using the repository browser.