9base

revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log | Files | Refs | README | LICENSE

commit 4f7cd11b8b5e6b5b69cf29a11a85c876795da881
parent 60bd5888062ba341609f89bb9788fbf31123b060
Author: Anselm R Garbe <anselm@garbe.us>
Date:   Wed, 23 Feb 2011 21:56:46 +0000

added missing files
Diffstat:
lib9/auth.h | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
listen1/Makefile | 10++++++++++
listen1/listen1.c | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 284 insertions(+), 0 deletions(-)

diff --git a/lib9/auth.h b/lib9/auth.h @@ -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 --git a/listen1/Makefile b/listen1/Makefile @@ -0,0 +1,10 @@ +# listen1 - listen1 unix port from plan9 +# Depends on ../lib9 + +TARG = listen1 + +include ../std.mk + +pre-uninstall: + +post-install: diff --git a/listen1/listen1.c b/listen1/listen1.c @@ -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; + } + } +}