MOO-cows Mailing List Archive

[Prev][Next][Index][Thread]

[server] how to make a builtin suspend




Hya,

We have made a builtin, to check the password-entry from a user,  with 
yp_match. It works perfect, but it takes too long sometimes, to get the 
result. (the server may be down, or is just TOOOO slow;-)

Now, does anybody know how to suspend such a task, but still does it's job?
Like ONC() will timeout in future realeases, I'd like this in my 
nis_password.

(i've added the code below (for hackers)...it belongs in server.c )

anyone ideas?

	Kai


---------------------%cuthere%--------------



#include "execute.h"
#include <rpcsvc/nis.h>
#include <rpcsvc/ypclnt.h>
#include <rpcsvc/yp_prot.h>

extern const char* crypt( char*, char*);

char* nisdomain;

static package
bf_nis_password(Var arglist, Byte next, void* vdata, Objid progr)
{
	Var r;
	int yp_err, l;
	char* p;
	char* user;
	char* password;
	char* encryptedpw;

	if (!is_wizard(progr)) 
		return make_error_pack(E_PERM);

	user = arglist.v.list[1].v.str;
	password = arglist.v.list[2].v.str;
	logf("NIS: checking user %s\n",user);

	if ((yp_err = yp_match(nisdomain, "passwd.byname",user,strlen(user),&p,&l))) 
		{
        	if (yp_err == YPERR_KEY)
        		{
			r.type = TYPE_NUM;
			r.v.num = 0;
			free_var(arglist);
			return make_var_pack(r);
			}
		else
       		{

			r.type = TYPE_STR;
			r.v.str = strdup(yperr_string(yp_err));
			logf("NIS: %s\n",yperr_string(yp_err));
			free_var(arglist);
			return make_var_pack(r);
			}
		}
	encryptedpw = strstr(p, ":")+1;
	*(strstr(encryptedpw, ":"))=0;

	r.type = TYPE_NUM;
	if(!strcmp(encryptedpw,crypt(password,encryptedpw)))
		r.v.num = 1;
	else
		r.v.num = 0;
	free(p);
	free_var(arglist);
	return make_var_pack(r);
}
/* and add this line at the bottom...you know, where all the registering is done */

    (void) register_function("nis_password",2,2, bf_nis_password,
    				TYPE_STR,TYPE_STR);





-----------------------%Cut here%------------------


Follow-Ups:

Home | Subject Index | Thread Index