diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/config/config.aix wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.aix
--- wu-ftpd-2.4.2-beta-13/src/config/config.aix	Tue Jan 14 23:22:50 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.aix	Tue May 27 18:31:37 1997
@@ -35,3 +35,7 @@
 typedef void	SIGNAL_TYPE;
 
 #include "../config.h"
+
+#define VIRTUAL
+#define QUOTA
+#define CANT_BIND
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/config/config.bdi wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.bdi
--- wu-ftpd-2.4.2-beta-13/src/config/config.bdi	Sun Mar  2 10:45:27 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.bdi	Tue May 27 18:31:37 1997
@@ -59,4 +59,5 @@
 #define realpath realpath_on_steroids   /* hack to work around unistd.h */
 
 
-
+#define BSDI
+#define QUOTA
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/config/config.dec wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.dec
--- wu-ftpd-2.4.2-beta-13/src/config/config.dec	Sun Mar  2 10:45:28 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.dec	Tue May 27 18:31:38 1997
@@ -36,3 +36,6 @@
 typedef void	SIGNAL_TYPE;
 
 #include "../config.h"
+
+#define DIGITAL
+#define QUOTA
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/config/config.s41 wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.s41
--- wu-ftpd-2.4.2-beta-13/src/config/config.s41	Sun Mar  2 03:27:20 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.s41	Tue May 27 18:31:39 1997
@@ -31,3 +31,6 @@
 typedef void	SIGNAL_TYPE;
 
 #include "../config.h"
+
+#define SUNOS
+#define QUOTA
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/config/config.sgi wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.sgi
--- wu-ftpd-2.4.2-beta-13/src/config/config.sgi	Sun Mar  2 10:45:36 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/config/config.sgi	Tue May 27 18:31:40 1997
@@ -18,7 +18,7 @@
 #define HAVE_VPRINTF
 #define OVERWRITE
 #undef  REGEX
-#define SPT_TYPE SPT_REUSEARGV
+#define SPT_TYPE SPT_NONE
 #undef  SHADOW_PASSWORD
 #define SVR4
 #define UPLOAD
@@ -50,3 +50,6 @@
 #include "../config.h"
 
 #define realpath realpath_on_steroids
+
+#define IRIX
+#define QUOTA
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/extensions.c wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/extensions.c
--- wu-ftpd-2.4.2-beta-13/src/extensions.c	Mon Mar  3 11:39:54 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/extensions.c	Tue May 27 18:31:41 1997
@@ -68,6 +68,16 @@
 #include "support/ftw.h"
 #endif
 
+#ifdef QUOTA
+struct dqblk quota;
+char
+#ifdef __STDC__
+*time_quota(long curstate, long softlimit, long timelimit);
+#else
+*time_quota();
+#endif
+#endif /* QUOTA */
+
 #ifdef HAVE_REGEX_H
 #include <regex.h>
 #endif
@@ -189,6 +199,9 @@
 {
     char *inptr = inbuf;
     char *outptr = outbuf;
+#ifdef QUOTA
+    char *timeleft;
+#endif
     char buffer[MAXPATHLEN];
     time_t curtime;
     int limit;
@@ -269,6 +282,65 @@
                 *(outptr + 24) = '\0';
                 break;
 
+#ifdef QUOTA		/* eilon : cookies for quota */
+            case 'B':
+                sprintf(outptr, "%d", quota.dqb_bhardlimit);
+                break;
+
+            case 'b':
+                sprintf(outptr, "%d", quota.dqb_bsoftlimit);
+                break;
+
+            case 'Q':
+                sprintf(outptr, "%d", quota.dqb_curblocks);
+                break;
+
+            case 'I':
+#ifdef IRIX
+                sprintf(outptr, "%d", quota.dqb_fhardlimit);
+#else
+                sprintf(outptr, "%d", quota.dqb_ihardlimit);
+#endif
+                break;
+
+            case 'i':
+#ifdef IRIX
+                sprintf(outptr, "%d", quota.dqb_fsoftlimit);
+#else
+                sprintf(outptr, "%d", quota.dqb_isoftlimit);
+#endif
+                break;
+
+            case 'q':
+#ifdef IRIX
+                sprintf(outptr, "%d", quota.dqb_curfiles);
+#else
+                sprintf(outptr, "%d", quota.dqb_curinodes);
+#endif
+                break;
+
+            case 'H':
+                timeleft = time_quota(quota.dqb_curblocks,quota.dqb_bsoftlimit,
+#ifdef IRIX
+				quota.dqb_btimelimit);
+#else
+				quota.dqb_btime);
+#endif
+                strcpy(outptr, timeleft);
+                break;
+
+            case 'h':
+#ifdef IRIX
+                timeleft = time_quota(quota.dqb_curfiles,quota.dqb_fsoftlimit,
+				quota.dqb_ftimelimit);
+#else
+                timeleft = time_quota(quota.dqb_curinodes,quota.dqb_isoftlimit,
+				quota.dqb_itime);
+#endif
+                strcpy(outptr, timeleft);
+                break;
+#endif /* QUOTA */
+
             case '%':
                 *outptr++ = '%';
                 *outptr = '\0';
@@ -1155,7 +1227,83 @@
    return 0;
 }
 
+#ifdef QUOTA
+void
+#ifdef __STDC__
+get_quota(char *fs,int uid)
+#else
+get_quota(fs, uid)
+char *fs;
+int uid;
+#endif
+{
+#if defined(AIX) || defined(BSDI) || defined(DIGITAL)
+
+  quotactl(fs,QCMD(Q_GETQUOTA,USRQUOTA),uid,&quota);
+
+#else
 
+  quotactl(Q_GETQUOTA,fs,uid,&quota);
 
+#endif
+}
+
+char
+#ifdef __STDC__
+*time_quota(long curstate, long softlimit, long timelimit)
+#else
+*time_quota(curstate, softlimit, timelimit)
+long curstate, softlimit, timelimit;
+#endif
+{
+	struct timeval tv;
+	char timeleft[80];
 
+	gettimeofday(&tv, NULL);
+	if (softlimit && curstate >= softlimit) {
+		if (timelimit == 0) {
+			strcpy(timeleft, "NOT STARTED");
+		} else if (timelimit > tv.tv_sec) {
+			fmttime(timeleft, timelimit - tv.tv_sec);
+		} else {
+			strcpy(timeleft, "EXPIRED");
+		}
+	} else {
+		timeleft[0] = '\0';
+	}
+	return(timeleft);
+}
 
+int
+#ifdef __STDC__
+fmttime(char *buf, register long time)
+#else
+fmttime(buf, time)
+	char *buf;
+	register long time;
+#endif
+{
+	int i;
+	static struct {
+		int c_secs;		/* conversion units in secs */
+		char * c_str;		/* unit string */
+	} cunits [] = {
+		{60*60*24*28, "months"},
+		{60*60*24*7, "weeks"},
+		{60*60*24, "days"},
+		{60*60, "hours"},
+		{60, "mins"},
+		{1, "secs"}
+	};
+
+	if (time <= 0) {
+		strcpy(buf, "EXPIRED");
+		return;
+	}
+	for (i = 0; i < sizeof(cunits)/sizeof(cunits[0]); i++) {
+		if (time >= cunits[i].c_secs)
+			break;
+	}
+	sprintf(buf, "%.1f %s", (double)time/cunits[i].c_secs, cunits[i].c_str);
+}
+#endif /* QUOTA */
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/extensions.h wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/extensions.h
--- wu-ftpd-2.4.2-beta-13/src/extensions.h	Fri Jan 10 08:14:57 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/extensions.h	Tue May 27 18:31:42 1997
@@ -42,3 +42,24 @@
 #define ARG8    entry->arg[8]
 #define ARG9    entry->arg[9]
 #define ARG     entry->arg
+
+#ifdef QUOTA
+#include<sys/time.h>
+
+#ifdef IRIX
+#include<sys/quota.h>
+#endif
+#ifdef SUNOS
+#include<ufs/quota.h>
+#endif
+#ifdef AIX
+#include<jfs/quota.h>
+#endif
+#ifdef DIGITAL 
+#include<ufs/quota.h>
+#endif
+#ifdef BSDI 
+#include<ufs/ufs/quota.h>
+#endif
+
+#endif /* QUOTA */
diff -u --recursive --new-file wu-ftpd-2.4.2-beta-13/src/ftpd.c wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/ftpd.c
--- wu-ftpd-2.4.2-beta-13/src/ftpd.c	Mon Mar  3 11:39:56 1997
+++ wu-ftpd-2.4.2-beta-13-eilon.v1.1/src/ftpd.c	Tue May 27 18:31:46 1997
@@ -223,6 +223,10 @@
 char virtual_banner[MAXPATHLEN];
 #endif
 
+#ifdef QUOTA
+extern struct dqblk quota;
+#endif
+
 int data;
 jmp_buf errcatch,
   urgcatch;
@@ -1558,7 +1562,11 @@
                 free(pw->pw_dir);
             pw->pw_dir = sgetsave(virtual_root);
         }
-#endif 
+#endif
+#ifdef QUOTA
+	bzero(quota, sizeof(quota));
+        get_quota(pw->pw_dir, pw->pw_uid);
+#endif
         if (anonymous) {
             if (chroot(pw->pw_dir) < 0 || chdir("/") < 0) {
                 reply(550, "Can't set guest privileges.");
