⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 table.c

📁 压缩包中包含LINUX下多个命令的源码
💻 C
字号:
/* Copyright (C) 1998,2001 Free Software Foundation, Inc.   This file is part of GNU Inetutils.   GNU Inetutils 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, or (at your option)   any later version.   GNU Inetutils is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR 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 GNU Inetutils; see the file COPYING.  If not, write to   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,   Boston, MA 02111-1307, USA. */#include <intalkd.h>typedef struct request_table table_t;struct request_table{  table_t *next, *prev;  CTL_MSG request;  time_t time;};static table_t *table;static voidtable_delete (table_t *ptr){  table_t *t;  if ((t = ptr->prev) != NULL)    t->next = ptr->next;  else    table = ptr->next;  if ((t = ptr->next) != NULL)    t->prev = ptr->prev;  free (ptr);}/* Look in the table for an invitation that matches given criteria.   Linear search: premature optimisation is the root of all   Evil) */static CTL_MSG *lookup_request (CTL_MSG *request, int (*comp)(table_t *, CTL_MSG *, time_t *)){  table_t *ptr;  time_t now;  time (&now);  if (debug)    print_request ("lookup_request", request);  for (ptr = table; ptr; ptr = ptr->next)    {      if (debug)	print_request ("comparing against: ", &ptr->request);      if ((ptr->time - now) > max_request_ttl)	{	  /* the entry is too old */	  if (debug)	    print_request ("deleting expired entry", &ptr->request);	  table_delete (ptr);	}      else	{	  if (comp (ptr, request, &now) == 0)	    {	      if (debug)		print_request ("found", &ptr->request);	      return &ptr->request;	    }	}    }  if (debug)    syslog (LOG_DEBUG, "not found");  return NULL;}static intfuzzy_comp (table_t *ptr, CTL_MSG *request, time_t *unused){  (void)unused;  if (ptr->request.type == LEAVE_INVITE      && strcmp(request->l_name, ptr->request.r_name) == 0      && strcmp(request->r_name, ptr->request.l_name) == 0)    return 0;  return 1;}/* Look in the table for an invitation that matches the current   request looking for an invitation */CTL_MSG *find_match (CTL_MSG *request){  return lookup_request (request, fuzzy_comp);}static intexact_comp (table_t *ptr, CTL_MSG *request, time_t *now){  if (request->type == ptr->request.type      && request->pid == ptr->request.pid      && strcmp(request->r_name, ptr->request.r_name) == 0      && strcmp(request->l_name, ptr->request.l_name) == 0)    {      ptr->time = *now;      return 0;    }  return 1;}/* Look for an identical request, as opposed to a complementary   one as find_match does */CTL_MSG *find_request (CTL_MSG *request){  return lookup_request (request, exact_comp);}#define MAX_ID 16000/* Generate a unique non-zero sequence number */intnew_id (){  static int current_id = 0;  current_id = (current_id + 1) % MAX_ID;  /* 0 is reserved, helps to pick up bugs */  if (current_id == 0)    current_id = 1;  return current_id;}intinsert_table (CTL_MSG *request, CTL_RESPONSE *response){  table_t *ptr;  ptr = malloc (sizeof *ptr);  if (!ptr)    {      syslog (LOG_CRIT, "out of memory");      exit (1);    }  request->id_num = new_id ();  if (debug)    print_request ("insert_table", request);  response->id_num = htonl (request->id_num);  time (&ptr->time);  ptr->request = *request;  ptr->prev = NULL;  ptr->next = table;  table = ptr;  return 0;}/* Delete the invitation with id 'id_num' */intdelete_invite (unsigned long id_num){  table_t *ptr;  for (ptr = table; ptr; ptr = ptr->next)    if (ptr->request.id_num == id_num)      {	table_delete (ptr);	return SUCCESS;      }  return NOT_HERE;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -