File: context.h

package info (click to toggle)
citadel 7.83-2squeeze2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 4,572 kB
  • ctags: 3,756
  • sloc: ansic: 54,870; sh: 4,298; yacc: 660; makefile: 450; xml: 40
file content (191 lines) | stat: -rw-r--r-- 6,650 bytes parent folder | download
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/* $Id: sysdep_decls.h 7265 2009-03-25 23:18:46Z dothebart $ */

#ifndef CONTEXT_H
#define CONTEXT_H

#include <stdarg.h>
#include "sysdep.h"
#include "server.h"
#include "sysdep_decls.h"
#include "threads.h"


/*
 * Here's the big one... the Citadel context structure.
 *
 * This structure keeps track of all information relating to a running 
 * session on the server.  We keep one of these for each session thread.
 *
 */
struct CitContext {
	struct CitContext *prev;	/* Link to previous session in list */
	struct CitContext *next;	/* Link to next session in the list */

	int cs_pid;		/* session ID */
	int dont_term;          /* for special activities like artv so we don't get killed */
	time_t lastcmd;		/* time of last command executed */
	time_t lastidle;	/* For computing idle time */
	int state;		/* thread state (see CON_ values below) */
	int kill_me;		/* Set to nonzero to flag for termination */

	StrBuf *lBuf;

	const char *Pos;        /* Our read position inside of the ReadBuf */
	StrBuf *ReadBuf;        /* Our block buffered read buffer */
	StrBuf *MigrateBuf;        /* Our block buffered read buffer */

	const char *sPos;        /* Our read position inside of the ReadBuf */
	StrBuf *sReadBuf;        /* Our block buffered read buffer */
	StrBuf *sMigrateBuf;        /* Our block buffered read buffer */
	int client_socket;
	int is_local_socket;	/* set to 1 if client is on unix domain sock */
	/* Redirect this session's output to a memory buffer? */
	StrBuf *redirect_buffer;		/* the buffer */
#ifdef HAVE_OPENSSL
	SSL *ssl;
	int redirect_ssl;
#endif

	char curr_user[USERNAME_SIZE];	/* name of current user */
	int logged_in;		/* logged in */
	int internal_pgm;	/* authenticated as internal program */
	int nologin;		/* not allowed to log in */
	int curr_view;		/* The view type for the current user/room */
	int is_master;		/* Is this session logged in using the master user? */

	char net_node[32]	;/* Is the client another Citadel server? */
	time_t previous_login;	/* Date/time of previous login */
	char lastcmdname[5];	/* name of last command executed */
	unsigned cs_flags;	/* miscellaneous flags */
	int is_async;		/* Nonzero if client accepts async msgs */
	int async_waiting;	/* Nonzero if there are async msgs waiting */
	int input_waiting;	/* Nonzero if there is client input waiting */
	int can_receive_im;	/* Session is capable of receiving instant messages */

	/* Client information */
	int cs_clientdev;	/* client developer ID */
	int cs_clienttyp;	/* client type code */
	int cs_clientver;	/* client version number */
	uid_t cs_UDSclientUID;  /* the uid of the client when talking via UDS */
	char cs_clientname[32];	/* name of client software */
	char cs_host[64];	/* host logged in from */
	char cs_addr[64];	/* address logged in from */

	/* The Internet type of thing */
	char cs_inet_email[128];		/* Return address of outbound Internet mail */
	char cs_inet_other_emails[1024];	/* User's other valid Internet email addresses */
	char cs_inet_fn[128];			/* Friendly-name of outbound Internet mail */

	FILE *download_fp;	/* Fields relating to file transfer */
	size_t download_fp_total;
	char download_desired_section[128];
	FILE *upload_fp;
	char upl_file[256];
	char upl_path[PATH_MAX];
	char upl_comment[256];
	char upl_filedir[PATH_MAX];
	char upl_mimetype[64];
	char dl_is_net;
	char upload_type;

	struct ctdluser user;	/* Database record buffers */
	struct ctdlroom room;

	/* Beginning of cryptography - session nonce */
	char cs_nonce[NONCE_SIZE];	/* The nonce for this session's next auth transaction */


	/* A linked list of all instant messages sent to us. */
	struct ExpressMessage *FirstExpressMessage;
	int disable_exp;	/* Set to 1 to disable incoming pages */
	int newmail;		/* Other sessions increment this */

	/* Masqueraded values in the 'who is online' list */
	char fake_username[USERNAME_SIZE];
	char fake_hostname[64];
	char fake_roomname[ROOMNAMELEN];

	/* Preferred MIME formats */
	char preferred_formats[256];
	int msg4_dont_decode;

	/* Dynamically allocated session data */
	char *session_specific_data;		/* Used by individual protocol modules */
	struct cit_ical *CIT_ICAL;		/* calendaring data */
	struct ma_info *ma;			/* multipart/alternative data */
	const char *ServiceName;		/* readable purpose of this session */
	void *openid_data;			/* Data stored by the OpenID module */
	char *ldap_dn;				/* DN of user when using AUTHMODE_LDAP */


	void (*h_command_function) (void) ;	/* service command function */
	void (*h_async_function) (void) ;	/* do async msgs function */
	void (*h_greeting_function) (void) ;	/* greeting function for session startup */
};

typedef struct CitContext CitContext;

/*
 * Values for CitContext.state
 * 
 * A session that is doing nothing is in CON_IDLE state.  When activity
 * is detected on the socket, it goes to CON_READY, indicating that it
 * needs to have a worker thread bound to it.  When a thread binds to
 * the session, it goes to CON_EXECUTING and does its thing.  When the
 * transaction is finished, the thread sets it back to CON_IDLE and lets
 * it go.
 */
enum {
	CON_IDLE,		/* This context is doing nothing */
	CON_GREETING,		/* This context needs to output its greeting */
	CON_STARTING,		/* This context is outputting its greeting */
	CON_READY,		/* This context needs attention */
	CON_EXECUTING		/* This context is bound to a thread */
};

#define CC MyContext()


extern citthread_key_t MyConKey;			/* TSD key for MyContext() */
extern int num_sessions;
extern CitContext masterCC;
extern CitContext *ContextList;

CitContext *MyContext (void);
void RemoveContext (struct CitContext *);
CitContext *CreateNewContext (void);
void context_cleanup(void);
void kill_session (int session_to_kill);
void InitializeMasterCC(void);
void dead_session_purge(int force);
void set_async_waiting(struct CitContext *ccptr);

/* Deprecated, user CtdlBumpNewMailCounter() instead */
void BumpNewMailCounter(long) __attribute__ ((deprecated));

void terminate_idle_sessions(void);
int CtdlTerminateOtherSession (int session_num);
/* bits returned by CtdlTerminateOtherSession */
#define TERM_FOUND	0x01
#define TERM_ALLOWED	0x02
#define TERM_KILLED	0x03
#define TERM_NOTALLOWED -1

/*
 * Bind a thread to a context.  (It's inline merely to speed things up.)
 */
static INLINE void become_session(CitContext *which_con) {
/*
	pid_t tid = syscall(SYS_gettid);
*/
	citthread_setspecific(MyConKey, (void *)which_con );
/*
	CtdlLogPrintf(CTDL_DEBUG, "[%d]: Now doing %s\n", 
		      (int) tid, 
		      ((which_con != NULL) && (which_con->ServiceName != NULL)) ? 
		      which_con->ServiceName:"");
*/
}


#endif /* CONTEXT_H */