-
-/* $Id$ */
+/* $Id$
+ *
+ * Copyright (c) 1987-2010 by the citadel.org team
+ *
+ * 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 3 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
#include "sysdep.h"
-
-
#include <sys/select.h>
-
#include <ctype.h>
#include <stdlib.h>
#ifdef HAVE_UNISTD_H
#include <pthread.h>
#include <signal.h>
#include <sys/utsname.h>
-
#include <libcitadel.h>
#ifndef INADDR_NONE
#define DEVELOPER_ID 0
#define CLIENT_ID 4
#define CLIENT_VERSION 780 /* This version of WebCit */
-#define MINIMUM_CIT_VERSION 770 /* min required Citadel ver */
-#define LIBCITADEL_MIN 766 /* min required libcitadel ver */
+#define MINIMUM_CIT_VERSION 780 /* min required Citadel ver */
+#define LIBCITADEL_MIN 780 /* min required libcitadel ver */
#define DEFAULT_HOST "localhost" /* Default Citadel server */
#define DEFAULT_PORT "504"
#define TARGET "webcit01" /* Target for inline URL's */
#define HOUSEKEEPING 15 /* Housekeeping frequency */
-#define MIN_WORKER_THREADS 5
#define MAX_WORKER_THREADS 250
#define LISTEN_QUEUE_LENGTH 100 /* listen() backlog queue */
US_FLOORS | US_COLOR | US_PROMPTCTL )
+
+
#define MAJORCODE(a) (((int)(a / 100) ) * 100)
#define LISTING_FOLLOWS 100
*/
#define NLI "(not logged in)"
+/*
+ * Expiry policy for the autopurger
+ */
+#define EXPIRE_NEXTLEVEL 0 /* Inherit expiration policy */
+#define EXPIRE_MANUAL 1 /* Don't expire messages at all */
+#define EXPIRE_NUMMSGS 2 /* Keep only latest n messages */
+#define EXPIRE_AGE 3 /* Expire messages after n days */
+typedef struct __ExpirePolicy {
+ int loaded; /* has this been loaded from the server? */
+ int expire_mode;
+ int expire_value;
+}ExpirePolicy;
+void LoadExpirePolicy(GPEXWhichPolicy which);
+void SaveExpirePolicyFromHTTP(GPEXWhichPolicy which);
/*
* Linked list of session variables encoded in an x-www-urlencoded content type
#define ISSTATIC (1<<7)
#define FORCE_SESSIONCLOSE (1<<8)
#define PARSE_REST_URL (1<<9)
+#define PROHIBIT_STARTPAGE (1<<10)
+
+typedef enum _RESTDispatchID {
+ ExistsID,
+ PutID,
+ DeleteID
+} RESTDispatchID;
+typedef int (*WebcitRESTDispatchID)(RESTDispatchID WhichAction, int IgnoreFloor);
typedef void (*WebcitHandlerFunc)(void);
typedef struct _WebcitHandler{
WebcitHandlerFunc F;
+ WebcitRESTDispatchID RID;
long Flags;
StrBuf *Name;
StrBuf *DisplayName;
eCOPY,
eNONE
};
-const char *ReqStrs[eNONE];
+extern const char *ReqStrs[eNONE];
#define NO_AUTH 0
#define AUTH_COOKIE 1
StrBuf *ReadBuf; /* here we keep our stuff while reading linebuffered from the server. */
StrBuf *MigrateReadLineBuf; /* here we buffer legacy server read stuff */
const char *ReadPos; /* whats our read position in ReadBuf? */
- int chat_sock; /* Client socket to Citadel server - for chat */
+ int last_chat_seq; /* When in chat - last message seq# we saw */
time_t lastreq; /* Timestamp of most recent HTTP */
time_t last_pager_check; /* last time we polled for instant msgs */
ServInfo *serv_info; /* Information about the citserver we're connected to */
ParsedHttpHdrs *Hdr;
StrBuf *WBuf; /* Our output buffer */
StrBuf *HBuf; /* Our HeaderBuffer */
+ StrBuf *WFBuf; /* Wildfire error logging buffer */
HashList *vars; /* HTTP variable substitutions for this page */
StrBuf *trailing_javascript; /* extra javascript to be appended to page */
/* Preferences */
StrBuf *cs_inet_email; /* User's preferred Internet addr. */
- char reply_to[512]; /* reply-to address */
HashList *hash_prefs; /* WebCit preferences for this user */
StrBuf *DefaultCharset; /* Charset the user preferes */
int downloaded_prefs; /* Has the client download its prefs yet? */
int selected_language; /* Language selected by user */
int time_format_cache; /* which timeformat does our user like? */
-/* current room related */
-/* StrBuf *wc_roomname; / * Room we are currently in */
-/* unsigned room_flags; / * flags associated with the current room */
-/* unsigned room_flags2; / * flags associated with the current room */
-/* int wc_view; / * view for the current room */
-/* int wc_default_view; / * default view for the current room */
-/* int wc_is_trash; / * nonzero == current room is a Trash folder */
-/* int wc_floor; / * floor number of current room */
-/* int is_mailbox; / * the current room is a private mailbox */
-
folder CurRoom; /* information about our current room */
const folder *ThisRoom; /* if REST found a room, remember it here. */
/* next/previous room thingabob */
HashList *attachments; /* list of attachments for 'enter message' */
int upload_length; /* content length of http-uploaded data */
StrBuf *upload; /* pointer to http-uploaded data */
- char upload_filename[PATH_MAX]; /* filename of http-uploaded data */
+ StrBuf *upload_filename; /* filename of http-uploaded data */
char upload_content_type[256]; /* content type of http-uploaded data */
int new_mail; /* user has new mail waiting */
/* cache stuff for templates. TODO: find a smartrer way */
HashList *ServCfg; /* cache our server config for editing */
HashList *InetCfg; /* Our inet server config for editing */
-
+ ExpirePolicy Policy[maxpolicy];
};
enum {
- S_SELECT,
S_SHUTDOWN,
+ S_SPAWNER,
MAX_SEMAPHORES
};
extern int setup_wizard;
extern char wizard_filename[];
extern int follow_xff;
-extern int num_threads;
+extern int num_threads_existing;
+extern int num_threads_executing;
void InitialiseSemaphores(void);
void begin_critical_section(int which_one);
int GetConnected(void);
void DeleteServInfo(ServInfo **FreeMe);
int uds_connectsock(char *);
-int tcp_connectsock(char *, char *);
+int tcp_connectsock(char *, int);
int serv_getln(char *strbuf, int bufsize);
int StrBuf_ServGetln(StrBuf *buf);
int GetServerStatus(StrBuf *Line, long* FullState);
int suppress_check,
int cache);
void output_custom_content_header(const char *ctype);
+
+#ifdef UBER_VERBOSE_DEBUGGING
+#define wc_printf(...) wcc_printf(__FILE__, __FUNCTION__, __LINE__, __VA_ARGS__)
+void wcc_printf(const char *FILE, const char *FUNCTION, long LINE, const char *format, ...);
+#else
void wc_printf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
+#endif
+
void hprintf(const char *format,...)__attribute__((__format__(__printf__,1,2)));
void output_static(const char* What);
int lingering_close(int fd);
-char *memreadline(char *start, char *buf, int maxlen);
-char *memreadlinelen(char *start, char *buf, int maxlen, int *retlen);
long extract_token(char *dest, const char *source, int parmnum, char separator, int maxlen);
void remove_token(char *source, int parmnum, char separator);
StrBuf *load_mimepart(long msgnum, char *partnum);