ulimit.c 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* vi: set sw=4 ts=4: */
  2. /*
  3. * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
  4. *
  5. * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  6. */
  7. #define _GNU_SOURCE
  8. #define _LARGEFILE64_SOURCE
  9. #include <features.h>
  10. #undef __OPTIMIZE__
  11. /* We absolutely do _NOT_ want interfaces silently
  12. * * * renamed under us or very bad things will happen... */
  13. #ifdef __USE_FILE_OFFSET64
  14. # undef __USE_FILE_OFFSET64
  15. #endif
  16. #ifdef __NR_ulimit
  17. #include <sys/types.h>
  18. #include <sys/syscall.h>
  19. _syscall2(long, ulimit, int, cmd, int, arg);
  20. #else
  21. #include <stdarg.h>
  22. #include <unistd.h>
  23. #include <ulimit.h>
  24. #include <errno.h>
  25. #include <sys/resource.h>
  26. libc_hidden_proto(sysconf)
  27. libc_hidden_proto(getrlimit)
  28. libc_hidden_proto(setrlimit)
  29. long int ulimit(int cmd, ...)
  30. {
  31. va_list va;
  32. struct rlimit limit;
  33. long int result = -1;
  34. va_start (va, cmd);
  35. switch (cmd) {
  36. /* Get limit on file size. */
  37. case UL_GETFSIZE:
  38. if (getrlimit(RLIMIT_FSIZE, &limit) == 0)
  39. result = limit.rlim_cur / 512; /* bytes to 512 byte blocksize */
  40. break;
  41. /* Set limit on file size. */
  42. case UL_SETFSIZE:
  43. result = va_arg (va, long int);
  44. if ((rlim_t) result > RLIM_INFINITY / 512) {
  45. limit.rlim_cur = RLIM_INFINITY;
  46. limit.rlim_max = RLIM_INFINITY;
  47. } else {
  48. limit.rlim_cur = result * 512;
  49. limit.rlim_max = result * 512;
  50. }
  51. result = setrlimit(RLIMIT_FSIZE, &limit);
  52. break;
  53. case __UL_GETOPENMAX:
  54. result = sysconf(_SC_OPEN_MAX);
  55. break;
  56. default:
  57. __set_errno(EINVAL);
  58. }
  59. va_end (va);
  60. return result;
  61. }
  62. #endif