1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
|
/*
* IRC - Internet Relay Chat, include/struct.h
* Copyright (C) 1990 Jarkko Oikarinen and
* University of Oulu, Computing Center
* Copyright (C) 1996 -1997 Carlo Wood
*
* 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, 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.
*/
#ifndef STRUCT_H
#define STRUCT_H
#include <netinet/in.h> /* Needed for struct in_addr */
#include "dbuf.h"
#include "whowas.h" /* Needed for whowas struct */
/*=============================================================================
* General defines
*/
#define NICKLEN 9
#define USERLEN 10
#define HOSTLEN 63
#define REALLEN 50
#define PASSWDLEN 20
#define BUFSIZE 512 /* WARNING: *DONT* CHANGE THIS!!!! */
#define MAXTARGETS 20
/*-----------------------------------------------------------------------------
* Macro's
*/
#define CLIENT_LOCAL_SIZE sizeof(aClient)
#define CLIENT_REMOTE_SIZE offsetof(aClient, count)
#define MyConnect(x) ((x)->fd >= 0)
#define MyClient(x) (MyConnect(x) && IsClient(x))
#define MyOper(x) (MyConnect(x) && IsOper(x))
#define Protocol(x) ((x)->serv->prot)
/*=============================================================================
* Structures
*
* Only put structures here that are being used in a very large number of
* source files. Other structures go in the header file of there corresponding
* source file, or in the source file itself (when only used in that file).
*/
struct Client {
struct Client *next, *prev, *hnext;
struct User *user; /* ...defined, if this is a User */
struct Server *serv; /* ...defined, if this is a server */
struct Whowas *whowas; /* Pointer to ww struct to be freed on quit */
char yxx[3]; /* Numeric Nick: YMM if this is a server,
XX0 if this is a user */
int hashv; /* raw hash value */
time_t lasttime; /* ...should be only LOCAL clients? --msa */
time_t firsttime; /* time client was created */
time_t since; /* last time we parsed something */
time_t lastnick; /* TimeStamp on nick */
long flags; /* client flags */
struct Client *from; /* == self, if Local Client, *NEVER* NULL! */
int fd; /* >= 0, for local clients */
int hopcount; /* number of servers to this 0 = local */
short status; /* Client type */
struct in_addr ip; /* Real ip# - NOT defined for remote servers! */
char name[HOSTLEN + 1]; /* Unique name of the client, nick or host */
char username[USERLEN + 1]; /* username here now for auth stuff */
char info[REALLEN + 1]; /* Free form additional client information */
/*
* The following fields are allocated only for local clients
* (directly connected to *this* server with a socket.
* The first of them *MUST* be the "count"--it is the field
* to which the allocation is tied to! *Never* refer to
* these fields, if (from != self).
*/
int count; /* Amount of data in buffer, DON'T PUT
variables ABOVE this one! */
snomask_t snomask; /* mask for server messages */
char buffer[BUFSIZE]; /* Incoming message buffer */
short lastsq; /* # of 2k blocks when sendqueued called last */
time_t nextnick; /* Next time that a nick change is allowed */
time_t nexttarget; /* Next time that a target change is allowed */
u_char targets[MAXTARGETS]; /* Hash values of current targets */
long cookie; /* Random number the user must PONG */
dbuf sendQ; /* Outgoing message queue--if socket full */
dbuf recvQ; /* Hold for data incoming yet to be parsed */
long sendM; /* Statistics: protocol messages send */
long sendK; /* Statistics: total k-bytes send */
long receiveM; /* Statistics: protocol messages received */
long receiveK; /* Statistics: total k-bytes received */
u_short sendB; /* counters to count upto 1-k lots of bytes */
u_short receiveB; /* sent and received. */
struct Client *acpt; /* listening client which we accepted from */
struct SLink *confs; /* Configuration record associated */
int authfd; /* fd for rfc931 authentication */
unsigned short port; /* and the remote port# too :-) */
struct hostent *hostp;
struct ListingArgs *listing;
#ifdef pyr
struct timeval lw;
#endif
char sockhost[HOSTLEN + 1]; /* This is the host name from the socket and
after which the connection was accepted. */
char passwd[PASSWDLEN + 1];
};
struct Server {
struct Server *nexts;
struct Client *up; /* Server one closer to me */
struct DSlink *down; /* List with downlink servers */
struct DSlink *updown; /* own Dlink in up->serv->down struct */
aClient **client_list; /* List with client pointers on this server */
struct User *user; /* who activated this connection */
char by[NICKLEN + 1];
struct ConfItem *nline; /* N-line pointer for this server */
time_t timestamp; /* Remotely determined connect try time */
time_t ghost; /* Local time at which a new server
caused a Ghost */
u_short prot; /* Major protocol */
u_short nn_mask; /* [Remote] FD_SETSIZE - 1 */
u_char last_x1;
u_char last_x2;
#ifdef LIST_DEBUG
struct Client *bcptr;
#endif
};
struct User {
struct User *nextu;
struct Client *server; /* client structure of server */
struct SLink *channel; /* chain of channel pointer blocks */
struct SLink *invited; /* chain of invite pointer blocks */
struct SLink *silence; /* chain of silence pointer blocks */
char *away; /* pointer to away message */
time_t last;
int refcnt; /* Number of times this block is referenced */
int joined; /* number of channels joined */
char username[USERLEN + 1];
char host[HOSTLEN + 1];
#ifdef LIST_DEBUG
struct Client *bcptr;
#endif
};
#endif /* STRUCT_H */
|