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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* General fs node functions
Copyright (C) 1997, 1999, 2007 Free Software Foundation, Inc.
Written by Miles Bader <miles@gnu.ai.mit.edu>
This file is part of the GNU Hurd.
The GNU Hurd 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, or (at
your option) any later version.
The GNU Hurd 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., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */
#include <fcntl.h>
#include "usermux.h"
/* Node maintenance. */
/* Node NP is all done; free all its associated storage. */
void
netfs_node_norefs (struct node *node)
{
if (node->nn->name)
/* Remove our name's pointer to us; the name itself will eventually be
freed by another party. */
node->nn->name->node = 0;
if (node->nn->trans_len > 0)
free (node->nn->trans);
free (node->nn);
free (node);
}
/* Attempt to create a file named NAME in DIR for USER with MODE. Set *NODE
to the new node upon return. On any error, clear *NODE. *NODE should be
locked on success; no matter what, unlock DIR before returning. */
error_t
netfs_attempt_create_file (struct iouser *user, struct node *dir,
char *name, mode_t mode, struct node **node)
{
*node = 0;
mutex_unlock (&dir->lock);
return EOPNOTSUPP;
}
/* Node NODE is being opened by USER, with FLAGS. NEWNODE is nonzero if we
just created this node. Return an error if we should not permit the open
to complete because of a permission restriction. */
error_t
netfs_check_open_permissions (struct iouser *user, struct node *node,
int flags, int newnode)
{
error_t err = 0;
if (flags & O_READ)
err = fshelp_access (&node->nn_stat, S_IREAD, user);
if (!err && (flags & O_WRITE))
err = fshelp_access (&node->nn_stat, S_IWRITE, user);
if (!err && (flags & O_EXEC))
err = fshelp_access (&node->nn_stat, S_IEXEC, user);
return err;
}
/* This should attempt a utimes call for the user specified by CRED on node
NODE, to change the atime to ATIME and the mtime to MTIME. */
error_t
netfs_attempt_utimes (struct iouser *cred, struct node *node,
struct timespec *atime, struct timespec *mtime)
{
error_t err = fshelp_isowner (&node->nn_stat, cred);
int flags = TOUCH_CTIME;
if (! err)
{
if (mtime)
node->nn_stat.st_mtim = *mtime;
else
flags |= TOUCH_MTIME;
if (atime)
node->nn_stat.st_atim = *atime;
else
flags |= TOUCH_ATIME;
fshelp_touch (&node->nn_stat, TOUCH_CTIME, usermux_maptime);
}
return err;
}
/* Return the valid access types (bitwise OR of O_READ, O_WRITE, and O_EXEC)
in *TYPES for file NODE and user CRED. */
error_t
netfs_report_access (struct iouser *cred, struct node *node, int *types)
{
*types = 0;
if (fshelp_access (&node->nn_stat, S_IREAD, cred) == 0)
*types |= O_READ;
if (fshelp_access (&node->nn_stat, S_IWRITE, cred) == 0)
*types |= O_WRITE;
if (fshelp_access (&node->nn_stat, S_IEXEC, cred) == 0)
*types |= O_EXEC;
return 0;
}
/* Trivial definitions. */
/* Make sure that NP->nn_stat is filled with current information. CRED
identifies the user responsible for the operation. */
error_t
netfs_validate_stat (struct node *node, struct iouser *cred)
{
return 0;
}
/* This should sync the file NODE completely to disk, for the user CRED. If
WAIT is set, return only after sync is completely finished. */
error_t
netfs_attempt_sync (struct iouser *cred, struct node *node, int wait)
{
return 0;
}
|