extern "C" {
#endif
-// Text description of this software
-// (We used to define this ourselves, but why bother when the build tools do it for us?)
-#define CITADEL "Citadel" PACKAGE_VERSION
-#define REV_LEVEL 956 // This version
+#define REV_LEVEL 972 // This version
#define REV_MIN 591 // Oldest compatible database
#define EXPORT_REV_MIN 931 // Oldest compatible export files
#define LIBCITADEL_MIN 951 // Minimum required version of libcitadel
#define SERVER_TYPE 0 // zero for stock Citadel; other developers please obtain SERVER_TYPE codes for your implementations
+// hats off to https://stackoverflow.com/questions/5459868/concatenate-int-to-string-using-c-preprocessor
+#define STR_HELPER(x) #x
+#define STR(x) STR_HELPER(x)
+#define CITADEL "Citadel Server " STR(REV_LEVEL)
+
#ifdef LIBCITADEL_VERSION_NUMBER
#if LIBCITADEL_VERSION_NUMBER < LIBCITADEL_MIN
#error libcitadel is too old. Please upgrade it before continuing.
#define EXPIRE_NUMMSGS 2 // Keep only latest n messages
#define EXPIRE_AGE 3 // Expire messages after n days
-// User records.
-typedef struct ctdluser ctdluser;
-struct ctdluser { // User record
- int version; // Citadel version which created this record
- 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
- cit_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)
- long msgnum_bio; // msgnum of user's profile (bio)
- long msgnum_pic; // msgnum of user's avatar (photo)
- char emailaddrs[512]; // Internet email addresses
- long msgnum_inboxrules; // msgnum of user's inbox filtering rules
- long lastproc_inboxrules; // msgnum of last message filtered
-};
-
// Bits which may appear in MMflags.
#define MM_VALID 4 // New users need validating
-// Room records.
-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 msgnum_info; // msgnum of room banner (info file)
- 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
- long msgnum_pic; // msgnum of room picture or icon
-};
-
-// Private rooms are always flagged with QR_PRIVATE. If neither QR_PASSWORDED
-// or QR_GUESSNAME is set, then it is invitation-only. Passworded rooms are
-// flagged with both QR_PRIVATE and QR_PASSWORDED while guess-name rooms are
-// flagged with both QR_PRIVATE and QR_GUESSNAME. NEVER set all three flags.
-
// Miscellaneous
#define MES_NORMAL 65 // Normal message
#define MES_ANONONLY 66 // "****" header
#define MES_ANONOPT 67 // "Anonymous" header
// Floor record. The floor number is implicit in its location in the file.
-typedef struct floor floor;
struct floor {
unsigned short f_flags; // flags
char f_name[256]; // name of floor