… | |
… | |
237 | |
237 | |
238 | static sigset_t fullsigset; |
238 | static sigset_t fullsigset; |
239 | |
239 | |
240 | #undef errno |
240 | #undef errno |
241 | #include <asm/unistd.h> |
241 | #include <asm/unistd.h> |
|
|
242 | #include <linux/types.h> |
242 | #include <sys/prctl.h> |
243 | #include <sys/prctl.h> |
243 | |
244 | |
244 | #if BYTE_ORDER == LITTLE_ENDIAN |
245 | #if BYTE_ORDER == LITTLE_ENDIAN |
245 | # define LONG_LONG_PAIR(HI, LO) LO, HI |
246 | # define LONG_LONG_PAIR(HI, LO) LO, HI |
246 | #elif BYTE_ORDER == BIG_ENDIAN |
247 | #elif BYTE_ORDER == BIG_ENDIAN |
… | |
… | |
280 | aio_req req; |
281 | aio_req req; |
281 | int errno; |
282 | int errno; |
282 | |
283 | |
283 | /* this is very much kernel-specific :(:(:( */ |
284 | /* this is very much kernel-specific :(:(:( */ |
284 | /* we rely on gcc's ability to create closures. */ |
285 | /* we rely on gcc's ability to create closures. */ |
285 | _syscall3(int,read,int,fd,char *,buf,size_t,count) |
286 | _syscall3(__kernel_size_t,read,unsigned int,fd,char *,buf,__kernel_size_t,count) |
286 | _syscall3(int,write,int,fd,char *,buf,size_t,count) |
287 | _syscall3(__kernel_size_t,write,unsigned int,fd,char *,buf,__kernel_size_t,count) |
287 | |
288 | |
288 | _syscall3(int,open,char *,pathname,int,flags,mode_t,mode) |
289 | _syscall3(int,open,char *,pathname,int,flags,int,mode) |
289 | _syscall1(int,close,int,fd) |
290 | _syscall1(int,close,unsigned int,fd) |
290 | |
291 | |
291 | #if __NR_pread64 |
292 | #ifndef __NR_pread64 |
292 | _syscall5(int,pread64,int,fd,char *,buf,size_t,count,unsigned int,offset_lh,unsigned int,offset_hl) |
293 | # define __NR_pread64 __NR_pread |
293 | _syscall5(int,pwrite64,int,fd,char *,buf,size_t,count,unsigned int,offset_lh,unsigned int,offset_hl) |
294 | # define __NR_pwrite64 __NR_write |
294 | #elif __NR_pread |
|
|
295 | _syscall4(int,pread,int,fd,char *,buf,size_t,count,offset_t,offset) |
|
|
296 | _syscall4(int,pwrite,int,fd,char *,buf,size_t,count,offset_t,offset) |
|
|
297 | #else |
|
|
298 | # error "neither pread nor pread64 defined" |
|
|
299 | #endif |
295 | #endif |
300 | |
296 | _syscall5(__kernel_ssize_t,pread64,unsigned int,fd,char *,buf,__kernel_size_t,count,unsigned int,offset_lh,unsigned int,offset_hl) |
|
|
297 | _syscall5(__kernel_ssize_t,pwrite64,unsigned int,fd,char *,buf,__kernel_size_t,count,unsigned int,offset_lh,unsigned int,offset_hl) |
301 | |
298 | |
302 | #if __NR_stat64 |
299 | #if __NR_stat64 |
303 | _syscall2(int,stat64, const char *, filename, struct kernelstat64 *, buf) |
300 | _syscall2(int,stat64, const char *, filename, struct kernelstat64 *, buf) |
304 | _syscall2(int,lstat64, const char *, filename, struct kernelstat64 *, buf) |
301 | _syscall2(int,lstat64, const char *, filename, struct kernelstat64 *, buf) |
305 | _syscall2(int,fstat64, int, fd, struct kernelstat64 *, buf) |
302 | _syscall2(int,fstat64, int, fd, struct kernelstat64 *, buf) |
… | |
… | |
322 | req->thread = thr; |
319 | req->thread = thr; |
323 | errno = 0; /* strictly unnecessary */ |
320 | errno = 0; /* strictly unnecessary */ |
324 | |
321 | |
325 | switch (req->type) |
322 | switch (req->type) |
326 | { |
323 | { |
327 | #if __NR_pread64 |
|
|
328 | case REQ_READ: req->result = pread64 (req->fd, req->dataptr, req->length, |
324 | case REQ_READ: req->result = pread64 (req->fd, req->dataptr, req->length, |
329 | LONG_LONG_PAIR (req->offset >> 32, req->offset & 0xffffffff)); break; |
325 | LONG_LONG_PAIR (req->offset >> 32, req->offset & 0xffffffff)); break; |
330 | case REQ_WRITE: req->result = pwrite64(req->fd, req->dataptr, req->length, |
326 | case REQ_WRITE: req->result = pwrite64(req->fd, req->dataptr, req->length, |
331 | LONG_LONG_PAIR (req->offset >> 32, req->offset & 0xffffffff)); break; |
327 | LONG_LONG_PAIR (req->offset >> 32, req->offset & 0xffffffff)); break; |
332 | #else |
|
|
333 | case REQ_READ: req->result = pread (req->fd, req->dataptr, req->length, req->offset); break; |
|
|
334 | case REQ_WRITE: req->result = pwrite (req->fd, req->dataptr, req->length, req->offset); break; |
|
|
335 | #endif |
|
|
336 | #if __NR_stat64 |
328 | #if __NR_stat64 |
337 | struct kernelstat64 statdata; |
329 | struct kernelstat64 statdata; |
338 | case REQ_STAT: req->result = stat64 (req->dataptr, &statdata); COPY_STATDATA; break; |
330 | case REQ_STAT: req->result = stat64 (req->dataptr, &statdata); COPY_STATDATA; break; |
339 | case REQ_LSTAT: req->result = lstat64 (req->dataptr, &statdata); COPY_STATDATA; break; |
331 | case REQ_LSTAT: req->result = lstat64 (req->dataptr, &statdata); COPY_STATDATA; break; |
340 | case REQ_FSTAT: req->result = fstat64 (req->fd, &statdata); COPY_STATDATA; break; |
332 | case REQ_FSTAT: req->result = fstat64 (req->fd, &statdata); COPY_STATDATA; break; |