1 | /* |
1 | /* |
2 | * libeio implementation |
2 | * libeio implementation |
3 | * |
3 | * |
4 | * Copyright (c) 2007,2008,2009,2010 Marc Alexander Lehmann <libeio@schmorp.de> |
4 | * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libeio@schmorp.de> |
5 | * All rights reserved. |
5 | * All rights reserved. |
6 | * |
6 | * |
7 | * Redistribution and use in source and binary forms, with or without modifica- |
7 | * Redistribution and use in source and binary forms, with or without modifica- |
8 | * tion, are permitted provided that the following conditions are met: |
8 | * tion, are permitted provided that the following conditions are met: |
9 | * |
9 | * |
… | |
… | |
79 | # include <unistd.h> |
79 | # include <unistd.h> |
80 | # include <utime.h> |
80 | # include <utime.h> |
81 | # include <signal.h> |
81 | # include <signal.h> |
82 | # include <dirent.h> |
82 | # include <dirent.h> |
83 | |
83 | |
84 | #if _POSIX_MEMLOCK || _POSIX_MAPPED_FILES |
84 | #if _POSIX_MEMLOCK || _POSIX_MEMLOCK_RANGE || _POSIX_MAPPED_FILES |
85 | # include <sys/mman.h> |
85 | # include <sys/mman.h> |
86 | #endif |
86 | #endif |
87 | |
87 | |
88 | /* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */ |
88 | /* POSIX_SOURCE is useless on bsd's, and XOPEN_SOURCE is unreliable there, too */ |
89 | # if __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ |
89 | # if __FreeBSD__ || defined __NetBSD__ || defined __OpenBSD__ |
… | |
… | |
1431 | /* round up length */ |
1431 | /* round up length */ |
1432 | *length = (*length + mask) & ~mask; |
1432 | *length = (*length + mask) & ~mask; |
1433 | } |
1433 | } |
1434 | |
1434 | |
1435 | #if !_POSIX_MEMLOCK |
1435 | #if !_POSIX_MEMLOCK |
1436 | # define eio__mlock(a,b) ((errno = ENOSYS), -1) |
|
|
1437 | # define eio__mlockall(a) ((errno = ENOSYS), -1) |
1436 | # define eio__mlockall(a) ((errno = ENOSYS), -1) |
1438 | #else |
1437 | #else |
1439 | |
|
|
1440 | static int |
|
|
1441 | eio__mlock (void *addr, size_t length) |
|
|
1442 | { |
|
|
1443 | eio_page_align (&addr, &length); |
|
|
1444 | |
|
|
1445 | return mlock (addr, length); |
|
|
1446 | } |
|
|
1447 | |
1438 | |
1448 | static int |
1439 | static int |
1449 | eio__mlockall (int flags) |
1440 | eio__mlockall (int flags) |
1450 | { |
1441 | { |
1451 | #if __GLIBC__ == 2 && __GLIBC_MINOR__ <= 7 |
1442 | #if __GLIBC__ == 2 && __GLIBC_MINOR__ <= 7 |
… | |
… | |
1461 | | (flags & EIO_MCL_FUTURE ? MCL_FUTURE : 0); |
1452 | | (flags & EIO_MCL_FUTURE ? MCL_FUTURE : 0); |
1462 | } |
1453 | } |
1463 | |
1454 | |
1464 | return mlockall (flags); |
1455 | return mlockall (flags); |
1465 | } |
1456 | } |
|
|
1457 | #endif |
|
|
1458 | |
|
|
1459 | #if !_POSIX_MEMLOCK_RANGE |
|
|
1460 | # define eio__mlock(a,b) ((errno = ENOSYS), -1) |
|
|
1461 | #else |
|
|
1462 | |
|
|
1463 | static int |
|
|
1464 | eio__mlock (void *addr, size_t length) |
|
|
1465 | { |
|
|
1466 | eio_page_align (&addr, &length); |
|
|
1467 | |
|
|
1468 | return mlock (addr, length); |
|
|
1469 | } |
|
|
1470 | |
1466 | #endif |
1471 | #endif |
1467 | |
1472 | |
1468 | #if !(_POSIX_MAPPED_FILES && _POSIX_SYNCHRONIZED_IO) |
1473 | #if !(_POSIX_MAPPED_FILES && _POSIX_SYNCHRONIZED_IO) |
1469 | # define eio__msync(a,b,c) ((errno = ENOSYS), -1) |
1474 | # define eio__msync(a,b,c) ((errno = ENOSYS), -1) |
1470 | #else |
1475 | #else |
… | |
… | |
1676 | case EIO_RMDIR: req->result = rmdir (req->ptr1); break; |
1681 | case EIO_RMDIR: req->result = rmdir (req->ptr1); break; |
1677 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
1682 | case EIO_MKDIR: req->result = mkdir (req->ptr1, (mode_t)req->int2); break; |
1678 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
1683 | case EIO_RENAME: req->result = rename (req->ptr1, req->ptr2); break; |
1679 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
1684 | case EIO_LINK: req->result = link (req->ptr1, req->ptr2); break; |
1680 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
1685 | case EIO_SYMLINK: req->result = symlink (req->ptr1, req->ptr2); break; |
1681 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->int3); break; |
1686 | case EIO_MKNOD: req->result = mknod (req->ptr1, (mode_t)req->int2, (dev_t)req->offs); break; |
1682 | |
1687 | |
1683 | case EIO_READLINK: ALLOC (PATH_MAX); |
1688 | case EIO_READLINK: ALLOC (PATH_MAX); |
1684 | req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break; |
1689 | req->result = readlink (req->ptr1, req->ptr2, PATH_MAX); break; |
1685 | |
1690 | |
1686 | case EIO_SYNC: req->result = 0; sync (); break; |
1691 | case EIO_SYNC: req->result = 0; sync (); break; |
… | |
… | |
1936 | REQ (EIO_READDIR); PATH; req->int1 = flags; SEND; |
1941 | REQ (EIO_READDIR); PATH; req->int1 = flags; SEND; |
1937 | } |
1942 | } |
1938 | |
1943 | |
1939 | eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data) |
1944 | eio_req *eio_mknod (const char *path, mode_t mode, dev_t dev, int pri, eio_cb cb, void *data) |
1940 | { |
1945 | { |
1941 | REQ (EIO_MKNOD); PATH; req->int2 = (long)mode; req->int3 = (long)dev; SEND; |
1946 | REQ (EIO_MKNOD); PATH; req->int2 = (long)mode; req->offs = (off_t)dev; SEND; |
1942 | } |
1947 | } |
1943 | |
1948 | |
1944 | static eio_req * |
1949 | static eio_req * |
1945 | eio__2path (int type, const char *path, const char *new_path, int pri, eio_cb cb, void *data) |
1950 | eio__2path (int type, const char *path, const char *new_path, int pri, eio_cb cb, void *data) |
1946 | { |
1951 | { |