44 #include <sys/types.h>
57 #ifndef __BIT_TYPES_DEFINED__
58 #define __BIT_TYPES_DEFINED__
68 DB_ENV *db_env =
NULL;
72 TDB_CONTEXT *
db =
nullptr;
73 typedef TDB_DATA DB_ENTRY;
76 #error "Either Berkeley DB or Trivial DB must be available"
87 db_env->close(db_env, 0);
90 if (tdb_close(
db) != 0) {
105 if (S_ISDIR (st_buf.st_mode)) {
109 db_env_create(&db_env, 0);
110 if (db_env->open(db_env,
db_path, DB_CREATE | DB_INIT_MPOOL | DB_INIT_LOCK, 0666)) {
111 fprintf(stderr,
"FATAL: %s: Failed to open database environment in '%s'\n",
program_name,
db_path);
112 db_env->close(db_env, 0);
115 db_create(&
db, db_env, 0);
118 newPath.append(
"session", 7);
127 if (
db->open(
db,
NULL,
"session",
NULL, DB_BTREE, DB_CREATE, 0666)) {
128 fprintf(stderr,
"FATAL: %s: Failed to open db file '%s' in dir '%s'\n",
130 db_env->close(db_env, 0);
140 #if _SQUID_FREEBSD_ && !defined(O_DSYNC)
142 #define O_DSYNC O_SYNC
144 db = tdb_open(
db_path, 0, TDB_CLEAR_IF_FIRST, O_CREAT|O_DSYNC, 0666);
169 return (
db->get(
db,
nullptr, &key, data, 0) == 0);
172 *data = tdb_fetch(
db, key);
173 return (data->dptr !=
nullptr);
181 db->del(
db,
nullptr, &key, 0);
191 memcpy(dst, src->data,
sz);
193 memcpy(dst, src->dptr,
sz);
202 key.data = (
void *)details;
213 if (
dataSize(&data) !=
sizeof(timestamp)) {
214 fprintf(stderr,
"ERROR: %s: CORRUPTED DATABASE (%s)\n",
program_name, details);
218 copyValue(×tamp, &data,
sizeof(timestamp));
230 time_t
now = time(0);
232 key.data =
static_cast<decltype(key.data)
>(details);
235 data.size =
sizeof(
now);
238 key.dptr =
reinterpret_cast<decltype(key.dptr)
>(details);
240 data.dptr =
reinterpret_cast<decltype(data.dptr)
>(&
now);
241 data.dsize =
sizeof(
now);
242 tdb_store(
db, key, data, 0);
251 key.data =
static_cast<decltype(key.data)
>(details);
254 key.dptr =
reinterpret_cast<decltype(key.dptr)
>(details);
262 fprintf(stderr,
"Usage: %s [-t|-T session_timeout] [-b dbpath] [-a]\n",
program_name);
263 fprintf(stderr,
" -t sessiontimeout Idle timeout after which sessions will be forgotten (user activity will reset)\n");
264 fprintf(stderr,
" -T sessiontimeout Fixed timeout after which sessions will be forgotten (regardless of user activity)\n");
265 fprintf(stderr,
" -b dbpath Path where persistent session database will be kept\n");
266 fprintf(stderr,
" -a Active mode requiring LOGIN argument to start a session\n");
268 int main(
int argc,
char **argv)
272 int default_action = 1;
276 while ((opt =
getopt(argc, argv,
"t:T:b:a?")) != -1) {
297 setbuf(stdout,
NULL);
303 const char *channel_id = strtok(
request,
" ");
304 char *detail = strtok(
NULL,
"\n");
305 if (detail ==
NULL) {
307 fprintf(stderr,
"FATAL: %s is concurrent and requires the concurrency option to be specified.\n",
program_name);
311 char *lastdetail = strrchr(detail,
' ');
312 size_t detail_len = strlen(detail);
314 if (strcmp(lastdetail,
" LOGIN") == 0) {
316 detail_len = (
size_t)(lastdetail-detail);
318 }
else if (strcmp(lastdetail,
" LOGOUT") == 0) {
320 detail_len = (
size_t)(lastdetail-detail);
322 }
else if (!default_action && strcmp(lastdetail,
" -") == 0) {
325 detail_len = (
size_t)(lastdetail-detail);
331 printf(
"%s OK message=\"Bye\"\n", channel_id);
334 printf(
"%s OK message=\"Welcome\"\n", channel_id);
339 printf(
"%s OK\n", channel_id);
340 }
else if (default_action == 1) {
342 printf(
"%s ERR message=\"Welcome\"\n", channel_id);
344 printf(
"%s ERR message=\"No session available\"\n", channel_id);