Kannel: Open Source WAP and SMS gateway  svn-r5262
dlr_spool.c File Reference
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <dirent.h>
#include <errno.h>
#include "gwlib/gwlib.h"
#include "dlr_p.h"
#include "sms.h"
#include "bb_store.h"

Go to the source code of this file.

Macros

#define MD5_DIGEST_LEN   32
 
#define SHA1_DIGEST_LEN   40
 
#define OUR_DIGEST_LEN   MD5_DIGEST_LEN
 
#define MAX_DIRS   100
 
#define MAP(to, from)
 
#define MAP(to, from)
 

Functions

static Octstrour_hash_func (Octstr *os)
 
static int non_verified_file (const char *filename, const struct stat *sb, int tflag, void *ftwbuf)
 
static int unlink_file (const char *filename, const struct stat *sb, int tflag, void *ftwbuf)
 
static int for_each_file (const Octstr *dir_s, int ignore_err, int(*cb)(const char *, const struct stat *, int, void *))
 
static Octstrget_msg_filename (const Octstr *dir_s, const Octstr *hash, const Octstr *dst)
 
static Octstrget_msg_surrogate (const Octstr *dir_s, const Octstr *hash, const Octstr *dst, Octstr **filename)
 
static void dlr_spool_add (struct dlr_entry *dlr)
 
static struct dlr_entrydlr_spool_get (const Octstr *smsc, const Octstr *ts, const Octstr *dst)
 
static void dlr_spool_remove (const Octstr *smsc, const Octstr *ts, const Octstr *dst)
 
static void dlr_spool_shutdown ()
 
static long dlr_spool_messages (void)
 
static void dlr_spool_flush (void)
 
struct dlr_storagedlr_init_spool (Cfg *cfg)
 

Variables

static Octstrspool_dir = NULL
 
static Countercounter
 
static struct dlr_storage handles
 

Macro Definition Documentation

◆ MAP [1/2]

#define MAP (   to,
  from 
)
Value:
to = from; \
from = NULL;
static Octstr * from
Definition: mtbatch.c:95

Referenced by dlr_spool_add(), and dlr_spool_get().

◆ MAP [2/2]

#define MAP (   to,
  from 
)
Value:
to = from; \
from = NULL;
static Octstr * from
Definition: mtbatch.c:95

◆ MAX_DIRS

#define MAX_DIRS   100

Definition at line 93 of file dlr_spool.c.

Referenced by dlr_spool_add(), dlr_spool_get(), and dlr_spool_remove().

◆ MD5_DIGEST_LEN

#define MD5_DIGEST_LEN   32

Definition at line 84 of file dlr_spool.c.

◆ OUR_DIGEST_LEN

#define OUR_DIGEST_LEN   MD5_DIGEST_LEN

Definition at line 89 of file dlr_spool.c.

Referenced by get_msg_filename().

◆ SHA1_DIGEST_LEN

#define SHA1_DIGEST_LEN   40

Definition at line 85 of file dlr_spool.c.

Function Documentation

◆ dlr_init_spool()

struct dlr_storage* dlr_init_spool ( Cfg cfg)

Definition at line 600 of file dlr_spool.c.

References cfg_get, cfg_get_single_group(), counter_create(), for_each_file(), handles, non_verified_file(), octstr_imm(), and panic.

Referenced by dlr_init().

601 {
602  CfgGroup *grp;
603 
604  if (!(grp = cfg_get_single_group(cfg, octstr_imm("core"))))
605  panic(0, "DLR: spool: group 'core' is not specified!");
606 
607  if (!(spool_dir = cfg_get(grp, octstr_imm("dlr-spool"))))
608  panic(0, "DLR: spool: directive 'dlr-spool' is not specified!");
609 
610 #ifdef HAVE_LIBSSL
611  OpenSSL_add_all_digests();
612 #endif
613 
615 
616  /* we need to traverse the DLR spool to determine how
617  * many entries we have. */
618 #ifdef VERIFIED
619  for_each_file(spool_dir, 1, verified_file);
620 #else
622 #endif
623 
624  return &handles;
625 }
static Octstr * spool_dir
Definition: dlr_spool.c:107
static Counter * counter
Definition: dlr_spool.c:112
#define cfg_get(grp, varname)
Definition: cfg.h:86
static int for_each_file(const Octstr *dir_s, int ignore_err, int(*cb)(const char *, const struct stat *, int, void *))
Definition: dlr_spool.c:252
static struct dlr_storage handles
Definition: dlr_spool.c:586
Octstr * octstr_imm(const char *cstr)
Definition: octstr.c:281
Counter * counter_create(void)
Definition: counter.c:94
#define panic
Definition: log.h:87
Definition: cfg.c:73
CfgGroup * cfg_get_single_group(Cfg *cfg, Octstr *name)
Definition: cfg.c:636
static int non_verified_file(const char *filename, const struct stat *sb, int tflag, void *ftwbuf)
Definition: dlr_spool.c:204

◆ dlr_spool_add()

static void dlr_spool_add ( struct dlr_entry dlr)
static

Definition at line 369 of file dlr_spool.c.

References dlr_entry::boxc_id, counter_increase(), dlr_entry::destination, dlr_entry_destroy(), error(), filename, MAP, dlr_entry::mask, MAX_DIRS, msg, msg_create, msg_destroy(), octstr_append(), octstr_binary_to_hex(), octstr_destroy(), octstr_duplicate, octstr_format(), octstr_get_cstr, octstr_hash_key(), octstr_len(), our_hash_func(), report_mt, dlr_entry::service, dlr_entry::smsc, dlr_entry::source, store_msg_pack, dlr_entry::timestamp, and dlr_entry::url.

370 {
371  Msg *msg;
372  Octstr *os, *hash, *dir, *filename;
373  int fd;
374  size_t wrc;
375 
376 #define MAP(to, from) \
377  to = from; \
378  from = NULL;
379 
380  /* create a common message structure to contain our values */
381  msg = msg_create(sms);
382  msg->sms.sms_type = report_mt;
383  MAP(msg->sms.smsc_id, dlr->smsc);
384  MAP(msg->sms.foreign_id, dlr->timestamp);
385  MAP(msg->sms.sender, dlr->source);
386  MAP(msg->sms.receiver, dlr->destination);
387  MAP(msg->sms.service, dlr->service);
388  MAP(msg->sms.dlr_url, dlr->url);
389  MAP(msg->sms.boxc_id, dlr->boxc_id);
390  msg->sms.dlr_mask = dlr->mask;
391 
392  /* we got all values, destroy the structure now */
393  dlr_entry_destroy(dlr);
394 
395  /* create hash value */
396  os = octstr_duplicate(msg->sms.smsc_id);
397  octstr_append(os, msg->sms.foreign_id);
398  hash = our_hash_func(os);
399  octstr_destroy(os);
400 
401  /* target directory */
402  dir = octstr_format("%S/%ld", spool_dir, octstr_hash_key(hash) % MAX_DIRS);
403  if (mkdir(octstr_get_cstr(dir), S_IRUSR|S_IWUSR|S_IXUSR) == -1 && errno != EEXIST) {
404  error(errno, "Could not create directory `%s'.", octstr_get_cstr(dir));
405  octstr_destroy(dir);
406  octstr_destroy(hash);
407  return;
408  }
409 
410  /*
411  * Now also add the hex value of the destination.
412  * This will be the part we look later into while
413  * DLR resolving.
414  */
415  os = octstr_duplicate(msg->sms.receiver);
416  octstr_binary_to_hex(os, 0);
417  octstr_append(hash, os);
418  octstr_destroy(os);
419 
420  /* target file */
421  filename = octstr_format("%S/%S", dir, hash);
422  octstr_destroy(dir);
423  octstr_destroy(hash);
424  if ((fd = open(octstr_get_cstr(filename), O_CREAT|O_EXCL|O_WRONLY, S_IRUSR|S_IWUSR)) == -1) {
425  error(errno, "Could not open file `%s'.", octstr_get_cstr(filename));
426  octstr_destroy(filename);
427  return;
428  }
429 
430  /* pack and write content to file */
431  os = store_msg_pack(msg);
432  msg_destroy(msg);
433  for (wrc = 0; wrc < octstr_len(os); ) {
434  size_t rc = write(fd, octstr_get_cstr(os) + wrc, octstr_len(os) - wrc);
435  if (rc == -1) {
436  /* remove file */
437  error(errno, "Could not write DLR message to `%s'.", octstr_get_cstr(filename));
438  close(fd);
439  if (unlink(octstr_get_cstr(filename)) == -1)
440  error(errno, "Oops, Could not remove failed file `%s'.", octstr_get_cstr(filename));
441  octstr_destroy(os);
442  octstr_destroy(filename);
443  return;
444  }
445  wrc += rc;
446  }
447  close(fd);
449  octstr_destroy(filename);
450  octstr_destroy(os);
451 }
void error(int err, const char *fmt,...)
Definition: log.c:648
Octstr * url
Definition: dlr_p.h:84
static Octstr * spool_dir
Definition: dlr_spool.c:107
Octstr * service
Definition: dlr_p.h:83
static Octstr * our_hash_func(Octstr *os)
Definition: dlr_spool.c:123
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:1502
Octstr * boxc_id
Definition: dlr_p.h:85
static Counter * counter
Definition: dlr_spool.c:112
#define msg_create(type)
Definition: msg.h:136
Definition: msg.h:110
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
void octstr_binary_to_hex(Octstr *ostr, int uppercase)
Definition: octstr.c:463
unsigned long counter_increase(Counter *counter)
Definition: counter.c:123
Definition: msg.h:79
Octstr * source
Definition: dlr_p.h:81
#define octstr_duplicate(ostr)
Definition: octstr.h:187
void msg_destroy(Msg *msg)
Definition: msg.c:132
#define MAX_DIRS
Definition: dlr_spool.c:93
Octstr * timestamp
Definition: dlr_p.h:80
unsigned long octstr_hash_key(Octstr *ostr)
Definition: octstr.c:2521
Octstr * octstr_format(const char *fmt,...)
Definition: octstr.c:2462
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
char filename[FILENAME_MAX+1]
Definition: log.c:171
Octstr *(* store_msg_pack)(Msg *msg)
Definition: bb_store.c:77
long octstr_len(const Octstr *ostr)
Definition: octstr.c:340
Octstr * destination
Definition: dlr_p.h:82
Definition: octstr.c:118
#define MAP(to, from)
void dlr_entry_destroy(struct dlr_entry *dlr)
Definition: dlr.c:142
Octstr * smsc
Definition: dlr_p.h:79
int mask
Definition: dlr_p.h:86
static XMLRPCDocument * msg
Definition: test_xmlrpc.c:86

◆ dlr_spool_flush()

static void dlr_spool_flush ( void  )
static

Definition at line 575 of file dlr_spool.c.

References counter_set(), for_each_file(), and unlink_file().

576 {
578  counter_set(counter, 0);
579 }
static Octstr * spool_dir
Definition: dlr_spool.c:107
static Counter * counter
Definition: dlr_spool.c:112
unsigned long counter_set(Counter *counter, unsigned long n)
Definition: counter.c:167
static int for_each_file(const Octstr *dir_s, int ignore_err, int(*cb)(const char *, const struct stat *, int, void *))
Definition: dlr_spool.c:252
static int unlink_file(const char *filename, const struct stat *sb, int tflag, void *ftwbuf)
Definition: dlr_spool.c:224

◆ dlr_spool_get()

static struct dlr_entry* dlr_spool_get ( const Octstr smsc,
const Octstr ts,
const Octstr dst 
)
static

Definition at line 457 of file dlr_spool.c.

References dlr_entry::boxc_id, dlr_entry::destination, dlr_entry_create(), error(), get_msg_surrogate(), MAP, dlr_entry::mask, MAX_DIRS, msg, msg_destroy(), octstr_append(), octstr_destroy(), octstr_duplicate, octstr_format(), octstr_get_cstr, octstr_hash_key(), our_hash_func(), dlr_entry::service, dlr_entry::smsc, dlr_entry::source, store_msg_unpack, dlr_entry::timestamp, and dlr_entry::url.

458 {
459  struct dlr_entry *ret = NULL;
460  Octstr *os, *hash, *dir, *filename = NULL;
461  Msg *msg;
462 
463  /* determine target dir and filename via hash */
464  os = octstr_duplicate(smsc);
465  octstr_append(os, ts);
466  hash = our_hash_func(os);
467  octstr_destroy(os);
468 
469  /* determine target dir */
470  dir = octstr_format("%S/%ld", spool_dir, octstr_hash_key(hash) % MAX_DIRS);
471 
472  /* get content of msg surrogate */
473  os = get_msg_surrogate(dir, hash, dst, &filename);
474  octstr_destroy(dir);
475  octstr_destroy(hash);
476 
477  /* if there was no content */
478  if (os == NULL) {
479  octstr_destroy(filename);
480  return NULL;
481  }
482 
483  /* unpack */
484  if ((msg = store_msg_unpack(os)) == NULL) {
485  octstr_destroy(os);
486  error(0, "Could not unpack DLR message `%s'", octstr_get_cstr(filename));
487  octstr_destroy(filename);
488  return ret;
489  }
490 
491  octstr_destroy(os);
492  octstr_destroy(filename);
493 
494 #define MAP(to, from) \
495  to = from; \
496  from = NULL;
497 
498  /* map values to a struct dlr_entry */
499  ret = dlr_entry_create();
500  MAP(ret->smsc, msg->sms.smsc_id);
501  MAP(ret->timestamp, msg->sms.foreign_id);
502  MAP(ret->source, msg->sms.sender);
503  MAP(ret->destination, msg->sms.receiver);
504  MAP(ret->service, msg->sms.service);
505  MAP(ret->url, msg->sms.dlr_url);
506  MAP(ret->boxc_id, msg->sms.boxc_id);
507  ret->mask = msg->sms.dlr_mask;
508 
509  msg_destroy(msg);
510 
511  return ret;
512 }
void error(int err, const char *fmt,...)
Definition: log.c:648
Octstr * url
Definition: dlr_p.h:84
static Octstr * spool_dir
Definition: dlr_spool.c:107
Octstr * service
Definition: dlr_p.h:83
static Octstr * our_hash_func(Octstr *os)
Definition: dlr_spool.c:123
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:1502
struct dlr_entry * dlr_entry_create(void)
Definition: dlr.c:103
Octstr * boxc_id
Definition: dlr_p.h:85
Msg *(* store_msg_unpack)(Octstr *os)
Definition: bb_store.c:78
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
Definition: msg.h:79
static Octstr * get_msg_surrogate(const Octstr *dir_s, const Octstr *hash, const Octstr *dst, Octstr **filename)
Definition: dlr_spool.c:351
Octstr * source
Definition: dlr_p.h:81
#define octstr_duplicate(ostr)
Definition: octstr.h:187
void msg_destroy(Msg *msg)
Definition: msg.c:132
#define MAX_DIRS
Definition: dlr_spool.c:93
Octstr * timestamp
Definition: dlr_p.h:80
unsigned long octstr_hash_key(Octstr *ostr)
Definition: octstr.c:2521
Octstr * octstr_format(const char *fmt,...)
Definition: octstr.c:2462
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
char filename[FILENAME_MAX+1]
Definition: log.c:171
Octstr * destination
Definition: dlr_p.h:82
Definition: octstr.c:118
#define MAP(to, from)
Definition: dlr_p.h:78
Octstr * smsc
Definition: dlr_p.h:79
int mask
Definition: dlr_p.h:86
static XMLRPCDocument * msg
Definition: test_xmlrpc.c:86

◆ dlr_spool_messages()

static long dlr_spool_messages ( void  )
static

Definition at line 566 of file dlr_spool.c.

References counter_value().

567 {
568  return counter_value(counter);
569 }
static Counter * counter
Definition: dlr_spool.c:112
unsigned long counter_value(Counter *counter)
Definition: counter.c:145

◆ dlr_spool_remove()

static void dlr_spool_remove ( const Octstr smsc,
const Octstr ts,
const Octstr dst 
)
static

Definition at line 518 of file dlr_spool.c.

References counter_decrease(), error(), filename, get_msg_filename(), MAX_DIRS, octstr_append(), octstr_destroy(), octstr_duplicate, octstr_format(), octstr_get_cstr, octstr_hash_key(), and our_hash_func().

519 {
520  Octstr *os, *hash, *dir, *filename;
521 
522  /* determine target dir and filename via hash */
523  os = octstr_duplicate(smsc);
524  octstr_append(os, ts);
525  hash = our_hash_func(os);
526  octstr_destroy(os);
527 
528  /* determine target dir */
529  dir = octstr_format("%S/%ld", spool_dir, octstr_hash_key(hash) % MAX_DIRS);
530 
531  /* get msg surrogate filename */
532  filename = get_msg_filename(dir, hash, dst);
533  octstr_destroy(dir);
534  octstr_destroy(hash);
535 
536  /* if there was no filename, then we didn't find it */
537  if (filename == NULL) {
538  return;
539  }
540 
541  /* remove the file from the file system */
542  if (unlink(octstr_get_cstr(filename)) == -1) {
543  error(errno, "Could not unlink file `%s'.", octstr_get_cstr(filename));
544  octstr_destroy(filename);
545  return;
546  }
547 
549  octstr_destroy(filename);
550 }
void error(int err, const char *fmt,...)
Definition: log.c:648
static Octstr * spool_dir
Definition: dlr_spool.c:107
static Octstr * our_hash_func(Octstr *os)
Definition: dlr_spool.c:123
void octstr_append(Octstr *ostr1, const Octstr *ostr2)
Definition: octstr.c:1502
static Counter * counter
Definition: dlr_spool.c:112
unsigned long counter_decrease(Counter *counter)
Definition: counter.c:155
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
#define octstr_duplicate(ostr)
Definition: octstr.h:187
#define MAX_DIRS
Definition: dlr_spool.c:93
unsigned long octstr_hash_key(Octstr *ostr)
Definition: octstr.c:2521
Octstr * octstr_format(const char *fmt,...)
Definition: octstr.c:2462
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
char filename[FILENAME_MAX+1]
Definition: log.c:171
Definition: octstr.c:118
static Octstr * get_msg_filename(const Octstr *dir_s, const Octstr *hash, const Octstr *dst)
Definition: dlr_spool.c:300

◆ dlr_spool_shutdown()

static void dlr_spool_shutdown ( )
static

Definition at line 556 of file dlr_spool.c.

References counter_destroy(), and octstr_destroy().

557 {
560 }
static Octstr * spool_dir
Definition: dlr_spool.c:107
void counter_destroy(Counter *counter)
Definition: counter.c:110
static Counter * counter
Definition: dlr_spool.c:112
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322

◆ for_each_file()

static int for_each_file ( const Octstr dir_s,
int  ignore_err,
int(*)(const char *, const struct stat *, int, void *)  cb 
)
static

Definition at line 252 of file dlr_spool.c.

References error(), filename, octstr_destroy(), octstr_format(), and octstr_get_cstr.

Referenced by dlr_init_spool(), dlr_spool_flush(), and unlink_file().

254 {
255  DIR *dir;
256  struct dirent *ent;
257  int ret = 0;
258 #ifndef _DIRENT_HAVE_D_TYPE
259  struct stat stat;
260 #endif
261 
262  if ((dir = opendir(octstr_get_cstr(dir_s))) == NULL) {
263  error(errno, "Could not open directory `%s'", octstr_get_cstr(dir_s));
264  return -1;
265  }
266  while ((ent = readdir(dir)) != NULL) {
267  Octstr *filename;
268  if (!(strcmp((char*)ent->d_name, "." ) != 0 && strcmp((char*)ent->d_name, ".." ) != 0))
269  continue;
270  filename = octstr_format("%S/%s", dir_s, ent->d_name);
271 #ifdef _DIRENT_HAVE_D_TYPE
272  if (ent->d_type == DT_DIR && for_each_file(filename, ignore_err, cb) == -1) {
273  ret = -1;
274  } else if (ent->d_type == DT_REG && cb != NULL) {
275  cb(octstr_get_cstr(filename), NULL, 0, NULL);
276  }
277 #else
278  if (lstat(octstr_get_cstr(filename), &stat) == -1) {
279  if (!ignore_err)
280  error(errno, "Could not get stat for `%s'", octstr_get_cstr(filename));
281  ret = -1;
282  } else if (S_ISDIR(stat.st_mode) && for_each_file(filename, ignore_err, cb) == -1) {
283  ret = -1;
284  } else if (S_ISREG(stat.st_mode) && cb != NULL)
285  cb(octstr_get_cstr(filename), &stat, 0, NULL);
286 #endif
287  octstr_destroy(filename);
288  if (ret == -1 && ignore_err)
289  ret = 0;
290  else if (ret == -1)
291  break;
292  }
293  closedir(dir);
294 
295  return ret;
296 }
void error(int err, const char *fmt,...)
Definition: log.c:648
static int for_each_file(const Octstr *dir_s, int ignore_err, int(*cb)(const char *, const struct stat *, int, void *))
Definition: dlr_spool.c:252
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
Octstr * octstr_format(const char *fmt,...)
Definition: octstr.c:2462
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
char filename[FILENAME_MAX+1]
Definition: log.c:171
Definition: octstr.c:118

◆ get_msg_filename()

static Octstr* get_msg_filename ( const Octstr dir_s,
const Octstr hash,
const Octstr dst 
)
static

Definition at line 300 of file dlr_spool.c.

References error(), found, octstr_copy, octstr_create, octstr_destroy(), octstr_format(), octstr_get_cstr, octstr_len(), octstr_ncompare(), octstr_search(), and OUR_DIGEST_LEN.

Referenced by dlr_spool_remove(), and get_msg_surrogate().

301 {
302  Octstr *ret;
303  DIR *dir;
304  struct dirent *ent;
305 
306  if ((dir = opendir(octstr_get_cstr(dir_s))) == NULL) {
307  error(errno, "Could not open directory `%s'", octstr_get_cstr(dir_s));
308  return NULL;
309  }
310 
311  while ((ent = readdir(dir)) != NULL) {
312  Octstr *fname = octstr_create((char*)ent->d_name);
313 
314  if (octstr_ncompare(fname, hash, OUR_DIGEST_LEN) == 0) {
315  Octstr *addr;
316  long addr_len, pos;
317 
318  /* this is a candidate */
319  if (dst == NULL)
320  goto found;
321 
322  /* check for the destination address suffix part */
323  if ((addr_len = (octstr_len(fname) - OUR_DIGEST_LEN)) < 0 ||
324  (pos = (addr_len - octstr_len(dst))) < 0) {
325  octstr_destroy(fname);
326  continue;
327  }
328  addr = octstr_copy(fname, OUR_DIGEST_LEN, addr_len);
329 
330  /* if not found, then bail out*/
331  if (octstr_search(addr, dst, pos) == -1) {
332  octstr_destroy(addr);
333  octstr_destroy(fname);
334  continue;
335  }
336  octstr_destroy(addr);
337 found:
338  /* found it */
339  closedir(dir);
340  ret = octstr_format("%S/%S", dir_s, fname);
341  octstr_destroy(fname);
342  return ret;
343  }
344  octstr_destroy(fname);
345  }
346  closedir(dir);
347 
348  return NULL;
349 }
void error(int err, const char *fmt,...)
Definition: log.c:648
long octstr_search(const Octstr *haystack, const Octstr *needle, long pos)
Definition: octstr.c:1068
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
#define octstr_copy(ostr, from, len)
Definition: octstr.h:178
static struct pid_list * found
int octstr_ncompare(const Octstr *ostr1, const Octstr *ostr2, long n)
Definition: octstr.c:950
Octstr * octstr_format(const char *fmt,...)
Definition: octstr.c:2462
void octstr_destroy(Octstr *ostr)
Definition: octstr.c:322
#define octstr_create(cstr)
Definition: octstr.h:125
long octstr_len(const Octstr *ostr)
Definition: octstr.c:340
Definition: octstr.c:118
#define OUR_DIGEST_LEN
Definition: dlr_spool.c:89

◆ get_msg_surrogate()

static Octstr* get_msg_surrogate ( const Octstr dir_s,
const Octstr hash,
const Octstr dst,
Octstr **  filename 
)
static

Definition at line 351 of file dlr_spool.c.

References get_msg_filename(), octstr_get_cstr, and octstr_read_file().

Referenced by dlr_spool_get().

353 {
354  /* get our msg filename */
355  if ((*filename = get_msg_filename(dir_s, hash, dst)) == NULL)
356  return NULL;
357 
358  return octstr_read_file(octstr_get_cstr(*filename));
359 }
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
Octstr * octstr_read_file(const char *filename)
Definition: octstr.c:1546
static Octstr * get_msg_filename(const Octstr *dir_s, const Octstr *hash, const Octstr *dst)
Definition: dlr_spool.c:300

◆ non_verified_file()

static int non_verified_file ( const char *  filename,
const struct stat *  sb,
int  tflag,
void *  ftwbuf 
)
static

Definition at line 204 of file dlr_spool.c.

References counter_increase(), and unlink_file().

Referenced by dlr_init_spool(), and our_hash_func().

205 {
206 #endif
207 
209 
210  return 0;
211 }
static Counter * counter
Definition: dlr_spool.c:112
unsigned long counter_increase(Counter *counter)
Definition: counter.c:123

◆ our_hash_func()

static Octstr* our_hash_func ( Octstr os)
static

Definition at line 123 of file dlr_spool.c.

References counter_increase(), error(), filename, md5digest(), msg, msg_destroy(), non_verified_file(), octstr_binary_to_hex(), octstr_create_from_data, octstr_destroy(), octstr_get_cstr, octstr_len(), octstr_read_file(), and store_msg_unpack.

Referenced by dlr_spool_add(), dlr_spool_get(), dlr_spool_remove(), and main().

124 {
125 #ifdef HAVE_LIBSSL
126  /* use openssl's SHA1 */
127  unsigned char hash[20];
128  Octstr *ret;
129 
130  memset(hash, 0, sizeof(hash));
131 
132  SHA1((const unsigned char *)octstr_get_cstr(os), octstr_len(os), hash);
133 
134  ret = octstr_create_from_data((const char*)hash, sizeof(hash));
135  octstr_binary_to_hex(ret, 0);
136  return ret;
137 #else
138  /* fallback to our own MD5 if we don't have openssl available */
139  return md5digest(os);
140 #endif
141 }
#define octstr_get_cstr(ostr)
Definition: octstr.h:233
void octstr_binary_to_hex(Octstr *ostr, int uppercase)
Definition: octstr.c:463
long octstr_len(const Octstr *ostr)
Definition: octstr.c:340
Definition: octstr.c:118
#define octstr_create_from_data(data, len)
Definition: octstr.h:134
Octstr * md5digest(Octstr *data)
Definition: md5.c:406

◆ unlink_file()

static int unlink_file ( const char *  filename,
const struct stat *  sb,
int  tflag,
void *  ftwbuf 
)
static

Definition at line 224 of file dlr_spool.c.

References error(), for_each_file(), and octstr_get_cstr.

Referenced by dlr_spool_flush(), and non_verified_file().

225 {
226 #endif
227 
228  /* remove the file from the file system */
229  if (unlink(filename) == -1) {
230  error(errno, "Could not unlink file `%s'.", filename);
231  }
232 
233  return 0;
234 }
void error(int err, const char *fmt,...)
Definition: log.c:648
char filename[FILENAME_MAX+1]
Definition: log.c:171

Variable Documentation

◆ counter

Counter* counter
static

Definition at line 112 of file dlr_spool.c.

◆ handles

struct dlr_storage handles
static
Initial value:
= {
.type = "spool",
.dlr_add = dlr_spool_add,
.dlr_get = dlr_spool_get,
.dlr_remove = dlr_spool_remove,
.dlr_shutdown = dlr_spool_shutdown,
.dlr_messages = dlr_spool_messages,
.dlr_flush = dlr_spool_flush
}
static void dlr_spool_shutdown()
Definition: dlr_spool.c:556
static void dlr_spool_flush(void)
Definition: dlr_spool.c:575
static long dlr_spool_messages(void)
Definition: dlr_spool.c:566
static void dlr_spool_remove(const Octstr *smsc, const Octstr *ts, const Octstr *dst)
Definition: dlr_spool.c:518
static void dlr_spool_add(struct dlr_entry *dlr)
Definition: dlr_spool.c:369
static struct dlr_entry * dlr_spool_get(const Octstr *smsc, const Octstr *ts, const Octstr *dst)
Definition: dlr_spool.c:457

Definition at line 586 of file dlr_spool.c.

Referenced by dlr_init_spool().

◆ spool_dir

Octstr* spool_dir = NULL
static

Definition at line 107 of file dlr_spool.c.

See file LICENSE for details about the license agreement for using, modifying, copying or deriving work from this software.