From: Camiel Dobbelaar <cd@sentia.nl>
To: publicfile@list.cr.yp.to
Subject: umpteenth patch for /bin/ls compatibility
Date: Tue, 19 Sep 2000 13:31:19 +0200

This is a multi-part message in MIME format.
--------------D9C68AB37BA772D49F3599AB
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Let me post the umpteenth patch for /bin/ls compatibility for
publicfile. I feel that this one has the following advantages:
- it does not use stdio (sprintf, snprintf) that publicfile so carefully
avoids; it only uses the DJB substdio functions.
- avoids the use of bounded arrays (char [xx];)
- it tries to mimic the EPLF implementation in the amount of information
that is put out (for example: non-regular files or unreadable files will
have rights '----------' and size 0)

Tested succesfully with Netscape, IE, and the OpenBSD ftp client.

It does not work with ncftp. (ncftp does not really issue 'cd' commands
to the ftp-server. It caches this information to issue commands with the
cached path as an argument). I have seen patches on this mailinglist
that address this issue as well, but I feel it's not publicfile's
problem.

--
Cam
--------------D9C68AB37BA772D49F3599AB
Content-Type: text/plain; charset=us-ascii;
 name="patch-compat"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="patch-compat"

--- fetch.c.orig	Tue Nov  9 08:23:46 1999
+++ fetch.c	Tue Sep 19 11:48:13 2000
@@ -40,24 +40,36 @@
 
 static void printstat()
 {
-  substdio_puts(&ss,"+i");
-  substdio_put(&ss,strnum,fmt_ulong(strnum,(unsigned long) st.st_dev));
-  substdio_puts(&ss,".");
-  substdio_put(&ss,strnum,fmt_ulong(strnum,(unsigned long) st.st_ino));
+  char *longstring;
+  int len;
 
-  if (st.st_mtime > 0)
-    if (st.st_mtime < now - 60) {
-      substdio_puts(&ss,",m");
-      substdio_put(&ss,strnum,fmt_ulong(strnum,(unsigned long) st.st_mtime));
-    }
-
-  if ((st.st_mode & S_IFMT) == S_IFDIR)
-    substdio_puts(&ss,",/");
-  if (((st.st_mode & S_IFMT) == S_IFREG) && ((st.st_mode & 0444) == 0444)) {
-    substdio_puts(&ss,",r,s");
-    substdio_put(&ss,strnum,fmt_ulong(strnum,(unsigned long) st.st_size));
+  /* rights, links, user, group */
+  if (((st.st_mode & S_IFMT) == S_IFREG) && ((st.st_mode & 0444) == 0444)) 
+    substdio_puts(&ss,"-r--r--r--  1 pub  pub ");
+  else if ((st.st_mode & S_IFMT) == S_IFDIR)
+    substdio_puts(&ss,"dr-xr-xr-x  2 pub  pub ");
+  else {
+    substdio_puts(&ss,"----------  1 pub  pub ");
+    /* do not reveal size, the EPLF implementation does not either */
+    st.st_size = 0;
   }
-  substdio_puts(&ss,",\t");
+
+  /* size */
+  len = fmt_ulong(strnum,(unsigned long) st.st_size);
+  /* Internet Explorer gets deeply confused when using tabs, so */
+  /* align size using this ugly hack, to suit textmode clients. */
+  substdio_put(&ss,"          ",((10-len) > 0) ? (10-len):0);
+  substdio_put(&ss,strnum,len);
+  substdio_puts(&ss," ");
+
+  /* date, time/year */
+  longstring = ctime(&st.st_mtime);
+  substdio_put(&ss,longstring+4,7);
+  if (st.st_mtime + ((365/2)*86400) > now)
+    substdio_put(&ss,longstring+11,5);
+  else
+    substdio_put(&ss,longstring+19,5);
+  substdio_puts(&ss," ");
 }
 
 static void list(char *fn,int flaglong)

--------------D9C68AB37BA772D49F3599AB--


