#include <sys/resource.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
int main(){
  struct rlimit l;
  getrlimit(RLIMIT_NOFILE,&l);
  printf("initial cur=%llu max=%llu\n",(unsigned long long)l.rlim_cur,(unsigned long long)l.rlim_max);
  struct rlimit s={256, l.rlim_max};
  if(setrlimit(RLIMIT_NOFILE,&s)!=0) printf("set256 failed: %s\n",strerror(errno));
  getrlimit(RLIMIT_NOFILE,&l);
  printf("now cur=%llu max=%llu\n",(unsigned long long)l.rlim_cur,(unsigned long long)l.rlim_max);
  unsigned long long target = l.rlim_max < (1ULL<<20) ? l.rlim_max : (1ULL<<20);
  s.rlim_cur = target; s.rlim_max = l.rlim_max;
  int r = setrlimit(RLIMIT_NOFILE,&s);
  printf("set target=%llu -> %d (%s)\n", target, r, r?strerror(errno):"ok");
  getrlimit(RLIMIT_NOFILE,&l);
  printf("final cur=%llu max=%llu\n",(unsigned long long)l.rlim_cur,(unsigned long long)l.rlim_max);
  return 0;
}
