ALEX support in libwww2 (Mosaic)

assar@nada.kth.se
Mon, 13 Dec 93 07:40:12 +0100


> Has anyone hacked mosaic to use Alex?
>
> A couple users have pointed out that it would be very nice
> to have a flag to tell mosaic to use /alex for FTPable
> files.
>
> Mosaic does not cache files and does not seem to even
> cache open FTP connections.
>
> -- Vince

Here are patches to use Alex in libwww2 (which is used by Mosaic)

This patch is also ftp-able as
file://ftp.nada.kth.se/pub/Mosaic-2.1.alex.patch

After applying this patch all URLs with file: will go through Alex and
all ftp: will use normal FTP.

(Alex is a transparent way of doing anonymous FTP with caching. FTP to
alex.sp.cs.cmu.edu for more information and source.)

All comments, bugreports and fixes are welcome.

------------------------------ cut here ------------------------------
Index: Makefile
===================================================================
RCS file: /afs/nada.kth.se/misc/projects/mosaic/MASTER/Mosaic/Makefile,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 Makefile
*** 1.1.1.1 1993/12/13 01:50:48
--- Makefile 1993/12/13 04:41:11
***************
*** 150,156 ****
#### . If you want to define the default Mosaic documentation directory
#### (should be a URL), set -DDOCS_DIRECTORY_DEFAULT=\\\"url\\\"
#### . Other things you can define are spelled out in src/mosaic.h.
! customflags =



--- 150,156 ----
#### . If you want to define the default Mosaic documentation directory
#### (should be a URL), set -DDOCS_DIRECTORY_DEFAULT=\\\"url\\\"
#### . Other things you can define are spelled out in src/mosaic.h.
! customflags = -DALEX



***************
*** 203,209 ****

libwww2::
@echo --- Building libwww2
! cd libwww2; make CC=$(CC) RANLIB=$(RANLIB) CFLAGS="$(CFLAGS) $(knrflag) $(waisflags)"

src::
@echo --- Building src
--- 203,209 ----

libwww2::
@echo --- Building libwww2
! cd libwww2; make CC=$(CC) RANLIB=$(RANLIB) CFLAGS="$(CFLAGS) $(knrflag) $(waisflags) $(customflags)"

src::
@echo --- Building src
Index: libwww2/HTFile.c
===================================================================
RCS file: /afs/nada.kth.se/misc/projects/mosaic/MASTER/Mosaic/libwww2/HTFile.c,v
retrieving revision 1.1.1.1
diff -c -r1.1.1.1 HTFile.c
*** 1.1.1.1 1993/12/13 01:51:41
--- HTFile.c 1993/12/13 04:44:24
***************
*** 833,839 ****
--- 833,899 ----
}


+ #ifdef ALEX

+ #define ALEX_PREFIX "/alex/"
+
+ /*
+ ** Return an alexified version of the nodename.
+ */
+
+ PRIVATE char * alexifynode ARGS1 (CONST char *, nodename)
+ {
+ char * result = malloc(strlen(nodename) + 1);
+ char * ournode;
+ char * dot;
+
+ StrAllocCopy(ournode, nodename);
+ result[0] = '\0';
+
+ while(dot = strrchr(ournode, '.')) {
+ strcat(result, dot+1);
+ strcat(result, "/");
+ *dot = '\0';
+ }
+ strcat(result, ournode);
+ free(ournode);
+ return result;
+ }
+
+ /* Convert an address to alex.
+ **
+ */
+
+ PRIVATE char * HTAlexName
+ ARGS1 (
+ char *, addr
+ )
+ {
+ char * newname;
+ char * filename;
+ char * nodename;
+ char * newaddr;
+ char * alexnode;
+
+ StrAllocCopy(newname, addr);
+ filename=HTParse(newname, "", PARSE_PATH|PARSE_PUNCTUATION);
+ nodename=HTParse(newname, "", PARSE_HOST);
+ free(newname);
+ alexnode = alexifynode(nodename);
+ free(nodename);
+ newaddr = malloc(strlen(ALEX_PREFIX)
+ + strlen(alexnode) + strlen(filename) + 1);
+ strcpy(newaddr, ALEX_PREFIX);
+ strcat(newaddr, alexnode);
+ strcat(newaddr, filename);
+ free(alexnode);
+ free(filename);
+ return newaddr;
+ }
+
+
+ #endif /* ALEX */
+
/* Load a document
** ---------------
**
***************
*** 860,865 ****
--- 920,926 ----
char * newname=0; /* Simplified name of file */
HTAtom * encoding; /* @@ not used yet */
int compressed;
+ int alexp;
extern char *HTgeticonname(HTFormat, char *);

/* Reduce the filename to a basic form (hopefully unique!)
***************
*** 895,901 ****
}
#else

- free(filename);

/* For unix, we try to translate the name into the name of a transparently
** mounted file.
--- 956,961 ----
***************
*** 907,916 ****
--- 967,988 ----

{ /* try local file system */
char * localname = HTLocalName(addr);
+ char * officialname = localname;
struct stat dir_info;

if (!localname)
+ #ifdef ALEX
+ {
+ alexp = 1;
+ free(localname);
+ localname = HTAlexName(addr);
+ officialname = filename;
+ }
+ #else
goto suicide;
+ #endif /* ALEX */
+ else
+ free(filename);

#ifdef GOT_READ_DIR

***************
*** 1106,1111 ****
--- 1178,1188 ----

HT = HText_new();
HText_beginAppend(HT);
+ #ifdef ALEX
+ if(alexp)
+ HText_appendText(HT, "<H1>Alex Directory ");
+ else
+ #endif /* ALEX */
HText_appendText(HT, "<H1>Local Directory ");
HText_appendText(HT, localname);
HText_appendText(HT, "</H1>\n");
***************
*** 1130,1138 ****

if(strcmp(dataptr,"..") == 0)
{
! if(strcmp(localname,"/") != 0)
{
! strcpy(buffer,localname);

ptr = strrchr(buffer, '/');

--- 1207,1215 ----

if(strcmp(dataptr,"..") == 0)
{
! if(strcmp(officialname,"/") != 0)
{
! strcpy(buffer,officialname);

ptr = strrchr(buffer, '/');

***************
*** 1163,1169 ****
if(stat(filepath, &statbuf) == -1) continue;

HText_appendText(HT,"<DD><A HREF=\"");
! HText_appendText (HT, localname);

if(localname[strlen(localname)-1] != '/')
{
--- 1240,1246 ----
if(stat(filepath, &statbuf) == -1) continue;

HText_appendText(HT,"<DD><A HREF=\"");
! HText_appendText (HT, officialname);

if(localname[strlen(localname)-1] != '/')
{
***************
*** 1265,1270 ****
--- 1342,1348 ----
/* Now, as transparently mounted access has failed, we try FTP.
*/
suicide:
+ free(filename);
return HTFTPLoad(addr, anchor, format_out, sink);
}