#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
/*keinerlei Limits (unbegrenzt)*/
#define NO_LIMIT RLIM_INFINITY

enum{ERROR=-1, SUCCESS};

int limit_wert[] = {RLIMIT_CORE, RLIMIT_CPU, RLIMIT_DATA, RLIMIT_FSIZE,
                    RLIMIT_MEMLOCK, RLIMIT_NOFILE, RLIMIT_NPROC, RLIMIT_OFILE,
                    RLIMIT_RSS, RLIMIT_STACK, /*RLIMIT_VMEM*/};

char *limit_name[] = {"RLIMIT_CORE","RLIMIT_CPU","RLIMIT_DATA","RLIMIT_FSIZE",
                      "RLIMIT_MEMLOCK","RLIMIT_NOFILE","RLIMIT_NPROC","RLIMIT_OFILE",
                      "RLIMIT_RSS","RLIMIT_STACK",/*"RLIMIT_VMEM",*/NULL};

void read_limit(int resource, char *name)
{
   struct rlimit limit;

   /*Wir Erfragen nach dem Limit 'resource'*/
   if(getrlimit(resource, &limit) == ERROR)
     {
       printf("Fehler bei getrlimit...\n");
       exit(0);
     }

   printf("%15s | Soft-Limit : ",name);

   if(limit.rlim_cur == NO_LIMIT)
       printf("unbegrenzt |");
   else
       printf("%12ld |",limit.rlim_cur);

   printf("Hard-Limit : ");
   if(limit.rlim_max == NO_LIMIT)
       printf("unbegrenzt |");
   else
       printf("%12ld|",limit.rlim_max);

   if(limit.rlim_cur == limit.rlim_max)
       printf("(Soft-Limit = maximal)\n");
   else
       printf("(Soft-Limt = erweiterbar\n");
}


/*Funktion zum setzen eines Limits. Ist beschränkt auf Soft-Limits*/
void set_limit(int resource, char *name)
{
   struct rlimit limit;
   long neuer_wert;

   printf("\nWir verändern nur Soft-Limits!!\n\n");
   printf("Welchen Wert soll der Soft-Limit von %s bekommen : ",name);
   scanf("%ld",&neuer_wert);

   if(getrlimit(resource, &limit) == ERROR)
     {
       printf("Fehler bei getrlimit...\n");
       exit(0);
     }

   limit.rlim_cur=neuer_wert;
   if(setrlimit(resource, &limit) == ERROR)
     {
       printf("Fehler bei setrlimit...\n");
       exit(0);
     }

   printf("\nLese das Soft-Limit von %s nochmals....\n",name);
   read_limit(resource, name);
   printf("\n\n");
}


int main()
{
   int i,x;

   printf("\n");
   while(1)
     {
       for(i=0; limit_name[i] != NULL; i++)
         {
           printf("%2d - %-15s ",i,limit_name[i]);
           if(!(i%3))
             printf("\n");
         }
       printf("\n\nWelches Limit wollen sie verändern (99=ENDE): ");
       scanf("%d",&x);
       if(x==99)
           break;

       read_limit(limit_wert[x], limit_name[x]);
       set_limit(limit_wert[x], limit_name[x]);
     }

   return 0;
}
