author | Hajime Tazaki <tazaki@sfc.wide.ad.jp> |
Wed, 25 Sep 2013 16:02:32 +0900 | |
changeset 515 | 98f8c21e069f |
parent 412 | b6d3dc1d6def |
child 520 | 905320ec0959 |
permissions | -rw-r--r-- |
0 | 1 |
#define _LARGEFILE64_SOURCE 1 |
2 |
#include "dce-manager.h" |
|
3 |
#include "process.h" |
|
4 |
#include "utils.h" |
|
5 |
#include "unix-fd.h" |
|
6 |
#include "unix-file-fd.h" |
|
7 |
#include "socket-fd-factory.h" |
|
8 |
#include "waiter.h" |
|
1 | 9 |
#include "dce-fcntl.h" |
10 |
#include "dce-unistd.h" |
|
11 |
#include "dce-poll.h" |
|
12 |
#include "dce-stdio.h" |
|
13 |
#include "sys/dce-socket.h" |
|
14 |
#include "sys/dce-ioctl.h" |
|
15 |
#include "sys/dce-stat.h" |
|
16 |
#include "sys/dce-mman.h" |
|
17 |
#include "sys/dce-select.h" |
|
0 | 18 |
#include "ns3/log.h" |
19 |
#include "ns3/event-id.h" |
|
20 |
#include "ns3/simulator.h" |
|
21 |
#include "ns3/nstime.h" |
|
22 |
#include <fcntl.h> |
|
23 |
#include <errno.h> |
|
24 |
#include <linux/netlink.h> |
|
25 |
#include <linux/rtnetlink.h> |
|
26 |
#include <sys/mman.h> |
|
27 |
#include <sys/types.h> |
|
28 |
#include "ns3/node.h" |
|
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
29 |
#include "local-socket-fd-factory.h" |
164 | 30 |
#include "ns3-socket-fd-factory.h" |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
31 |
#include "file-usage.h" |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
32 |
#include "dce-stdlib.h" |
190 | 33 |
#include "pipe-fd.h" |
0 | 34 |
|
35 |
NS_LOG_COMPONENT_DEFINE ("SimuFd"); |
|
36 |
||
37 |
||
38 |
#ifdef _K_SS_MAXSIZE |
|
39 |
#define SOCK_MAX_ADDRESS_SIZE _K_SS_MAXSIZE |
|
40 |
#else |
|
41 |
#define SOCK_MAX_ADDRESS_SIZE 128 |
|
42 |
#endif |
|
43 |
||
164 | 44 |
#define DEFINE_FORWARDER_PATH(name, pathname, ...) \ |
45 |
{ \ |
|
46 |
Thread *current = Current (); \ |
|
47 |
NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << pathname); \ |
|
48 |
NS_ASSERT (Current () != 0); \ |
|
49 |
\ |
|
50 |
if (std::string (pathname) == std::string ("")) \ |
|
51 |
{ \ |
|
52 |
current->err = ENOENT; \ |
|
53 |
return -1; \ |
|
54 |
} \ |
|
55 |
std::string fullpath = UtilsGetRealFilePath (pathname); \ |
|
56 |
int status = ::name (fullpath.c_str (), ## __VA_ARGS__); \ |
|
57 |
if (status == -1) \ |
|
58 |
{ \ |
|
59 |
current->err = errno; \ |
|
60 |
return -1; \ |
|
61 |
} \ |
|
62 |
return status; \ |
|
0 | 63 |
} |
64 |
||
65 |
||
66 |
using namespace ns3; |
|
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
67 |
int dce_open64 (const char *path, int flags, ...) |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
68 |
{ |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
69 |
va_list vl; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
70 |
va_start (vl, flags); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
71 |
// hope this trick actually works... |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
72 |
int status = dce_open (path, flags, vl); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
73 |
va_end (vl); |
0 | 74 |
|
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
75 |
return status; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
76 |
} |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
77 |
|
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
78 |
int dce_open (const char *path, int flags, ...) |
0 | 79 |
{ |
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
80 |
va_list vl; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
81 |
va_start (vl, flags); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
82 |
|
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
83 |
mode_t mode = 0; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
84 |
if (flags & O_CREAT) |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
85 |
{ |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
86 |
mode = va_arg (vl, mode_t); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
87 |
} |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
88 |
va_end (vl); |
0 | 89 |
Thread *current = Current (); |
90 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << path << flags); |
|
91 |
NS_ASSERT (current != 0); |
|
92 |
||
93 |
if (std::string (path) == "") |
|
94 |
{ |
|
95 |
current->err = ENOENT; |
|
96 |
return -1; |
|
97 |
} |
|
98 |
||
99 |
int fd = UtilsAllocateFd (); |
|
100 |
if (fd == -1) |
|
101 |
{ |
|
102 |
current->err = EMFILE; |
|
103 |
return -1; |
|
104 |
} |
|
126
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
105 |
UnixFd *unixFd = 0; |
98
320dda6c27eb
Add simple emulation of /dev/randon, /dev/urandom and /dev/srandom mapping to real one devices.
frederic.urbani@inria.fr
parents:
91
diff
changeset
|
106 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
107 |
if ((std::string (path) == "/dev/random") || (std::string (path) == "/dev/urandom") |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
108 |
|| (std::string (path) == "/dev/srandom")) |
98
320dda6c27eb
Add simple emulation of /dev/randon, /dev/urandom and /dev/srandom mapping to real one devices.
frederic.urbani@inria.fr
parents:
91
diff
changeset
|
109 |
{ |
126
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
110 |
unixFd = new UnixRandomFd (path); |
98
320dda6c27eb
Add simple emulation of /dev/randon, /dev/urandom and /dev/srandom mapping to real one devices.
frederic.urbani@inria.fr
parents:
91
diff
changeset
|
111 |
} |
320dda6c27eb
Add simple emulation of /dev/randon, /dev/urandom and /dev/srandom mapping to real one devices.
frederic.urbani@inria.fr
parents:
91
diff
changeset
|
112 |
else |
320dda6c27eb
Add simple emulation of /dev/randon, /dev/urandom and /dev/srandom mapping to real one devices.
frederic.urbani@inria.fr
parents:
91
diff
changeset
|
113 |
{ |
126
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
114 |
std::string fullpath = UtilsGetRealFilePath (path); |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
115 |
|
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
116 |
int realFd = ::open (fullpath.c_str (), flags, mode); |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
117 |
if (realFd == -1) |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
118 |
{ |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
119 |
current->err = errno; |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
120 |
return -1; |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
121 |
} |
100
c359682a503f
dce_open : trim heading spaces of filename.
frederic.urbani@inria.fr
parents:
98
diff
changeset
|
122 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
123 |
if (((2 == fd) || (1 == fd)) && (Current ()->process->minimizeFiles)) |
126
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
124 |
{ |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
125 |
unixFd = new UnixFileFdLight (fullpath); |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
126 |
close (realFd); |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
127 |
} |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
128 |
else |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
129 |
{ |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
130 |
unixFd = new UnixFileFd (realFd); |
55babd7c381e
Update /dev/xrandom emulation: use NS3 random generator.
frederic.urbani@inria.fr
parents:
123
diff
changeset
|
131 |
} |
123
05f58de33cb9
Add option ns3::DceManager::MinimizeOpenFiles in order to close stdout and stderr between writes in order to have less opened file at same time.
frederic.urbani@inria.fr
parents:
108
diff
changeset
|
132 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
133 |
unixFd->IncFdCount (); |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
134 |
current->process->openFiles[fd] = new FileUsage (fd, unixFd); |
0 | 135 |
return fd; |
136 |
} |
|
123
05f58de33cb9
Add option ns3::DceManager::MinimizeOpenFiles in order to close stdout and stderr between writes in order to have less opened file at same time.
frederic.urbani@inria.fr
parents:
108
diff
changeset
|
137 |
|
1 | 138 |
int dce_creat (const char *path, mode_t mode) |
0 | 139 |
{ |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
140 |
return dce_open (path, O_CREAT | O_WRONLY | O_TRUNC, mode); |
0 | 141 |
} |
142 |
||
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
143 |
int dce_unlink_real (const char *pathname) |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
144 |
{ |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
145 |
DEFINE_FORWARDER_PATH (unlink, pathname); |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
146 |
} |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
147 |
|
199
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
148 |
void unlink_notify (std::string fullpath) |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
149 |
{ |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
150 |
NS_LOG_FUNCTION ("UNLINK FULL PATH " << fullpath); |
199
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
151 |
|
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
152 |
Ptr<SocketFdFactory> factory = Current ()->process->manager->GetObject<LocalSocketFdFactory> (); |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
153 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
154 |
if (0 != factory) |
199
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
155 |
{ |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
156 |
factory->UnlinkNotify (fullpath); |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
157 |
} |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
158 |
factory = Current ()->process->manager->GetObject<SocketFdFactory> (); |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
159 |
if (0 != factory) |
199
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
160 |
{ |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
161 |
factory->UnlinkNotify (fullpath); |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
162 |
} |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
163 |
} |
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
164 |
|
1 | 165 |
int dce_unlink (const char *pathname) |
0 | 166 |
{ |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
167 |
NS_LOG_FUNCTION (pathname); |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
168 |
int ret = dce_unlink_real (pathname); |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
169 |
|
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
170 |
if (0 == ret) |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
171 |
{ |
164 | 172 |
std::string fullpath = UtilsGetRealFilePath (pathname); |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
173 |
|
199
458fa0e6a08c
add fchdir, unlinkat, __fxstatat .
frederic.urbani@inria.fr
parents:
195
diff
changeset
|
174 |
unlink_notify (fullpath); |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
175 |
} |
164 | 176 |
|
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
177 |
return ret; |
0 | 178 |
} |
164 | 179 |
int dce_mkdir (const char *pathname, mode_t mode) |
0 | 180 |
{ |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
181 |
mode_t m = (mode & ~(Current ()->process->uMask)); |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
182 |
DEFINE_FORWARDER_PATH (mkdir, pathname, m); |
0 | 183 |
} |
164 | 184 |
int dce_rmdir (const char *pathname) |
0 | 185 |
{ |
186 |
DEFINE_FORWARDER_PATH (rmdir, pathname); |
|
187 |
} |
|
412
b6d3dc1d6def
Bug 1594 - gcov coverage test support for applications over DCE
Hajime Tazaki <tazaki@nict.go.jp>
parents:
387
diff
changeset
|
188 |
int dce_access (const char *pathname, int mode) |
b6d3dc1d6def
Bug 1594 - gcov coverage test support for applications over DCE
Hajime Tazaki <tazaki@nict.go.jp>
parents:
387
diff
changeset
|
189 |
{ |
b6d3dc1d6def
Bug 1594 - gcov coverage test support for applications over DCE
Hajime Tazaki <tazaki@nict.go.jp>
parents:
387
diff
changeset
|
190 |
DEFINE_FORWARDER_PATH (access, pathname, mode); |
b6d3dc1d6def
Bug 1594 - gcov coverage test support for applications over DCE
Hajime Tazaki <tazaki@nict.go.jp>
parents:
387
diff
changeset
|
191 |
} |
1 | 192 |
int dce_close (int fd) |
0 | 193 |
{ |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
194 |
int retval = 0; |
0 | 195 |
NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << fd); |
196 |
NS_ASSERT (Current () != 0); |
|
197 |
Thread *current = Current (); |
|
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
198 |
std::map<int,FileUsage *>::iterator it = current->process->openFiles.find (fd); |
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
199 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
200 |
if (it == current->process->openFiles.end ()) |
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
201 |
{ |
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
202 |
current->err = EBADF; |
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
203 |
return -1; |
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
204 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
205 |
|
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
206 |
FileUsage *fu = current->process->openFiles[fd]; |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
207 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
208 |
if (fu->GetFile () && (1 == fu->GetFile ()->GetFdCount ())) |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
209 |
{ |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
210 |
// If only one process point to file we can really close it |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
211 |
// else we be closed while the last process close it |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
212 |
retval = fu->GetFile ()->Close (); |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
213 |
} |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
214 |
if (fu->CanForget ()) |
0 | 215 |
{ |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
216 |
// If no thread of this process is using it we can free the corresponding fd entry |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
217 |
// else we be freed by last thread renoncing of using it |
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
218 |
current->process->openFiles.erase (fd); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
219 |
delete fu; |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
220 |
fu = 0; |
0 | 221 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
222 |
|
0 | 223 |
return retval; |
224 |
} |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
225 |
|
164 | 226 |
int dce_isatty (int fd) |
0 | 227 |
{ |
228 |
Thread *current = Current (); |
|
229 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd); |
|
230 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
231 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
232 |
OPENED_FD_METHOD (int, Isatty ()); |
0 | 233 |
} |
190 | 234 |
char* dce_ttyname (int fd) |
235 |
{ |
|
236 |
Thread *current = Current (); |
|
237 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd); |
|
238 |
NS_ASSERT (current != 0); |
|
239 |
||
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
240 |
OPENED_FD_METHOD (char*, Ttyname ()); |
190 | 241 |
} |
164 | 242 |
ssize_t dce_send (int fd, const void *buf, size_t len, int flags) |
0 | 243 |
{ |
244 |
NS_LOG_FUNCTION (fd << buf << len << flags); |
|
1 | 245 |
return dce_sendto (fd, buf, len, flags, 0, 0); |
0 | 246 |
} |
164 | 247 |
ssize_t dce_sendto (int fd, const void *buf, size_t len, int flags, |
248 |
const struct sockaddr *to, socklen_t tolen) |
|
0 | 249 |
{ |
250 |
NS_LOG_FUNCTION (Current () << fd << buf << len << flags << to << tolen); |
|
251 |
NS_ASSERT (Current () != 0); |
|
252 |
struct msghdr msg; |
|
253 |
struct iovec iov; |
|
254 |
msg.msg_control = 0; |
|
255 |
msg.msg_controllen = 0; |
|
256 |
msg.msg_iovlen = 1; |
|
257 |
msg.msg_iov = &iov; |
|
258 |
iov.iov_len = len; |
|
259 |
iov.iov_base = (void *)buf; |
|
260 |
msg.msg_name = (void *)to; |
|
261 |
msg.msg_namelen = tolen; |
|
1 | 262 |
ssize_t retval = dce_sendmsg (fd, &msg, flags); |
0 | 263 |
return retval; |
264 |
} |
|
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
265 |
|
164 | 266 |
ssize_t dce_sendmsg (int fd, const struct msghdr *msg, int flags) |
0 | 267 |
{ |
268 |
Thread *current = Current (); |
|
269 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << msg << flags); |
|
270 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
271 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
272 |
OPENED_FD_METHOD (ssize_t, Sendmsg (msg, flags)) |
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
273 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
274 |
|
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
275 |
int dce_ioctl (int fd, long unsigned int request, ...) |
0 | 276 |
{ |
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
277 |
va_list vl; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
278 |
va_start (vl, request); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
279 |
char *argp = va_arg (vl, char*); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
280 |
va_end (vl); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
281 |
|
0 | 282 |
Thread *current = Current (); |
283 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << request << argp); |
|
284 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
285 |
|
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
286 |
OPENED_FD_METHOD (int, Ioctl (request, argp)) |
0 | 287 |
} |
1 | 288 |
ssize_t dce_write (int fd, const void *buf, size_t count) |
0 | 289 |
{ |
290 |
NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << fd << buf << count); |
|
291 |
Thread *current = Current (); |
|
292 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
293 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
294 |
OPENED_FD_METHOD (int, Write (buf, count)) |
0 | 295 |
} |
195 | 296 |
|
1 | 297 |
ssize_t dce_writev (int fd, const struct iovec *iov, int iovcnt) |
0 | 298 |
{ |
299 |
Thread *current = Current (); |
|
300 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << iov << iovcnt); |
|
301 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
302 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
303 |
if (!CheckFdExists (current->process, fd, true)) |
0 | 304 |
{ |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
305 |
NS_LOG_DEBUG ("write error"); |
0 | 306 |
current->err = EBADF; |
307 |
return -1; |
|
308 |
} |
|
309 |
||
310 |
size_t count = 0; |
|
311 |
for (int i = 0; i < iovcnt; ++i) |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
312 |
{ |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
313 |
count += iov[i].iov_len; |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
314 |
} |
0 | 315 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
316 |
if (count == 0) |
0 | 317 |
{ |
318 |
current->err = EINVAL; |
|
319 |
return -1; |
|
320 |
} |
|
321 |
||
515
98f8c21e069f
Bug 1759 - dce httpd example stops working with big files (~1MB)
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents:
412
diff
changeset
|
322 |
void *buf = malloc (count); |
0 | 323 |
for (int i = 0; i < iovcnt; ++i) |
324 |
{ |
|
515
98f8c21e069f
Bug 1759 - dce httpd example stops working with big files (~1MB)
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents:
412
diff
changeset
|
325 |
memcpy (buf, iov[i].iov_base, iov[i].iov_len); |
98f8c21e069f
Bug 1759 - dce httpd example stops working with big files (~1MB)
Hajime Tazaki <tazaki@sfc.wide.ad.jp>
parents:
412
diff
changeset
|
326 |
buf += iov[i].iov_len; |
0 | 327 |
} |
328 |
||
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
329 |
UnixFd *unixFd = current->process->openFiles[fd]->GetFileInc (); |
0 | 330 |
int retval = unixFd->Write (buf, count); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
331 |
FdDecUsage (fd); |
0 | 332 |
|
333 |
return retval; |
|
334 |
} |
|
335 |
||
1 | 336 |
ssize_t dce_read (int fd, void *buf, size_t count) |
0 | 337 |
{ |
338 |
Thread *current = Current (); |
|
339 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << buf << count); |
|
340 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
341 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
342 |
OPENED_FD_METHOD (int, Read (buf, count)) |
0 | 343 |
} |
1 | 344 |
int dce_socket (int domain, int type, int protocol) |
0 | 345 |
{ |
346 |
Thread *current = Current (); |
|
347 |
DceManager *manager = current->process->manager; |
|
348 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << domain << type << protocol); |
|
349 |
NS_ASSERT (current != 0); |
|
350 |
NS_ASSERT (manager != 0); |
|
351 |
||
164 | 352 |
Ptr<SocketFdFactory> factory = 0; |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
353 |
|
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
354 |
if (domain != AF_UNIX) |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
355 |
{ |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
356 |
factory = manager->GetObject<SocketFdFactory> (); |
87
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
357 |
} |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
358 |
else |
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
359 |
{ |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
360 |
if (type != SOCK_DGRAM && type != SOCK_STREAM) |
87
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
361 |
{ |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
362 |
current->err = EINVAL; |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
363 |
return -1; |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
364 |
} |
156
08557806d46e
Move 2 CreateObject to better place.
frederic.urbani@inria.fr
parents:
155
diff
changeset
|
365 |
factory = manager->GetObject<LocalSocketFdFactory> (); |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
366 |
} |
255
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
367 |
UnixFd *socket = factory->CreateSocket (domain, type, protocol); |
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
368 |
if (!socket) |
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
369 |
{ |
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
370 |
|
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
371 |
current->err = EINVAL; |
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
372 |
return -1; |
c1679ed514fb
Fix a crash when trying to create an IPV6 socket.
frederic.urbani@inria.fr
parents:
247
diff
changeset
|
373 |
} |
87
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
374 |
|
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
375 |
int fd = UtilsAllocateFd (); |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
376 |
if (fd == -1) |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
377 |
{ |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
378 |
current->err = EMFILE; |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
379 |
return -1; |
77f277cef341
Add Unix Socket Datagram Implementation.
frederic.urbani@inria.fr
parents:
80
diff
changeset
|
380 |
} |
251
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
381 |
if (!socket) |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
382 |
{ |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
383 |
return -1; |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
384 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
385 |
socket->IncFdCount (); |
164 | 386 |
current->process->openFiles[fd] = new FileUsage (fd, socket); |
75
9c15a394a814
add support of socket of domain AF_UNIX in libc emulation
frederic.urbani@inria.fr
parents:
31
diff
changeset
|
387 |
|
0 | 388 |
return fd; |
389 |
} |
|
300
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
390 |
ssize_t dce_readv (int fd, const struct iovec *iov, int iovcnt) |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
391 |
{ |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
392 |
Thread *current = Current (); |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
393 |
ssize_t ret = 0; |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
394 |
|
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
395 |
if ((0 == iov)||(iovcnt < 0)) |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
396 |
{ |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
397 |
current->err = EINVAL; |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
398 |
return -1; |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
399 |
} |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
400 |
for (int b = 0; b < iovcnt; b++) |
300
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
401 |
{ |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
402 |
ssize_t r = dce_read (fd, iov[b].iov_base, iov[b].iov_len); |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
403 |
if (r >= 0) |
300
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
404 |
{ |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
405 |
ret += r; |
387
342489bc9ac5
remove warning/error messages
Hajime Tazaki <tazaki@nict.go.jp>
parents:
367
diff
changeset
|
406 |
if (!r || (r < (ssize_t)iov[b].iov_len)) |
300
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
407 |
{ |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
408 |
return ret; |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
409 |
} |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
410 |
} |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
411 |
else |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
412 |
{ |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
413 |
return -1; |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
414 |
} |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
415 |
} |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
416 |
return ret; |
65899b480bb9
Add readv, vsnprinf, snprinf, tcgetattr, tcsetattr, statvfs, fstatvfs, pthread_equal.
frederic.urbani@inria.fr
parents:
258
diff
changeset
|
417 |
} |
251
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
418 |
int dce_socketpair (int domain, int type, int protocol, int sv[2]) |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
419 |
{ |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
420 |
sv[0] = dce_socket (domain, type, protocol); |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
421 |
if (sv[0] < 0) |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
422 |
{ |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
423 |
return -1; |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
424 |
} |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
425 |
|
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
426 |
sv[1] = dce_socket (domain, type, protocol); |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
427 |
if (sv[1] < 0) |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
428 |
{ |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
429 |
return -1; |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
430 |
} |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
431 |
|
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
432 |
return 0; |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
433 |
} |
5df5053d47ad
support umip(mip6d) with ns-3-linux for NEMO/MIP6
Hajime Tazaki <tazaki@nict.go.jp>
parents:
247
diff
changeset
|
434 |
|
1 | 435 |
int dce_bind (int fd, const struct sockaddr *my_addr, socklen_t addrlen) |
0 | 436 |
{ |
437 |
Thread *current = Current (); |
|
438 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << my_addr << addrlen); |
|
439 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
440 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
441 |
OPENED_FD_METHOD (int, Bind (my_addr, addrlen)) |
0 | 442 |
} |
1 | 443 |
int dce_connect (int fd, const struct sockaddr *my_addr, socklen_t addrlen) |
0 | 444 |
{ |
445 |
Thread *current = Current (); |
|
446 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << my_addr << addrlen); |
|
447 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
448 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
449 |
OPENED_FD_METHOD (int, Connect (my_addr, addrlen)) |
0 | 450 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
451 |
int dce_listen (int fd, int backlog) |
0 | 452 |
{ |
453 |
Thread *current = Current (); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
454 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << backlog); |
0 | 455 |
NS_ASSERT (current != 0); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
456 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
457 |
OPENED_FD_METHOD (int, Listen (backlog)) |
0 | 458 |
} |
164 | 459 |
int dce_accept (int fd, struct sockaddr *addr, socklen_t *addrlen) |
0 | 460 |
{ |
461 |
Thread *current = Current (); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
462 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << addr << addrlen); |
0 | 463 |
NS_ASSERT (current != 0); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
464 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
465 |
OPENED_FD_METHOD (int, Accept (addr, addrlen)) |
0 | 466 |
} |
164 | 467 |
int dce_shutdown (int fd, int how) |
0 | 468 |
{ |
469 |
Thread *current = Current (); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
470 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << how); |
0 | 471 |
NS_ASSERT (current != 0); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
472 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
473 |
OPENED_FD_METHOD (int, Shutdown (how)) |
0 | 474 |
} |
1 | 475 |
ssize_t dce_recv (int fd, void *buf, size_t count, int flags) |
0 | 476 |
{ |
477 |
NS_LOG_FUNCTION (fd << buf << count << flags); |
|
1 | 478 |
return dce_recvfrom (fd, buf, count, flags, 0, 0); |
0 | 479 |
} |
164 | 480 |
ssize_t dce_recvfrom (int fd, void *buf, size_t len, int flags, |
481 |
struct sockaddr *from, socklen_t *fromlen) |
|
0 | 482 |
{ |
483 |
NS_LOG_FUNCTION (fd << buf << len << flags << from << fromlen); |
|
484 |
uint8_t address[SOCK_MAX_ADDRESS_SIZE]; |
|
485 |
struct msghdr msg; |
|
486 |
struct iovec iov; |
|
487 |
msg.msg_control = 0; |
|
488 |
msg.msg_controllen = 0; |
|
489 |
msg.msg_iovlen = 1; |
|
490 |
msg.msg_iov = &iov; |
|
491 |
iov.iov_len = len; |
|
492 |
iov.iov_base = buf; |
|
493 |
msg.msg_name = address; |
|
494 |
msg.msg_namelen = SOCK_MAX_ADDRESS_SIZE; |
|
1 | 495 |
ssize_t retval = dce_recvmsg (fd, &msg, flags); |
0 | 496 |
if (retval != -1 && from != 0) |
497 |
{ |
|
498 |
if (*fromlen < msg.msg_namelen) |
|
164 | 499 |
{ |
500 |
Thread *current = Current (); |
|
501 |
current->err = EINVAL; |
|
502 |
return -1; |
|
503 |
} |
|
0 | 504 |
else |
164 | 505 |
{ |
506 |
*fromlen = msg.msg_namelen; |
|
507 |
memcpy (from, msg.msg_name, msg.msg_namelen); |
|
508 |
} |
|
0 | 509 |
} |
510 |
return retval; |
|
511 |
} |
|
164 | 512 |
ssize_t dce_recvmsg (int fd, struct msghdr *msg, int flags) |
0 | 513 |
{ |
514 |
Thread *current = Current (); |
|
515 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << msg << flags); |
|
516 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
517 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
518 |
OPENED_FD_METHOD (ssize_t, Recvmsg (msg, flags)) |
0 | 519 |
} |
164 | 520 |
int dce_setsockopt (int fd, int level, int optname, |
521 |
const void *optval, socklen_t optlen) |
|
0 | 522 |
{ |
523 |
Thread *current = Current (); |
|
524 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << level << optname << optval << optlen); |
|
525 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
526 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
527 |
OPENED_FD_METHOD (int, Setsockopt (level, optname, optval, optlen)) |
0 | 528 |
} |
164 | 529 |
int dce_getsockopt (int fd, int level, int optname, |
530 |
void *optval, socklen_t *optlen) |
|
0 | 531 |
{ |
532 |
Thread *current = Current (); |
|
533 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << level << optname << optval << optlen); |
|
534 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
535 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
536 |
OPENED_FD_METHOD (int, Getsockopt (level, optname, optval, optlen)) |
0 | 537 |
} |
164 | 538 |
int dce_getsockname (int fd, struct sockaddr *name, socklen_t *namelen) |
0 | 539 |
{ |
540 |
Thread *current = Current (); |
|
541 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << name << namelen); |
|
542 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
543 |
|
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
544 |
OPENED_FD_METHOD (int, Getsockname (name, namelen)) |
0 | 545 |
} |
164 | 546 |
int dce_getpeername (int fd, struct sockaddr *name, socklen_t *namelen) |
0 | 547 |
{ |
548 |
Thread *current = Current (); |
|
549 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << name << namelen); |
|
550 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
551 |
|
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
552 |
OPENED_FD_METHOD (int, Getpeername (name, namelen)) |
0 | 553 |
} |
164 | 554 |
int dce_dup (int oldfd) |
0 | 555 |
{ |
556 |
Thread *current = Current (); |
|
557 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << oldfd); |
|
558 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
559 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
560 |
if (!CheckFdExists (current->process, oldfd, true)) |
0 | 561 |
{ |
562 |
current->err = EBADF; |
|
563 |
return -1; |
|
564 |
} |
|
565 |
int fd = UtilsAllocateFd (); |
|
566 |
if (fd == -1) |
|
567 |
{ |
|
568 |
current->err = EMFILE; |
|
569 |
return -1; |
|
570 |
} |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
571 |
|
192 | 572 |
UnixFd *unixFd = current->process->openFiles[oldfd]->GetFile (); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
573 |
unixFd->IncFdCount (); |
192 | 574 |
unixFd->Ref (); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
575 |
current->process->openFiles[fd] = new FileUsage (fd, unixFd); |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
576 |
|
0 | 577 |
return fd; |
578 |
} |
|
164 | 579 |
int dce_dup2 (int oldfd, int newfd) |
0 | 580 |
{ |
581 |
Thread *current = Current (); |
|
582 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << oldfd << newfd); |
|
583 |
NS_ASSERT (current != 0); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
584 |
if (!CheckFdExists (current->process, oldfd, true) || (newfd > MAX_FDS)) |
0 | 585 |
{ |
586 |
current->err = EBADF; |
|
587 |
return -1; |
|
588 |
} |
|
176
c6d150068894
Improve map usage. ( I forgot that mymap[x] create the element ! ).
frederic.urbani@inria.fr
parents:
169
diff
changeset
|
589 |
|
193 | 590 |
if (oldfd == newfd) |
591 |
{ |
|
592 |
return newfd; |
|
593 |
} |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
594 |
if (CheckFdExists (current->process, newfd, true)) |
193 | 595 |
{ |
596 |
if (dce_close (newfd)) |
|
597 |
{ |
|
598 |
current->err = EBADF; |
|
599 |
return -1; |
|
600 |
} |
|
601 |
} |
|
602 |
if (CheckFdExists (current->process, newfd, false)) |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
603 |
{ |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
604 |
current->err = EBADF; |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
605 |
return -1; |
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
606 |
} |
192 | 607 |
|
164 | 608 |
UnixFd *unixFd = current->process->openFiles[oldfd]->GetFile (); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
609 |
unixFd->IncFdCount (); |
192 | 610 |
unixFd->Ref (); |
611 |
current->process->openFiles[newfd] = new FileUsage (newfd, unixFd); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
612 |
|
0 | 613 |
return newfd; |
614 |
} |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
615 |
void * dce_mmap (void *addr, size_t length, int prot, int flags, |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
616 |
int fd, off_t offset) |
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
617 |
{ |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
618 |
return dce_mmap64 (addr, length, prot, flags, fd, offset); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
619 |
} |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
620 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
621 |
void * dce_mmap64 (void *start, size_t length, int prot, int flags, |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
622 |
int fd, off64_t offset) |
0 | 623 |
{ |
624 |
Thread *current = Current (); |
|
625 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << start << length << prot << flags << fd << offset); |
|
626 |
NS_ASSERT (current != 0); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
627 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
628 |
OPENED_FD_METHOD_ERR (MAP_FAILED, void *, Mmap (start, length, prot, flags, offset)) |
0 | 629 |
} |
164 | 630 |
int dce_munmap (void *start, size_t length) |
0 | 631 |
{ |
632 |
Thread *current = Current (); |
|
633 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << start << length); |
|
634 |
NS_ASSERT (current != 0); |
|
635 |
int retval = ::munmap (start, length); |
|
636 |
if (retval == -1) |
|
637 |
{ |
|
638 |
current->err = errno; |
|
639 |
return -1; |
|
640 |
} |
|
641 |
return 0; |
|
642 |
} |
|
164 | 643 |
off_t dce_lseek (int fildes, off_t offset, int whence) |
0 | 644 |
{ |
645 |
NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << fildes << offset << whence); |
|
1 | 646 |
return dce_lseek64 (fildes, offset, whence); |
0 | 647 |
} |
164 | 648 |
off64_t dce_lseek64 (int fd, off64_t offset, int whence) |
0 | 649 |
{ |
650 |
Thread *current = Current (); |
|
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
651 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << offset << whence); |
0 | 652 |
NS_ASSERT (current != 0); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
653 |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
654 |
OPENED_FD_METHOD (int, Lseek (offset, whence)) |
0 | 655 |
} |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
656 |
int dce_fcntl (int fd, int cmd, ... /*unsigned long arg*/) |
0 | 657 |
{ |
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
658 |
va_list vl; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
659 |
va_start (vl, cmd); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
660 |
unsigned long arg = va_arg (vl, unsigned long); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
661 |
va_end (vl); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
662 |
|
0 | 663 |
NS_LOG_FUNCTION (Current () << UtilsGetNodeId () << fd << cmd << arg); |
664 |
NS_ASSERT (Current () != 0); |
|
665 |
Thread *current = Current (); |
|
666 |
// XXX: we should handle specially some fcntl commands. |
|
667 |
// For example, FD_DUP, etc. |
|
193 | 668 |
|
669 |
switch (cmd) |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
670 |
{ |
193 | 671 |
case F_DUPFD: |
672 |
{ |
|
673 |
return dce_dup (fd); |
|
674 |
} |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
675 |
} |
193 | 676 |
|
677 |
||
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
678 |
OPENED_FD_METHOD (int, Fcntl (cmd, arg)) |
0 | 679 |
} |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
680 |
|
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
681 |
int dce_truncate (const char *path, off_t length) |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
682 |
{ |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
683 |
Thread *current = Current (); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
684 |
NS_ASSERT (current != 0); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
685 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << path << length); |
157
ed52e89aa2db
New Poll/select implementation, without kernel support.
frederic.urbani@inria.fr
parents:
156
diff
changeset
|
686 |
|
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
687 |
int fd = dce_open (path, O_WRONLY, 0); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
688 |
if (fd == -1) |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
689 |
{ |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
690 |
current->err = errno; |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
691 |
return -1; |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
692 |
} |
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
693 |
|
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
694 |
return dce_ftruncate (fd, length); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
695 |
} |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
696 |
|
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
697 |
int dce_ftruncate (int fd, off_t length) |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
698 |
{ |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
699 |
Thread *current = Current (); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
700 |
NS_ASSERT (current != 0); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
701 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << length); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
702 |
/* |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
703 |
int index = UtilsSearchOpenFd (fildes); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
704 |
if (index == -1) |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
705 |
{ |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
706 |
current->err = EBADF; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
707 |
return -1; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
708 |
} |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
709 |
UnixFd *unixFd = current->process->openFiles[index].second; |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
710 |
int retval = unixFd->Ftruncate (length); |
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
711 |
return retval; |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
712 |
*/ |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
713 |
OPENED_FD_METHOD (int, Ftruncate (length)) |
181
231e0431cf57
Merge with Alexander Afanasyev changes :
frederic.urbani@inria.fr
parents:
176
diff
changeset
|
714 |
} |
247 | 715 |
int dce_ftruncate64 (int fd, off_t length) |
716 |
{ |
|
717 |
Thread *current = Current (); |
|
718 |
NS_ASSERT (current != 0); |
|
719 |
NS_LOG_FUNCTION (current << UtilsGetNodeId () << fd << length); |
|
720 |
return dce_ftruncate (fd, length); |
|
721 |
} |
|
722 |
||
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
723 |
int dce_pipe (int pipefd[2]) |
190 | 724 |
{ |
725 |
Thread *current = Current (); |
|
726 |
NS_ASSERT (current != 0); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
727 |
NS_LOG_FUNCTION (current << UtilsGetNodeId ()); |
190 | 728 |
|
729 |
if (0 == pipefd) |
|
730 |
{ |
|
731 |
current->err = EFAULT; |
|
732 |
return -1; |
|
733 |
} |
|
734 |
int fdRead = UtilsAllocateFd (); |
|
735 |
if (fdRead == -1) |
|
736 |
{ |
|
737 |
current->err = EMFILE; |
|
738 |
return -1; |
|
739 |
} |
|
740 |
PipeFd *reader = new PipeFd (); |
|
741 |
||
742 |
if (!reader) |
|
743 |
{ |
|
744 |
current->err = EMFILE; |
|
745 |
return -1; |
|
746 |
} |
|
747 |
current->process->openFiles[fdRead] = new FileUsage (fdRead, reader); |
|
748 |
||
749 |
int fdWrite = UtilsAllocateFd (); |
|
750 |
if (fdWrite == -1) |
|
751 |
{ |
|
752 |
delete current->process->openFiles[fdRead]; |
|
195 | 753 |
current->process->openFiles.erase (fdRead); |
190 | 754 |
delete reader; |
755 |
current->err = EMFILE; |
|
756 |
return -1; |
|
757 |
} |
|
758 |
||
759 |
PipeFd *writer = new PipeFd (reader); |
|
760 |
||
761 |
if (!writer) |
|
762 |
{ |
|
763 |
delete current->process->openFiles[fdRead]; |
|
195 | 764 |
current->process->openFiles.erase (fdRead); |
190 | 765 |
delete reader; |
766 |
current->err = EMFILE; |
|
767 |
return -1; |
|
768 |
} |
|
769 |
current->process->openFiles[fdWrite] = new FileUsage (fdWrite, writer); |
|
770 |
||
771 |
// writer->m_peer = reader; |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
772 |
reader->IncFdCount (); |
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
773 |
writer->IncFdCount (); |
190 | 774 |
|
775 |
pipefd [0] = fdRead; |
|
776 |
pipefd [1] = fdWrite; |
|
777 |
||
778 |
return 0; |
|
779 |
} |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
780 |
ssize_t dce_pread (int fd, void *buf, size_t count, off_t offset) |
218 | 781 |
{ |
782 |
Thread *current = Current (); |
|
783 |
NS_ASSERT (current != 0); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
784 |
NS_LOG_FUNCTION (current << UtilsGetNodeId ()); |
190 | 785 |
|
218 | 786 |
off_t currentOffset = dce_lseek (fd, 0, SEEK_CUR); |
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
787 |
if (-1 == currentOffset) |
218 | 788 |
{ |
789 |
return (ssize_t) -1; |
|
790 |
} |
|
791 |
off_t res = dce_lseek (fd, offset, SEEK_SET); |
|
792 |
if (res != offset) |
|
793 |
{ |
|
794 |
current->err = EINVAL; |
|
795 |
return (ssize_t) -1; |
|
796 |
} |
|
797 |
ssize_t ret = dce_read (fd, buf, count); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
798 |
if (-1 == ret) |
218 | 799 |
{ |
800 |
return ret; |
|
801 |
} |
|
802 |
// Return to original offset. |
|
803 |
res = dce_lseek (fd, currentOffset, SEEK_SET); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
804 |
if (res != currentOffset) |
218 | 805 |
{ |
806 |
return (ssize_t) -1; |
|
807 |
} |
|
808 |
return ret; |
|
809 |
} |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
810 |
ssize_t dce_pwrite (int fd, const void *buf, size_t count, off_t offset) |
218 | 811 |
{ |
812 |
Thread *current = Current (); |
|
813 |
NS_ASSERT (current != 0); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
814 |
NS_LOG_FUNCTION (current << UtilsGetNodeId ()); |
218 | 815 |
|
816 |
off_t currentOffset = dce_lseek (fd, 0, SEEK_CUR); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
817 |
if (-1 == currentOffset) |
218 | 818 |
{ |
819 |
return (ssize_t) -1; |
|
820 |
} |
|
821 |
off_t res = dce_lseek (fd, offset, SEEK_SET); |
|
822 |
if (res != offset) |
|
823 |
{ |
|
824 |
current->err = EINVAL; |
|
825 |
return (ssize_t) -1; |
|
826 |
} |
|
827 |
ssize_t ret = dce_write (fd, buf, count); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
828 |
if (-1 == ret) |
218 | 829 |
{ |
830 |
return ret; |
|
831 |
} |
|
832 |
// Return to original offset. |
|
833 |
res = dce_lseek (fd, currentOffset, SEEK_SET); |
|
367
be749a6bbde0
coding style adapted. check-style.py applied with manuay modification.
Hajime Tazaki <tazaki@nict.go.jp>
parents:
300
diff
changeset
|
834 |
if (res != currentOffset) |
218 | 835 |
{ |
836 |
return (ssize_t) -1; |
|
837 |
} |
|
838 |
return ret; |
|
839 |
} |