Thanks a lot for this patch, I will apply it tonight!
Cheers,
Anselm
On 22 February 2011 05:59, Stanley Lieber <stanley.lieber_AT_gmail.com> wrote:
> Uriel and I were talking about shipping rc-httpd with werc and writing
> a script to serve a default example site from the base install. To that
> end, I thought we could make use of listen1 from p9p. The patches
> below may not be the ideal way to organize things in the tree, but
> with these pieces it does build and run as expected.
>
> -sl
>
>
> diff -r e39eeddcc295 Makefile
> --- a/Makefile Thu Jan 06 09:50:05 2011 +0000
> +++ b/Makefile Mon Feb 21 22:43:02 2011 -0600
> @@ -27,6 +27,7 @@
> grep\
> hoc\
> join\
> + listen1\
> look\
> ls\
> md5sum\
> diff -r e39eeddcc295 lib9/auth.h
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/lib9/auth.h Mon Feb 21 22:43:02 2011 -0600
> @@ -0,0 +1,169 @@
> +#ifndef __AUTH_H__
> +#define __AUTH_H__ 1
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +/*
> +#pragma src "/sys/src/libauth"
> +#pragma lib "libauth.a"
> +*/
> +AUTOLIB(auth)
> +
> +/*
> + * Interface for typical callers.
> + */
> +
> +typedef struct AuthInfo AuthInfo;
> +typedef struct Chalstate Chalstate;
> +typedef struct Chapreply Chapreply;
> +typedef struct MSchapreply MSchapreply;
> +typedef struct UserPasswd UserPasswd;
> +typedef struct AuthRpc AuthRpc;
> +
> +struct CFid;
> +
> +enum
> +{
> + MAXCHLEN= 256, /* max challenge length */
> + MAXNAMELEN= 256, /* maximum name length */
> + MD5LEN= 16,
> +
> + ARok = 0, /* rpc return values */
> + ARdone,
> + ARerror,
> + ARneedkey,
> + ARbadkey,
> + ARwritenext,
> + ARtoosmall,
> + ARtoobig,
> + ARrpcfailure,
> + ARphase,
> +
> + AuthRpcMax = 4096
> +};
> +
> +struct AuthRpc
> +{
> + int afd;
> + struct CFid *afid;
> + char ibuf[AuthRpcMax];
> + char obuf[AuthRpcMax];
> + char *arg;
> + uint narg;
> +};
> +
> +struct AuthInfo
> +{
> + char *cuid; /* caller id */
> + char *suid; /* server id */
> + char *cap; /* capability (only valid on server side) */
> + int nsecret; /* length of secret */
> + uchar *secret; /* secret */
> +};
> +
> +struct Chalstate
> +{
> + char *user;
> + char chal[MAXCHLEN];
> + int nchal;
> + void *resp;
> + int nresp;
> +
> +/* for implementation only */
> + AuthRpc *rpc; /* to factotum */
> + char userbuf[MAXNAMELEN]; /* temp space if needed */
> + int userinchal; /* user was sent to obtain challenge */
> +};
> +
> +struct Chapreply /* for protocol "chap" */
> +{
> + uchar id;
> + char resp[MD5LEN];
> +};
> +
> +struct MSchapreply /* for protocol "mschap" */
> +{
> + char LMresp[24]; /* Lan Manager response */
> + char NTresp[24]; /* NT response */
> +};
> +
> +struct UserPasswd
> +{
> + char *user;
> + char *passwd;
> +};
> +
> +extern int newns(char*, char*);
> +extern int addns(char*, char*);
> +
> +extern int noworld(char*);
> +extern int amount(int, char*, int, char*);
> +
> +/* these two may get generalized away -rsc */
> +extern int login(char*, char*, char*);
> +extern int httpauth(char*, char*);
> +
> +typedef struct Attr Attr;
> +enum {
> + AttrNameval, /* name=val -- when matching, must have name=val */
> + AttrQuery, /* name? -- when matching, must be present */
> + AttrDefault /* name:=val -- when matching, if present must match INTERNAL */
> +};
> +struct Attr
> +{
> + int type;
> + Attr *next;
> + char *name;
> + char *val;
> +};
> +
> +typedef int AuthGetkey(char*);
> +
> +int _attrfmt(Fmt*);
> +Attr *_copyattr(Attr*);
> +Attr *_delattr(Attr*, char*);
> +Attr *_findattr(Attr*, char*);
> +void _freeattr(Attr*);
> +Attr *_mkattr(int, char*, char*, Attr*);
> +Attr *_parseattr(char*);
> +char *_strfindattr(Attr*, char*);
> +/*
> +#pragma varargck type "A" Attr*
> +*/
> +
> +extern AuthInfo* fauth_proxy(int, AuthRpc *rpc, AuthGetkey *getkey, char *params);
> +extern AuthInfo* auth_proxy(int fd, AuthGetkey *getkey, char *fmt, ...);
> +extern AuthInfo* fsfauth_proxy(struct CFid*, AuthRpc *rpc, AuthGetkey *getkey, char *params);
> +extern AuthInfo* fsauth_proxy(struct CFid*, AuthGetkey *getkey, char *fmt, ...);
> +extern int auth_getkey(char*);
> +extern int (*amount_getkey)(char*);
> +extern void auth_freeAI(AuthInfo *ai);
> +extern int auth_chuid(AuthInfo *ai, char *ns);
> +extern Chalstate *auth_challenge(char*, ...);
> +extern AuthInfo* auth_response(Chalstate*);
> +extern int auth_respond(void*, uint, char*, uint, void*, uint, AuthGetkey *getkey, char*, ...);
> +extern void auth_freechal(Chalstate*);
> +extern AuthInfo* auth_userpasswd(char *user, char *passwd);
> +extern UserPasswd* auth_getuserpasswd(AuthGetkey *getkey, char*, ...);
> +extern AuthInfo* auth_getinfo(AuthRpc *rpc);
> +extern AuthRpc* auth_allocrpc(void);
> +extern Attr* auth_attr(AuthRpc *rpc);
> +extern void auth_freerpc(AuthRpc *rpc);
> +extern uint auth_rpc(AuthRpc *rpc, char *verb, void *a, int n);
> +extern int auth_wep(char*, char*, ...);
> +
> +extern struct CFsys* fsamount(int fd, char *aname);
> +extern struct CFsys* nsamount(char *name, char *aname);
> +
> +
> +/*
> +#pragma varargck argpos auth_proxy 3
> +#pragma varargck argpos auth_challenge 1
> +#pragma varargck argpos auth_respond 3
> +#pragma varargck argpos auth_getuserpasswd 2
> +*/
> +#ifdef __cplusplus
> +}
> +#endif
> +#endif
> diff -r e39eeddcc295 listen1/Makefile
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/listen1/Makefile Mon Feb 21 22:43:02 2011 -0600
> @@ -0,0 +1,10 @@
> +# listen1 - listen1 unix port from plan9
> +# Depends on ../lib9
> +
> +TARG = listen1
> +
> +include ../std.mk
> +
> +pre-uninstall:
> +
> +post-install:
> diff -r e39eeddcc295 listen1/listen1.c
> --- /dev/null Thu Jan 01 00:00:00 1970 +0000
> +++ b/listen1/listen1.c Mon Feb 21 22:43:02 2011 -0600
> @@ -0,0 +1,105 @@
> +#include <u.h>
> +#include <libc.h>
> +#include <auth.h>
> +
> +int verbose;
> +int trusted;
> +
> +void
> +usage(void)
> +{
> + fprint(2, "usage: listen1 [-v] address cmd args...\n");
> + exits("usage");
> +}
> +
> +char*
> +remoteaddr(char *dir)
> +{
> + static char buf[128];
> + char *p;
> + int n, fd;
> +
> + snprint(buf, sizeof buf, "%s/remote", dir);
> + fd = open(buf, OREAD);
> + if(fd < 0)
> + return "";
> + n = read(fd, buf, sizeof(buf));
> + close(fd);
> + if(n > 0){
> + buf[n] = 0;
> + p = strchr(buf, '!');
> + if(p)
> + *p = 0;
> + return buf;
> + }
> + return "";
> +}
> +
> +void
> +main(int argc, char **argv)
> +{
> + char dir[40], ndir[40];
> + int ctl, nctl, fd;
> +
> + ARGBEGIN{
> + default:
> + usage();
> + case 't':
> + trusted = 1;
> + break;
> + case 'v':
> + verbose = 1;
> + break;
> + }ARGEND
> +
> + if(argc < 2)
> + usage();
> +
> + if(!verbose){
> + close(1);
> + fd = open("/dev/null", OWRITE);
> + if(fd != 1){
> + dup(fd, 1);
> + close(fd);
> + }
> + }
> +
> + print("listen started\n");
> + ctl = announce(argv[0], dir);
> + if(ctl < 0)
> + sysfatal("announce %s: %r", argv[0]);
> +
> + for(;;){
> + nctl = listen(dir, ndir);
> + if(nctl < 0)
> + sysfatal("listen %s: %r", argv[0]);
> +
> + switch(rfork(RFFDG|RFPROC|RFNOWAIT|RFNOTEG)){
> + case -1:
> + close(nctl);
> + continue;
> + case 0:
> + fd = accept(nctl, ndir);
> + if(fd < 0){
> + fprint(2, "accept %s: can't open %s/data: %r", argv[0], ndir);
> + _exits(0);
> + }
> + print("incoming call for %s from %s in %s\n", argv[0], remoteaddr(ndir), ndir);
> + close(ctl);
> + close(nctl);
> + /*putenv("net", ndir); */
> + /*sprint(data, "%s/data", ndir); */
> + /*bind(data, "/dev/cons", MREPL); */
> + dup(fd, 0);
> + dup(fd, 1);
> + dup(fd, 2);
> + close(fd);
> + exec(argv[1], argv+1);
> + fprint(2, "exec: %r");
> + exits(nil);
> + default:
> + close(nctl);
> + break;
> + }
> + }
> +}
>
>
>
Received on Tue Feb 22 2011 - 11:34:36 CET
This archive was generated by hypermail 2.2.0 : Tue Feb 22 2011 - 11:36:03 CET