/* Various length constants */
-#define UGLISTLEN 100 /* you get a ungoto list of this size */
#define ROOMNAMELEN 128 /* The size of a roomname string */
-#define NONCE_SIZE 128 /* Added by <bc> to allow for APOP auth
- * it is BIG becuase there is a hostname
- * in the nonce, as per the APOP RFC.
- */
#define USERNAME_SIZE 64 /* The size of a username string */
#define MAX_EDITORS 5 /* # of external editors supported */
#define NEWREGISTER 0 /* new user to register */
#define REREGISTER 1 /* existing user reregistering */
-#define READ_HEADER 2
-#define READ_MSGBODY 3
-
-/* commands we can send to the stty_ctdl() routine */
-#define SB_NO_INTR 0 /* set to Citadel client mode, i/q disabled */
-#define SB_YES_INTR 1 /* set to Citadel client mode, i/q enabled */
-#define SB_SAVE 2 /* save settings */
-#define SB_RESTORE 3 /* restore settings */
-#define SB_LAST 4 /* redo the last command sent */
-
-#define NEXT_KEY 15
-#define STOP_KEY 3
-
-/* citadel.rc stuff */
-#define RC_NO 0 /* always no */
-#define RC_YES 1 /* always yes */
-#define RC_DEFAULT 2 /* setting depends on user config */
-
-/* keepalives */
-enum {
- KA_NO, /* no keepalives */
- KA_YES, /* full keepalives */
- KA_HALF /* half keepalives */
-};
-
-/* for <;G>oto and <;S>kip commands */
-#define GF_GOTO 0 /* <;G>oto floor mode */
-#define GF_SKIP 1 /* <;S>kip floor mode */
-#define GF_ZAP 2 /* <;Z>ap floor mode */
-
/* number of items which may be handled by the CONF command */
#define NUM_CONFIGS 70
-/*
- * MIME types used in Citadel for configuration stuff
- */
-#define SPOOLMIME "application/x-citadel-delivery-list"
-#define INTERNETCFG "application/x-citadel-internet-config"
-#define IGNETCFG "application/x-citadel-ignet-config"
-#define IGNETMAP "application/x-citadel-ignet-map"
-#define FILTERLIST "application/x-citadel-filter-list"
-#define SIEVECONFIG "application/x-citadel-sieve-config"
-#define XMPPMORTUARY "application/x-citadel-xmpp-mortuary"
-
#define TRACE syslog(LOG_DEBUG, "Checkpoint: %s, %d\n", __FILE__, __LINE__)
#ifndef LONG_MAX
AC_CHECK_LIB(intl, libintl_bindtextdomain, [LDFLAGS="$LDFLAGS -lintl"])
-
-
-AC_ARG_ENABLE(threaded-client, [ --disable-threaded-client
- disable multithreaded client])
-
AC_ARG_ENABLE(pie, [ --enable-pie build position-independent executables])
AC_ARG_WITH(pam, [ --with-pam use PAM if present (see PAM.txt before you try this)])
test -d /usr/local/BerkeleyDB.4.5 && db_dir=/usr/local/BerkeleyDB.4.5
fi
-dnl By default, we only build the client (citadel and whobbs) unless we can
-dnl figure out how to build with POSIX threads.
-TARGETS=client
-
AC_CANONICAL_HOST
PTHREAD_DEFS=-D_REENTRANT
AC_MSG_CHECKING([how to compile with POSIX threads])
#endif],
ac_cv_func_pthread_create=yes, ac_cv_func_pthread_create=no)])
if test "$ac_cv_func_pthread_create" = yes; then
- test "$DATABASE" && TARGETS="client server utils"
- if test "x$enable_threaded_client" != xno; then
- AC_DEFINE(THREADED_CLIENT, [], [define this if you want to enable the multithreaded client])
- fi
+ test "$DATABASE" && TARGETS="server utils"
fi
AC_REPLACE_FUNCS(snprintf getutline)
fi
mkdir -p $abs_builddir/utils
mkdir -p $abs_builddir/utillib
- mkdir -p $abs_builddir/textclient
fi
if test -n "$srcdir"; then
/* some of the frequently used files */
extern char file_citadel_control[PATH_MAX];
-extern char file_citadel_rc[PATH_MAX];
extern char file_citadel_config[PATH_MAX];
extern char file_citadel_urlshorteners[PATH_MAX];
extern char file_lmtp_socket[PATH_MAX];
*/
#define CHATLOG "/dev/null"
-/*
- * S_KEEPALIVE is a watchdog timer. It is used to send "keep
- * alive" messages to the server to prevent the server from assuming the
- * client is dead and terminating the session. 30 seconds is the recommended
- * value; I can't think of any good reason to change it.
- */
-#define S_KEEPALIVE 30
-
/*
* Logging level to use if none is specified on the command line.
* Note that this will suppress messages before they even get to syslog().
/* some of our files, that are needed in several places */
char file_citadel_control[PATH_MAX]="";
-char file_citadel_rc[PATH_MAX]="";
char file_citadel_config[PATH_MAX]="";
char file_citadel_urlshorteners[PATH_MAX]="";
char file_lmtp_socket[PATH_MAX]="";
"%scitadel.config",
ctdl_autoetc_dir);
StripSlashes(file_citadel_config, 0);
- snprintf(file_citadel_rc,
- sizeof file_citadel_rc,
- "%scitadel.rc",
- ctdl_etc_dir);
- StripSlashes(file_citadel_rc, 0);
snprintf(file_citadel_urlshorteners,
sizeof file_citadel_urlshorteners,
"%scitadel_urlshorteners.rc",
DBG_PRINT(ctdl_bin_dir);
DBG_PRINT(ctdl_utilbin_dir);
DBG_PRINT(file_citadel_control);
- DBG_PRINT(file_citadel_rc);
DBG_PRINT(file_citadel_config);
DBG_PRINT(file_lmtp_socket);
DBG_PRINT(file_lmtp_unfiltered_socket);
/* a nice consistent place to define how we turn a message id into a thread id hash */
#define ThreadIdHash(Buf) abs(HashLittle(ChrPtr(Buf), StrLength(Buf)))
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * MIME types used in Citadel for configuration stuff
+ */
+#define SPOOLMIME "application/x-citadel-delivery-list"
+#define INTERNETCFG "application/x-citadel-internet-config"
+#define IGNETCFG "application/x-citadel-ignet-config"
+#define IGNETMAP "application/x-citadel-ignet-map"
+#define FILTERLIST "application/x-citadel-filter-list"
+#define SIEVECONFIG "application/x-citadel-sieve-config"
+#define XMPPMORTUARY "application/x-citadel-xmpp-mortuary"
+#define INTERNETCFG "application/x-citadel-internet-config"
+
+#define LISTING_FOLLOWS 100
+#define CIT_OK 200
+#define MORE_DATA 300
+#define SEND_LISTING 400
+#define ERROR 500
+#define BINARY_FOLLOWS 600
+#define SEND_BINARY 700
+#define START_CHAT_MODE 800
+
+#define INTERNAL_ERROR 10
+#define TOO_BIG 11
+#define ILLEGAL_VALUE 12
+#define NOT_LOGGED_IN 20
+#define CMD_NOT_SUPPORTED 30
+#define SERVER_SHUTTING_DOWN 31
+#define PASSWORD_REQUIRED 40
+#define ALREADY_LOGGED_IN 41
+#define USERNAME_REQUIRED 42
+#define HIGHER_ACCESS_REQUIRED 50
+#define MAX_SESSIONS_EXCEEDED 51
+#define RESOURCE_BUSY 52
+#define RESOURCE_NOT_OPEN 53
+#define NOT_HERE 60
+#define INVALID_FLOOR_OPERATION 61
+#define NO_SUCH_USER 70
+#define FILE_NOT_FOUND 71
+#define ROOM_NOT_FOUND 72
+#define NO_SUCH_SYSTEM 73
+#define ALREADY_EXISTS 74
+#define MESSAGE_NOT_FOUND 75
+
+#define ASYNC_MSG 900
+#define ASYNC_GEXP 02
+
+#define QR_PERMANENT 1 /* Room does not purge */
+#define QR_INUSE 2 /* Set if in use, clear if avail */
+#define QR_PRIVATE 4 /* Set for any type of private room */
+#define QR_PASSWORDED 8 /* Set if there's a password too */
+#define QR_GUESSNAME 16 /* Set if it's a guessname room */
+#define QR_DIRECTORY 32 /* Directory room */
+#define QR_UPLOAD 64 /* Allowed to upload */
+#define QR_DOWNLOAD 128 /* Allowed to download */
+#define QR_VISDIR 256 /* Visible directory */
+#define QR_ANONONLY 512 /* Anonymous-Only room */
+#define QR_ANONOPT 1024 /* Anonymous-Option room */
+#define QR_NETWORK 2048 /* Shared network room */
+#define QR_PREFONLY 4096 /* Preferred status needed to enter */
+#define QR_READONLY 8192 /* Aide status required to post */
+#define QR_MAILBOX 16384 /* Set if this is a private mailbox */
+
+#define QR2_SYSTEM 1 /* System room; hide by default */
+#define QR2_SELFLIST 2 /* Self-service mailing list mgmt */
+#define QR2_COLLABDEL 4 /* Anyone who can post can delete */
+#define QR2_SUBJECTREQ 8 /* Subject strongly recommended */
+#define QR2_SMTP_PUBLIC 16 /* Listservice Subscribers may post */
+#define QR2_MODERATED 32 /* Listservice aide has to permit posts */
+
+#define US_NEEDVALID 1 /* User needs to be validated */
+#define US_EXTEDIT 2 /* Always use external editor */
+#define US_PERM 4 /* Permanent user */
+#define US_LASTOLD 16 /* Print last old message with new */
+#define US_EXPERT 32 /* Experienced user */
+#define US_UNLISTED 64 /* Unlisted userlog entry */
+#define US_NOPROMPT 128 /* Don't prompt after each message */
+#define US_PROMPTCTL 256 /* <N>ext & <S>top work at prompt */
+#define US_DISAPPEAR 512 /* Use "disappearing msg prompts" */
+#define US_REGIS 1024 /* Registered user */
+#define US_PAGINATOR 2048 /* Pause after each screen of text */
+#define US_INTERNET 4096 /* Internet mail privileges */
+#define US_FLOORS 8192 /* User wants to see floors */
+#define US_COLOR 16384 /* User wants ANSI color support */
+#define US_USER_SET (US_LASTOLD | US_EXPERT | US_UNLISTED | \
+ US_NOPROMPT | US_DISAPPEAR | US_PAGINATOR | \
+ US_FLOORS | US_COLOR | US_PROMPTCTL | US_EXTEDIT)
+
+#define UA_KNOWN 2 /* Room appears in a 'known rooms' list */
+#define UA_GOTOALLOWED 4 /* User may goto this room if specified by exact name */
+#define UA_HASNEWMSGS 8 /* Unread messages exist in this room */
+#define UA_ZAPPED 16 /* User has forgotten (zapped) this room */
+#define UA_POSTALLOWED 32 /* User may post top-level messages here */
+#define UA_ADMINALLOWED 64 /* Aide or Room Aide rights exist here */
+#define UA_DELETEALLOWED 128 /* User is allowed to delete messages from this room */
+#define UA_REPLYALLOWED 256 /* User is allowed to reply to existing messages here */
+
+#ifdef __cplusplus
+}
+#endif
#endif // LIBCITADEL_H
chkpwd_LIBS=@chkpwd_LIBS@
CC=@CC@
CFLAGS=@CFLAGS@ -I ./include/
-CPPFLAGS=@CPPFLAGS@ -I. -I ./include/
+CPPFLAGS=@CPPFLAGS@ -I. -I ./src/include/
DATABASE=@DATABASE@
DEFS=@DEFS@ -DDIFF=\"@DIFF@\" -DPATCH=\"@PATCH@\"
LDFLAGS=@LDFLAGS@
src/tuiconfig.c \
src/citadel.c \
src/citadel_ipc.c \
+ src/ecrash.c \
src/ipc_c_tcp.c \
src/screen.c
src/routines2.o \
src/tuiconfig.o \
src/screen.o \
+ src/ecrash.o \
src/citadel_ipc.o \
src/ipc_c_tcp.o \
$(LIBOBJS)
- $(CC) citadel.o \
+ $(CC) src/citadel.o \
src/client_chat.o \
src/client_passwords.o \
src/commands.o \
src/routines2.o \
src/tuiconfig.o \
src/screen.o \
+ src/ecrash.o \
src/citadel_ipc.o \
src/ipc_c_tcp.o \
$(LIBOBJS) \
fi
])
+m4_include([acinclude.m4])
echo ... running mk_svn_revision.sh ...
./scripts/mk_svn_revision.sh
-echo ... running mk_module_init.sh ...
-./scripts/mk_module_init.sh
-
echo
echo This script has been tested with autoconf 2.53 and
echo automake 1.5. Other versions may work, but we recommend
$(MAKE) install-locale DESTDIR=$(DEB_DESTDIR)
$(MAKE) DESTDIR=$(DEB_DESTDIR) install-exec-new install-data-new
- install -D -p -m0755 database_cleanup.sh \
- $(DEB_DESTDIR)/usr/share/doc/citadel-server/examples/database_cleanup.sh
-
- install -D -p -m0644 docs/welcomemail.html \
- $(DEB_DESTDIR)/usr/share/doc/citadel-server/welcomemail.html
-
- install -D -p -m0644 docs/welcomemail.txt \
- $(DEB_DESTDIR)/usr/share/doc/citadel-server/welcomemail.txt
-
dh_install -s --sourcedir=debian/tmp
binary-common:
#include <stdarg.h>
#include <errno.h>
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
-#include "axdefs.h"
+//#include "axdefs.h"
#include "routines.h"
#include "routines2.h"
#include "tuiconfig.h"
#include "snprintf.h"
#endif
#include "screen.h"
-#include "citadel_dirs.h"
+///#include "citadel_dirs.h"
#include "ecrash.h"
#include "md5.h"
CtdlIPCServerInfo(ipc, buf);
scr_printf("You are connected to %s (%s) @%s\n", ipc->ServInfo.nodename, ipc->ServInfo.humannode, ipc->ServInfo.fqdn);
- scr_printf("running %s with text client v%.2f,\n", ipc->ServInfo.software, (float)REV_LEVEL/100);
- scr_printf("server build %s,\n", ipc->ServInfo.svn_revision, (float)REV_LEVEL/100);
+ scr_printf("running %s with text client v%.2f,\n", ipc->ServInfo.software, (float)CLIENT_VERSION/100);
+ scr_printf("server build %s,\n", ipc->ServInfo.svn_revision, (float)CLIENT_VERSION/100);
scr_printf("and located in %s.\n", ipc->ServInfo.site_location);
scr_printf("Connected users %d / Active users %d / Highest message #%ld\n", mrtg_users, mrtg_active_users, mrtg_himessage);
scr_printf("Server uptime: %s\n", mrtg_server_uptime);
moreprompt = ipc->ServInfo.moreprompt;
/* be nice and identify ourself to the server */
- CtdlIPCIdentifySoftware(ipc, SERVER_TYPE, 0, REV_LEVEL,
- (ipc->isLocal ? "local" : CITADEL),
+ CtdlIPCIdentifySoftware(ipc, CLIENT_TYPE, 0, CLIENT_VERSION,
+ (ipc->isLocal ? "local" : PACKAGE_STRING),
(supplied_hostname) ? supplied_hostname :
/* Look up the , in the bible if you're confused */
(locate_host(ipc, buf), buf), buf);
#ifdef HAVE_BACKTRACE
bzero(¶ms, sizeof(params));
- params.filename = file_pid_paniclog;
+// params.filename = file_pid_paniclog;
// panic_fd=open(file_pid_paniclog, O_APPEND|O_CREAT|O_DIRECT);
- params.filep = fopen(file_pid_paniclog, "a+");
+/// params.filep = fopen(file_pid_paniclog, "a+");
params.debugLevel = ECRASH_DEBUG_VERBOSE;
params.dumpAllThreads = TRUE;
params.useBacktraceSymbols = 1;
params.signals[2]=SIGBUS;
params.signals[3]=SIGABRT;
- eCrash_Init(¶ms);
+/// eCrash_Init(¶ms);
#endif
setIPCErrorPrintf(scr_printf);
setCryptoStatusHook(statusHook);
#include <pthread.h>
#endif
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
-#include "citadel_decls.h"
-#include "citadel_dirs.h"
+//#include "citadel_decls.h"
+//#include "citadel_dirs.h"
#ifdef THREADED_CLIENT
pthread_mutex_t rwlock;
#endif
#endif
static void (*status_hook)(char *s) = NULL;
+char ctdl_autoetc_dir[PATH_MAX]="";
+char file_citadel_rc[PATH_MAX]="";
+char ctdl_run_dir[PATH_MAX]="";
+char ctdl_etc_dir[PATH_MAX]="";
+char ctdl_home_directory[PATH_MAX] = "";
+char file_citadel_socket[PATH_MAX]="";
+char file_citadel_config[PATH_MAX]="";
+
+
+char *viewdefs[]={
+ "Messages",
+ "Summary",
+ "Address book",
+ "Calendar",
+ "Tasks"
+};
+
+char *axdefs[]={
+ "Deleted",
+ "New User",
+ "Problem User",
+ "Local User",
+ "Network User",
+ "Preferred User",
+ "Aide",
+ "Sysop"
+ };
+
+
+INLINE void CtdlIPC_lock(CtdlIPC *ipc)
+{
+ if (ipc->network_status_cb) ipc->network_status_cb(1);
+#ifdef THREADED_CLIENT
+ pthread_mutex_lock(&(ipc->mutex));
+#endif
+}
+
+
+INLINE void CtdlIPC_unlock(CtdlIPC *ipc)
+{
+#ifdef THREADED_CLIENT
+ pthread_mutex_unlock(&(ipc->mutex));
+#endif
+ if (ipc->network_status_cb) ipc->network_status_cb(0);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+
+char *libcitadelclient_version_string(void) {
+ return "libcitadelclient(unnumbered)";
+}
+
+
+
+
+#define COMPUTE_DIRECTORY(SUBDIR) memcpy(dirbuffer,SUBDIR, sizeof dirbuffer);\
+ snprintf(SUBDIR,sizeof SUBDIR, "%s%s%s%s%s%s%s", \
+ (home&!relh)?ctdl_home_directory:basedir, \
+ ((basedir!=ctdldir)&(home&!relh))?basedir:"/", \
+ ((basedir!=ctdldir)&(home&!relh))?"/":"", \
+ relhome, \
+ (relhome[0]!='\0')?"/":"",\
+ dirbuffer,\
+ (dirbuffer[0]!='\0')?"/":"");
+
+#define DBG_PRINT(A) if (dbg==1) fprintf (stderr,"%s : %s \n", #A, A)
+
+
+void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, int dbg)
+{
+ const char* basedir = "";
+ char dirbuffer[PATH_MAX] = "";
+
+ StripSlashes(ctdldir, 1);
+
+#ifndef HAVE_RUN_DIR
+ basedir=ctdldir;
+#else
+ basedir=RUN_DIR;
+#endif
+ COMPUTE_DIRECTORY(ctdl_run_dir);
+ StripSlashes(ctdl_run_dir, 1);
+
+
+#ifndef HAVE_AUTO_ETC_DIR
+ basedir=ctdldir;
+#else
+ basedir=AUTO_ETC_DIR;
+#endif
+ COMPUTE_DIRECTORY(ctdl_autoetc_dir);
+ StripSlashes(ctdl_autoetc_dir, 1);
+
+
+#ifndef HAVE_ETC_DIR
+ basedir=ctdldir;
+#else
+ basedir=ETC_DIR;
+#endif
+ COMPUTE_DIRECTORY(ctdl_etc_dir);
+ StripSlashes(ctdl_etc_dir, 1);
+
+
+
+ snprintf(file_citadel_rc,
+ sizeof file_citadel_rc,
+ "%scitadel.rc",
+ ctdl_etc_dir);
+ StripSlashes(file_citadel_rc, 0);
+
+ snprintf(file_citadel_socket,
+ sizeof file_citadel_socket,
+ "%scitadel.socket",
+ ctdl_run_dir);
+ StripSlashes(file_citadel_socket, 0);
+
+ snprintf(file_citadel_config,
+ sizeof file_citadel_config,
+ "%scitadel.config",
+ ctdl_autoetc_dir);
+ StripSlashes(file_citadel_config, 0);
+
+ DBG_PRINT(ctdl_run_dir);
+ DBG_PRINT(file_citadel_socket);
+ DBG_PRINT(ctdl_etc_dir);
+ DBG_PRINT(file_citadel_rc);
+}
void setCryptoStatusHook(void (*hook)(char *s)) {
status_hook = hook;
!software_name) {
developerid = 8;
clientid = 0;
- revision = REV_LEVEL - 600;
+ revision = CLIENT_VERSION - 600;
software_name = "Citadel (libcitadel)";
}
if (!hostname) return -2;
#endif
#include <stdarg.h>
#include <libcitadel.h>
-#include "citadel.h"
+//#include "citadel.h"
#include "citadel_ipc.h"
#include "client_chat.h"
#include "commands.h"
#include "citadel_decls.h"
#include "rooms.h"
#include "messages.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+//#ifndef HAVE_SNPRINTF
+//#include "snprintf.h"
+//#endif
#include "screen.h"
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#include <limits.h>
#include <stdio.h>
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "commands.h"
#include "client_passwords.h"
#include <errno.h>
#include <stdarg.h>
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "commands.h"
#include "messages.h"
#include "routines2.h"
#include "rooms.h"
#include "client_chat.h"
-#include "citadel_dirs.h"
+////#include "citadel_dirs.h"
#include "tuiconfig.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+//#ifndef HAVE_SNPRINTF
+//#include "snprintf.h"
+///#endif
#include "screen.h"
#include "ecrash.h"
+#ifdef __GNUC__
+#define INLINE __inline__
+#else
+#define INLINE
+#endif
#define UDS "_UDS_"
#ifdef __CYGWIN__
#endif
#define DEFAULT_PORT "504"
-#include "sysdep.h"
+#include <libcitadel.h>
+#include <limits.h>
+////#include "sysdep.h"
#ifdef HAVE_PTHREAD_H
#include <pthread.h>
#endif
#include <openssl/rand.h>
#endif
-#include "server.h"
+#define CLIENT_VERSION 811
+#define CLIENT_TYPE 0
+//copycat of: /#include "server.h"
+
+#define ROOMNAMELEN 128 /* The size of a roomname string */
+
+// copycat of citadel_dirs.h
+void calc_dirs_n_files(int relh, int home, const char *relhome, char *ctdldir, int dbg);
+
+//copycat of: /#include "citadel.h"
+/* commands we can send to the stty_ctdl() routine */
+#define SB_NO_INTR 0 /* set to Citadel client mode, i/q disabled */
+#define SB_YES_INTR 1 /* set to Citadel client mode, i/q enabled */
+#define SB_SAVE 2 /* save settings */
+#define SB_RESTORE 3 /* restore settings */
+#define SB_LAST 4 /* redo the last command sent */
+
+#define UGLISTLEN 100 /* you get a ungoto list of this size */
+
+#define USERNAME_SIZE 64 /* The size of a username string */
+#define MAX_EDITORS 5 /* # of external editors supported */
+ /* MUST be at least 1 */
+
+#define NONCE_SIZE 128 /* Added by <bc> to allow for APOP auth
+ * it is BIG becuase there is a hostname
+ * in the nonce, as per the APOP RFC.
+ */
+
+/*
+ * S_KEEPALIVE is a watchdog timer. It is used to send "keep
+ * alive" messages to the server to prevent the server from assuming the
+ * client is dead and terminating the session. 30 seconds is the recommended
+ * value; I can't think of any good reason to change it.
+ */
+#define S_KEEPALIVE 30
+
+#define READ_HEADER 2
+#define READ_MSGBODY 3
+
+#define NUM_CONFIGS 70
+
+
+
+/*
+ * This struct stores a list of rooms with new messages which the client
+ * fetches from the server. This allows the client to "march" through
+ * relevant rooms without having to ask the server each time where to go next.
+ */
+typedef struct ExpirePolicy ExpirePolicy;
+struct ExpirePolicy {
+ int expire_mode;
+ int expire_value;
+};
+
+typedef struct march march;
+struct march {
+ struct march *next;
+ char march_name[ROOMNAMELEN];
+ unsigned int march_flags;
+ char march_floor;
+ char march_order;
+ unsigned int march_flags2;
+ int march_access;
+};
+/*
+ * User records.
+ */
+typedef struct ctdluser ctdluser;
+struct ctdluser { /* User record */
+ int version; /* Cit vers. which created this rec */
+ uid_t uid; /* Associate with a unix account? */
+ char password[32]; /* password */
+ unsigned flags; /* See US_ flags below */
+ long timescalled; /* Total number of logins */
+ long posted; /* Number of messages ever submitted */
+ uint8_t axlevel; /* Access level */
+ long usernum; /* User number (never recycled) */
+ time_t lastcall; /* Date/time of most recent login */
+ int USuserpurge; /* Purge time (in days) for user */
+ char fullname[64]; /* Display name (primary identifier) */
+};
+typedef struct ctdlroom ctdlroom;
+struct ctdlroom {
+ char QRname[ROOMNAMELEN]; /* Name of room */
+ char QRpasswd[10]; /* Only valid if it's a private rm */
+ long QRroomaide; /* User number of room aide */
+ long QRhighest; /* Highest message NUMBER in room */
+ time_t QRgen; /* Generation number of room */
+ unsigned QRflags; /* See flag values below */
+ char QRdirname[15]; /* Directory name, if applicable */
+ long QRinfo; /* Info file update relative to msgs*/
+ char QRfloor; /* Which floor this room is on */
+ time_t QRmtime; /* Date/time of last post */
+ struct ExpirePolicy QRep; /* Message expiration policy */
+ long QRnumber; /* Globally unique room number */
+ char QRorder; /* Sort key for room listing order */
+ unsigned QRflags2; /* Additional flags */
+ int QRdefaultview; /* How to display the contents */
+};
+
+
+/////////////
#ifdef __cplusplus
extern "C" {
ReadReverse = -1,
ReadForward = 1
};
+extern char file_citadel_rc[PATH_MAX];
+extern char file_citadel_config[PATH_MAX];
/* Shared Diffie-Hellman parameters */
#define DH_P "F6E33BD70D475906ABCFB368DA2D1E5611D57DFDAC6A10CD78F406D6952519C74E21FFDCC5A780B9359722AACC8036E4CD24D5F5165EAC9EF226DBD9BBCF678F8DDEE86386F1BC20E291A9854A513A2CA326B411DC92E38F2ED2FEB6A3B792F13DB6550371FDBAC5ECA373BE5050CA4905431CA86088737D52B36C8D13CE9CB4EEF4C910285035E8329DD07551A80B87775676DD1067395CCEE9040C9B8BF998C528B3772B4C590A2CF18C5E58929BFCB538A62638B7437A9C68572D15287E97692B0B1EC5444D9DAB6EB062D20B79CA005EC5035065567AFD1FEF9B251D74747C6065D8C8B6B0862D1EE03F3A244C429EADE0CCC5C3A4196F5CBF5AA01A9026EFB20AA90E462BD64620278F271905EB604F38E6CFAE412EAA6C468E3B58170909BC18662FE2053224F30BE4FDB93BF9FBF969D91A5427A0665AC7BD1C43701B991094C92F7A935063055617142164F02973EB4ED86DD74D2BBAB3CD3B28F7BBD8D9F925B0FE92F7F7D0568D783F9ECE7AF96FB5AF274B586924B64639733A73ACA8F2BD1E970DF51ADDD983F7F6361A2B0DC4F086DE26D8656EC8813DE4B74D6D57BC1E690AC2FF1682B7E16938565A41D1DC64C75ADB81DA4582613FC68C0FDD327D35E2CDF20D009465303773EF3870FBDB0985EE7002A95D7912BBCC78187C29DB046763B7FABFF44EABE820F8ED0D7230AA0AF24F428F82448345BC099B"
-static INLINE void CtdlIPC_lock(CtdlIPC *ipc)
-{
- if (ipc->network_status_cb) ipc->network_status_cb(1);
-#ifdef THREADED_CLIENT
- pthread_mutex_lock(&(ipc->mutex));
-#endif
-}
+INLINE void CtdlIPC_lock(CtdlIPC *ipc);
+INLINE void CtdlIPC_unlock(CtdlIPC *ipc);
-static INLINE void CtdlIPC_unlock(CtdlIPC *ipc)
-{
-#ifdef THREADED_CLIENT
- pthread_mutex_unlock(&(ipc->mutex));
-#endif
- if (ipc->network_status_cb) ipc->network_status_cb(0);
-}
+char *libcitadelclient_version_string(void);
-#ifdef __cplusplus
-}
+/* commands we can send to the stty_ctdl() routine */
+#define SB_NO_INTR 0 /* set to Citadel client mode, i/q disabled */
+#define SB_YES_INTR 1 /* set to Citadel client mode, i/q enabled */
+#define SB_SAVE 2 /* save settings */
+#define SB_RESTORE 3 /* restore settings */
+#define SB_LAST 4 /* redo the last command sent */
+
+#define NEXT_KEY 15
+#define STOP_KEY 3
+
+/* citadel.rc stuff */
+#define RC_NO 0 /* always no */
+#define RC_YES 1 /* always yes */
+#define RC_DEFAULT 2 /* setting depends on user config */
+
+/* keepalives */
+enum {
+ KA_NO, /* no keepalives */
+ KA_YES, /* full keepalives */
+ KA_HALF /* half keepalives */
+};
+
+/* for <;G>oto and <;S>kip commands */
+#define GF_GOTO 0 /* <;G>oto floor mode */
+#define GF_SKIP 1 /* <;S>kip floor mode */
+#define GF_ZAP 2 /* <;Z>ap floor mode */
+
+
+#ifndef AXDEFS
+
+extern char *axdefs[];
+
+extern char *viewdefs[];
#endif
#include <errno.h>
#include <stdarg.h>
#include <libcitadel.h>
-#include "citadel.h"
+//#include "citadel.h"
#include "citadel_ipc.h"
-#include "citadel_decls.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+//#include "citadel_decls.h"
+//#ifndef HAVE_SNPRINTF
+//#include "snprintf.h"
+//#endif
#include "commands.h"
+#include <stdlib.h>
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include <string.h>
+#include <sys/types.h>
+
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+# include <sys/time.h>
+# else
+# include <time.h>
+# endif
+#endif
+
+#ifdef HAVE_TERMIOS_H
+#include <termios.h>
+#else
+#include <sgtty.h>
+#endif
+
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
/* Note that some of these functions may not work with multiple instances. */
#include <stdarg.h>
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "citadel_decls.h"
#include "messages.h"
#include "commands.h"
#include "tuiconfig.h"
#include "rooms.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+//#ifndef HAVE_SNPRINTF
+///#include "snprintf.h"
+//#endif
#include "screen.h"
#define MAXWORDBUF SIZ
#include <errno.h>
#include <stdarg.h>
#include <libcitadel.h>
-#include "citadel.h"
+//#include "citadel.h"
#include "citadel_ipc.h"
#include "citadel_decls.h"
#include "rooms.h"
#include "commands.h"
#include "messages.h"
#include "tuiconfig.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+//#ifndef HAVE_SNPRINTF
+//#include "snprintf.h"
+//#endif
#include "screen.h"
-#include "citadel_dirs.h"
+//#include "citadel_dirs.h"
#define IFNEXPERT if ((userflags&US_EXPERT)==0)
#endif
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "screen.h"
#define ROUTINES_C
-#include "citadel.h"
+///#include "citadel.h"
#include "routines.h"
#include "commands.h"
#include "citadel_decls.h"
#include <stdarg.h>
#include <libcitadel.h>
#include "sysdep.h"
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "citadel_decls.h"
#include "routines2.h"
#include "routines.h"
#include "commands.h"
-#include "messages.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+//#include "messages.h"
+//#ifndef HAVE_SNPRINTF
+//#include "snprintf.h"
+//#endif
#include "screen.h"
/* work around solaris include files */
#include <sys/types.h>
#include <sys/ioctl.h>
#include "sysdep.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+///#ifndef HAVE_SNPRINTF
+///#include "snprintf.h"
+///#endif
#include <libcitadel.h>
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "citadel_decls.h"
#include "commands.h"
#include <stdarg.h>
#include <libcitadel.h>
#include "sysdep.h"
-#include "citadel.h"
+///#include "citadel.h"
#include "citadel_ipc.h"
#include "citadel_decls.h"
#include "tuiconfig.h"
#include "messages.h"
#include "routines.h"
#include "commands.h"
-#ifndef HAVE_SNPRINTF
-#include "snprintf.h"
-#endif
+///#ifndef HAVE_SNPRINTF
+///#include "snprintf.h"
+///#endif
#include "screen.h"
/* work around solaris include files */