archie/prospero/lib/pfs/tokeniz_mcmp.c
2024-05-27 16:13:40 +02:00

74 lines
2.2 KiB
C

/*
* Copyright (c) 1992, 1993 by the University of Southern California
*
* For copying and distribution information, please see the file
* <usc-copyr.h>
*
* Written by swa April 1993
*/
/* This function provides common code for handling the multiple components
* specified after an UNRESOLVED protocol message and for handling the
* multiple components specified after a LIST '' COMPONENTS protocol message.
* It is passed a string and returns a freshly * allocated TOKEN list (which
* must be freed). Used in server/list.c and in lib/pfs/p_get_dir.c.
*/
#include <pfs.h>
#include <pprot.h>
/*
* Stages:
* a) With no special definions, they will transmit oldstyle, accept both
* b) With NEW_MCOMP defined (after all servers are known to be new), clients
* will transmit new; servers still transmit old (since old clients harder
* to snag than old servers), accept both.
* c) With REALLY_NEW_MCOMP defined (after *all* are known to be new),
* clients and servers will transmit new, accept only new.
*/
/* The above documentation is now incorrect.
* See /nfs/pfs/dev/doc/compile-options for a better explanation.
* The old path didn't work, because old clients ended up going away before old
* servers did.
*/
static TOKEN p__tokenize_oldstyle_mcomp(char *nextname);
#ifndef DONT_ACCEPT_OLD_MCOMP
TOKEN
p__tokenize_midstyle_mcomp(char *nextname)
{
TOKEN retval = qtokenize(nextname);
CHECK_MEM();
/* This code is used by both client and server. */
if (retval && !retval->next) {/* Must be old-format response from server or
client */
tkfree(retval);
return p__tokenize_oldstyle_mcomp(nextname);
}
return retval;
}
/* This is also used for V1 support. */
static
TOKEN
p__tokenize_oldstyle_mcomp(char *nextname)
{
TOKEN retval;
char *buf = NULL; /* this is assigned to the token before exit. */
int tmp;
tmp = qsscanf(nextname, "%&'[^/ \t]/%r", &buf, &nextname);
assert(tmp >= 0);
if (tmp == 0)
return NULL;
retval = tkalloc(NULL);
retval->token = buf; buf = NULL;
if (tmp == 2)
retval->next = p__tokenize_oldstyle_mcomp(nextname);
return retval;
}
#endif