diff -Nrup Linux-PAM-0.77.rlimit_prio/modules/pam_limits/limits.skel Linux-PAM-0.77.rlimit_by_number/modules/pam_limits/limits.skel
--- Linux-PAM-0.77.rlimit_prio/modules/pam_limits/limits.skel	2005-01-09 04:51:27.439463677 +0100
+++ Linux-PAM-0.77.rlimit_by_number/modules/pam_limits/limits.skel	2005-01-09 05:02:23.467021212 +0100
@@ -34,6 +34,8 @@
 #                    40-139 for realtime polices
 #        - locks - max number of file locks the user can hold
 #
+#        - rlimit[n] - for rlimit no. n (see include/asm/resource.h)
+#
 #<domain>      <type>  <item>         <value>
 #
 
diff -Nrup Linux-PAM-0.77.rlimit_prio/modules/pam_limits/pam_limits.c Linux-PAM-0.77.rlimit_by_number/modules/pam_limits/pam_limits.c
--- Linux-PAM-0.77.rlimit_prio/modules/pam_limits/pam_limits.c	2005-01-09 04:49:31.218024237 +0100
+++ Linux-PAM-0.77.rlimit_by_number/modules/pam_limits/pam_limits.c	2005-01-09 05:06:34.653901802 +0100
@@ -42,6 +42,9 @@
 /* Module defines */
 #define LINE_LENGTH 1024
 
+/* extend RLIM_NLIMITS for furture RLIMITs */
+#define RLIM_NLIMITS_EXT (RLIM_NLIMITS+10)
+
 #define LIMITS_DEF_USER     0 /* limit was set by an user entry */
 #define LIMITS_DEF_GROUP    1 /* limit was set by a group entry */
 #define LIMITS_DEF_DEFAULT  2 /* limit was set by an default entry */
@@ -72,17 +75,17 @@ struct pam_limit_s {
     int flag_numsyslogins; /* whether to limit logins only for a
 			      specific user or to count all logins */
     int priority;	 /* the priority to run user process with */
-    int supported[RLIM_NLIMITS];
-    struct user_limits_struct limits[RLIM_NLIMITS];
+    int supported[RLIM_NLIMITS_EXT];
+    struct user_limits_struct limits[RLIM_NLIMITS_EXT];
     char conf_file[BUFSIZ];
     int utmp_after_pam_call;
     char login_group[LINE_LENGTH];
 };
 
-#define LIMIT_LOGIN RLIM_NLIMITS+1
-#define LIMIT_NUMSYSLOGINS RLIM_NLIMITS+2
+#define LIMIT_LOGIN RLIM_NLIMITS_EXT+1
+#define LIMIT_NUMSYSLOGINS RLIM_NLIMITS_EXT+2
 
-#define LIMIT_PRI RLIM_NLIMITS+3
+#define LIMIT_PRI RLIM_NLIMITS_EXT+3
 
 #define LIMIT_SOFT  1
 #define LIMIT_HARD  2
@@ -232,7 +235,7 @@ static int init_limits(struct pam_limit_
 
     D(("called."));
 
-    for(i = 0; i < RLIM_NLIMITS; i++) {
+    for(i = 0; i < RLIM_NLIMITS_EXT; i++) {
 	int r = getrlimit(i, &pl->limits[i].limit);
 	if (r == -1) {
 	    if (errno == EINVAL) {
@@ -305,6 +308,15 @@ static void process_limit(int source, co
 	pl->flag_numsyslogins = 1;
     } else if (strcmp(lim_item, "priority") == 0) {
 	limit_item = LIMIT_PRI;
+    } else if (sscanf(lim_item, "rlimit[%u]", &limit_item) == 1) {
+	if ((limit_item < 0) || (limit_item >= RLIM_NLIMITS_EXT)) {
+	    _pam_log(LOG_DEBUG,"%s out of range", lim_item);
+	    return;
+	}
+	if (!pl->supported[limit_item]) {
+	    _pam_log(LOG_DEBUG,"%s not supported by kernel", lim_item);
+	    return;
+	}
     } else {
         _pam_log(LOG_DEBUG,"unknown limit item '%s'", lim_item);
         return;
@@ -538,7 +550,7 @@ static int setup_limits(pam_handle_t *pa
 	}
     }
 
-    for (i=0, status=LIMITED_OK; i<RLIM_NLIMITS; i++) {
+    for (i=0, status=LIMITED_OK; i<RLIM_NLIMITS_EXT; i++) {
         if (pl->limits[i].limit.rlim_cur > pl->limits[i].limit.rlim_max)
             pl->limits[i].limit.rlim_cur = pl->limits[i].limit.rlim_max;
 	if (!pl->supported[i]) {
