/* usertree.c -- Users list maintenance. Users are kept in a binary tree.
*
* This file is part of TUA.
*
* Copyright (C) 1991,92,93 Lele Gaifax (lele@nautilus.sublink.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the license, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include "tua.h"
#include "trees.h"
static BTREE Root = NULL;
static int
DEFUN (user_compare, (user1, user2),
CONST user_rec_t * user1 AND CONST user_rec_t * user2)
{
int ret = strcmp (user1->User, user2->User);
return ret;
}
static PTR
DEFUN (user_new, (data),
CONST PTR data)
{
user_rec_t *ur;
ur = (user_rec_t *) xmalloc (sizeof (user_rec_t));
ur->User = savestring (((CONST user_rec_t *) data)->User);
ur->Killed = FALSE;
ur->Commands = NULL;
ur->Out.Files = 0;
ur->Out.Bytes = ur->Out.Time = 0.0;
#ifdef TAYLOR_UUCP
ur->In.Files = 0;
ur->In.Bytes = ur->In.Time = 0.0;
#endif
return (PTR) ur;
}
user_rec_t *
DEFUN (insert_user, (user),
CONST char *user)
{
user_rec_t ur;
if (Root == NULL)
Root = btree_new ((compare_func_t) user_compare, (makenew_func_t) user_new);
ur.User = (char *) get_possible_user_alias (user);
return (user_rec_t *) btree_insert (Root, &ur);
}
void
DEFUN (kill_user, (user),
CONST char *user)
{
user_rec_t ur;
if (Root == NULL)
Root = btree_new ((compare_func_t) user_compare, (makenew_func_t) user_new);
ur.User = (char *) get_possible_user_alias (user);
((user_rec_t *) (btree_insert (Root, &ur)))->Killed = TRUE;
}
static traverse_func_t originalTraverseFunction;
static void
DEFUN (FilteredEnquiry, (user),
CONST user_rec_t * user)
{
if (! user->Killed)
(*originalTraverseFunction) (user);
}
void
DEFUN (enquire_users, (funct),
traverse_func_t funct)
{
originalTraverseFunction = funct;
btree_traverse (Root, (traverse_func_t) FilteredEnquiry);
}
user_rec_t *
DEFUN (search_user, (user),
CONST char *user)
{
user_rec_t ur;
ur.User = (char *) get_possible_user_alias (user);
return (user_rec_t *) btree_search (Root, &ur);
}
#ifdef USE_TCL
int
DEFUN (tcl_kill_user, (clientData, interp, argc, argv),
ClientData clientData AND
Tcl_Interp * interp AND
int argc AND
char *argv[])
{
if (argc != 2)
{
sprintf (interp->result, "Wrong number of Parameters: %s needs just one UserName", argv[0]);
return TCL_ERROR;
}
kill_user (argv[1]);
return TCL_OK;
}
#endif /* ifdef USE_TCL */
syntax highlighted by Code2HTML, v. 0.9.1