Deleted Added
full compact
vacation.c (66494) vacation.c (71345)
1/*
2 * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
3 * All rights reserved.
4 * Copyright (c) 1983, 1987, 1993
5 * The Regents of the University of California. All rights reserved.
6 * Copyright (c) 1983 Eric P. Allman. All rights reserved.
7 *
8 * By using this file, you agree to the terms and conditions set

--- 7 unchanged lines hidden (view full) ---

16"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
17 All rights reserved.\n\
18 Copyright (c) 1983, 1987, 1993\n\
19 The Regents of the University of California. All rights reserved.\n\
20 Copyright (c) 1983 Eric P. Allman. All rights reserved.\n";
21#endif /* ! lint */
22
23#ifndef lint
1/*
2 * Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
3 * All rights reserved.
4 * Copyright (c) 1983, 1987, 1993
5 * The Regents of the University of California. All rights reserved.
6 * Copyright (c) 1983 Eric P. Allman. All rights reserved.
7 *
8 * By using this file, you agree to the terms and conditions set

--- 7 unchanged lines hidden (view full) ---

16"@(#) Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.\n\
17 All rights reserved.\n\
18 Copyright (c) 1983, 1987, 1993\n\
19 The Regents of the University of California. All rights reserved.\n\
20 Copyright (c) 1983 Eric P. Allman. All rights reserved.\n";
21#endif /* ! lint */
22
23#ifndef lint
24static char id[] = "@(#)$Id: vacation.c,v 8.68.4.7 2000/09/05 21:48:45 gshapiro Exp $";
24static char id[] = "@(#)$Id: vacation.c,v 8.68.4.15 2000/11/27 22:17:27 ca Exp $";
25#endif /* ! lint */
26
27#include <ctype.h>
28#include <stdlib.h>
29#include <syslog.h>
30#include <time.h>
31#include <unistd.h>
32#ifdef EX_OK

--- 10 unchanged lines hidden (view full) ---

43
44#ifndef _PATH_SENDMAIL
45# define _PATH_SENDMAIL "/usr/lib/sendmail"
46#endif /* ! _PATH_SENDMAIL */
47
48#define ONLY_ONCE ((time_t) 0) /* send at most one reply */
49#define INTERVAL_UNDEF ((time_t) (-1)) /* no value given */
50
25#endif /* ! lint */
26
27#include <ctype.h>
28#include <stdlib.h>
29#include <syslog.h>
30#include <time.h>
31#include <unistd.h>
32#ifdef EX_OK

--- 10 unchanged lines hidden (view full) ---

43
44#ifndef _PATH_SENDMAIL
45# define _PATH_SENDMAIL "/usr/lib/sendmail"
46#endif /* ! _PATH_SENDMAIL */
47
48#define ONLY_ONCE ((time_t) 0) /* send at most one reply */
49#define INTERVAL_UNDEF ((time_t) (-1)) /* no value given */
50
51#ifndef TRUE
52# define TRUE 1
53# define FALSE 0
54#endif /* ! TRUE */
55
51uid_t RealUid;
52gid_t RealGid;
53char *RealUserName;
54uid_t RunAsUid;
55uid_t RunAsGid;
56char *RunAsUserName;
57int Verbose = 2;
58bool DontInitGroups = FALSE;

--- 9 unchanged lines hidden (view full) ---

68** vacation" loops.
69*/
70
71#define VDB ".vacation" /* vacation database */
72#define VMSG ".vacation.msg" /* vacation message */
73#define SECSPERDAY (60 * 60 * 24)
74#define DAYSPERWEEK 7
75
56uid_t RealUid;
57gid_t RealGid;
58char *RealUserName;
59uid_t RunAsUid;
60uid_t RunAsGid;
61char *RunAsUserName;
62int Verbose = 2;
63bool DontInitGroups = FALSE;

--- 9 unchanged lines hidden (view full) ---

73** vacation" loops.
74*/
75
76#define VDB ".vacation" /* vacation database */
77#define VMSG ".vacation.msg" /* vacation message */
78#define SECSPERDAY (60 * 60 * 24)
79#define DAYSPERWEEK 7
80
76#ifndef TRUE
77# define TRUE 1
78# define FALSE 0
79#endif /* ! TRUE */
80
81#ifndef __P
82# ifdef __STDC__
83# define __P(protos) protos
84# else /* __STDC__ */
85# define __P(protos) ()
86# define const
87# endif /* __STDC__ */
88#endif /* ! __P */

--- 17 unchanged lines hidden (view full) ---

106# define msglog syslog
107#endif /* _FFR_DEBUG */
108
109static void eatmsg __P((void));
110
111/* exit after reading input */
112#define EXITIT(excode) { \
113 eatmsg(); \
81#ifndef __P
82# ifdef __STDC__
83# define __P(protos) protos
84# else /* __STDC__ */
85# define __P(protos) ()
86# define const
87# endif /* __STDC__ */
88#endif /* ! __P */

--- 17 unchanged lines hidden (view full) ---

106# define msglog syslog
107#endif /* _FFR_DEBUG */
108
109static void eatmsg __P((void));
110
111/* exit after reading input */
112#define EXITIT(excode) { \
113 eatmsg(); \
114 exit(excode); \
114 return excode; \
115 }
116int
117main(argc, argv)
118 int argc;
119 char **argv;
120{
121 bool iflag, emptysender, exclude;
122#if _FFR_LISTDB

--- 10 unchanged lines hidden (view full) ---

133 char *msgfilename = VMSG;
134 char *name;
135 SMDB_USER_INFO user_info;
136 static char rnamebuf[MAXNAME];
137 extern int optind, opterr;
138 extern char *optarg;
139 extern void usage __P((void));
140 extern void setinterval __P((time_t));
115 }
116int
117main(argc, argv)
118 int argc;
119 char **argv;
120{
121 bool iflag, emptysender, exclude;
122#if _FFR_LISTDB

--- 10 unchanged lines hidden (view full) ---

133 char *msgfilename = VMSG;
134 char *name;
135 SMDB_USER_INFO user_info;
136 static char rnamebuf[MAXNAME];
137 extern int optind, opterr;
138 extern char *optarg;
139 extern void usage __P((void));
140 extern void setinterval __P((time_t));
141 extern void readheaders __P((void));
141 extern int readheaders __P((void));
142 extern bool recent __P((void));
143 extern void setreply __P((char *, time_t));
144 extern void sendmessage __P((char *, char *, bool));
145 extern void xclude __P((FILE *));
146#if _FFR_LISTDB
147#define EXITM(excode) { \
148 if (!iflag && !lflag) \
149 eatmsg(); \

--- 193 unchanged lines hidden (view full) ---

343 }
344
345#if _FFR_LISTDB
346 if (lflag)
347 {
348 static void listdb __P((void));
349
350 listdb();
142 extern bool recent __P((void));
143 extern void setreply __P((char *, time_t));
144 extern void sendmessage __P((char *, char *, bool));
145 extern void xclude __P((FILE *));
146#if _FFR_LISTDB
147#define EXITM(excode) { \
148 if (!iflag && !lflag) \
149 eatmsg(); \

--- 193 unchanged lines hidden (view full) ---

343 }
344
345#if _FFR_LISTDB
346 if (lflag)
347 {
348 static void listdb __P((void));
349
350 listdb();
351 (void)Db->smdb_close(Db);
351 (void) Db->smdb_close(Db);
352 exit(EX_OK);
353 }
354#endif /* _FFR_LISTDB */
355
356 if (interval != INTERVAL_UNDEF)
357 setinterval(interval);
358
352 exit(EX_OK);
353 }
354#endif /* _FFR_LISTDB */
355
356 if (interval != INTERVAL_UNDEF)
357 setinterval(interval);
358
359 if (iflag)
359 if (iflag && !exclude)
360 {
360 {
361 result = Db->smdb_close(Db);
362 if (!exclude)
363 exit(EX_OK);
361 (void) Db->smdb_close(Db);
362 exit(EX_OK);
364 }
365
366 if (exclude)
367 {
368 xclude(stdin);
363 }
364
365 if (exclude)
366 {
367 xclude(stdin);
369 result = Db->smdb_close(Db);
368 (void) Db->smdb_close(Db);
370 EXITM(EX_OK);
371 }
372
373 if ((cur = (ALIAS *)malloc((u_int)sizeof(ALIAS))) == NULL)
374 {
375 msglog(LOG_NOTICE,
376 "vacation: can't allocate memory for username.\n");
369 EXITM(EX_OK);
370 }
371
372 if ((cur = (ALIAS *)malloc((u_int)sizeof(ALIAS))) == NULL)
373 {
374 msglog(LOG_NOTICE,
375 "vacation: can't allocate memory for username.\n");
376 (void) Db->smdb_close(Db);
377 EXITM(EX_OSERR);
378 }
379 cur->name = name;
380 cur->next = Names;
381 Names = cur;
382
377 EXITM(EX_OSERR);
378 }
379 cur->name = name;
380 cur->next = Names;
381 Names = cur;
382
383 readheaders();
384 if (!recent())
383 result = readheaders();
384 if (result == EX_OK && !recent())
385 {
386 time_t now;
387
388 (void) time(&now);
389 setreply(From, now);
385 {
386 time_t now;
387
388 (void) time(&now);
389 setreply(From, now);
390 result = Db->smdb_close(Db);
390 (void) Db->smdb_close(Db);
391 sendmessage(name, msgfilename, emptysender);
392 }
393 else
391 sendmessage(name, msgfilename, emptysender);
392 }
393 else
394 result = Db->smdb_close(Db);
395 exit(EX_OK);
396 /* NOTREACHED */
397 return EX_OK;
394 (void) Db->smdb_close(Db);
395 if (result == EX_NOUSER)
396 result = EX_OK;
397 exit(result);
398}
399
400/*
401** EATMSG -- read stdin till EOF
402**
403** Parameters:
404** none.
405**

--- 14 unchanged lines hidden (view full) ---

420
421/*
422** READHEADERS -- read mail headers
423**
424** Parameters:
425** none.
426**
427** Returns:
398}
399
400/*
401** EATMSG -- read stdin till EOF
402**
403** Parameters:
404** none.
405**

--- 14 unchanged lines hidden (view full) ---

420
421/*
422** READHEADERS -- read mail headers
423**
424** Parameters:
425** none.
426**
427** Returns:
428** nothing.
428** a exit code: NOUSER if no reply, OK if reply, * if error
429**
430** Side Effects:
431** may exit().
432**
433*/
429**
430** Side Effects:
431** may exit().
432**
433*/
434void
434
435int
435readheaders()
436{
437 bool tome, cont;
438 register char *p;
439 register ALIAS *cur;
440 char buf[MAXLINE];
441 extern bool junkmail __P((char *));
442 extern bool nsearch __P((char *, char *));

--- 36 unchanged lines hidden (view full) ---

479 msglog(LOG_NOTICE,
480 "vacation: badly formatted \"From \" line.\n");
481 EXITIT(EX_DATAERR);
482 }
483 *p = '\0';
484
485 /* ok since both strings have MAXLINE length */
486 if (*From == '\0')
436readheaders()
437{
438 bool tome, cont;
439 register char *p;
440 register ALIAS *cur;
441 char buf[MAXLINE];
442 extern bool junkmail __P((char *));
443 extern bool nsearch __P((char *, char *));

--- 36 unchanged lines hidden (view full) ---

480 msglog(LOG_NOTICE,
481 "vacation: badly formatted \"From \" line.\n");
482 EXITIT(EX_DATAERR);
483 }
484 *p = '\0';
485
486 /* ok since both strings have MAXLINE length */
487 if (*From == '\0')
487 (void)strlcpy(From, buf + 5,
488 sizeof From);
488 (void) strlcpy(From, buf + 5,
489 sizeof From);
489 if ((p = strchr(buf + 5, '\n')) != NULL)
490 *p = '\0';
491 if (junkmail(buf + 5))
490 if ((p = strchr(buf + 5, '\n')) != NULL)
491 *p = '\0';
492 if (junkmail(buf + 5))
492 EXITIT(EX_OK);
493 EXITIT(EX_NOUSER);
493 }
494 break;
495
496 case 'P': /* "Precedence:" */
497 case 'p':
498 cont = FALSE;
499 if (strlen(buf) <= 10 ||
500 strncasecmp(buf, "Precedence", 10) != 0 ||
501 (buf[10] != ':' && buf[10] != ' ' &&
502 buf[10] != '\t'))
503 break;
504 if ((p = strchr(buf, ':')) == NULL)
505 break;
506 while (*++p != '\0' && isascii(*p) && isspace(*p));
507 if (*p == '\0')
508 break;
509 if (strncasecmp(p, "junk", 4) == 0 ||
510 strncasecmp(p, "bulk", 4) == 0 ||
511 strncasecmp(p, "list", 4) == 0)
494 }
495 break;
496
497 case 'P': /* "Precedence:" */
498 case 'p':
499 cont = FALSE;
500 if (strlen(buf) <= 10 ||
501 strncasecmp(buf, "Precedence", 10) != 0 ||
502 (buf[10] != ':' && buf[10] != ' ' &&
503 buf[10] != '\t'))
504 break;
505 if ((p = strchr(buf, ':')) == NULL)
506 break;
507 while (*++p != '\0' && isascii(*p) && isspace(*p));
508 if (*p == '\0')
509 break;
510 if (strncasecmp(p, "junk", 4) == 0 ||
511 strncasecmp(p, "bulk", 4) == 0 ||
512 strncasecmp(p, "list", 4) == 0)
512 EXITIT(EX_OK);
513 EXITIT(EX_NOUSER);
513 break;
514
515 case 'C': /* "Cc:" */
516 case 'c':
517 if (strncasecmp(buf, "Cc:", 3) != 0)
518 break;
519 cont = TRUE;
520 goto findme;

--- 14 unchanged lines hidden (view full) ---

535findme:
536 for (cur = Names;
537 !tome && cur != NULL;
538 cur = cur->next)
539 tome = nsearch(cur->name, buf);
540 }
541 }
542 if (!tome)
514 break;
515
516 case 'C': /* "Cc:" */
517 case 'c':
518 if (strncasecmp(buf, "Cc:", 3) != 0)
519 break;
520 cont = TRUE;
521 goto findme;

--- 14 unchanged lines hidden (view full) ---

536findme:
537 for (cur = Names;
538 !tome && cur != NULL;
539 cur = cur->next)
540 tome = nsearch(cur->name, buf);
541 }
542 }
543 if (!tome)
543 EXITIT(EX_OK);
544 EXITIT(EX_NOUSER);
544 if (*From == '\0')
545 {
546 msglog(LOG_NOTICE, "vacation: no initial \"From \" line.\n");
547 EXITIT(EX_DATAERR);
548 }
545 if (*From == '\0')
546 {
547 msglog(LOG_NOTICE, "vacation: no initial \"From \" line.\n");
548 EXITIT(EX_DATAERR);
549 }
550 EXITIT(EX_OK);
549}
550
551/*
552** NSEARCH --
553** do a nice, slow, search of a string for a substring.
554**
555** Parameters:
556** name -- name to search.

--- 38 unchanged lines hidden (view full) ---

595**
596** Parameters:
597** from -- sender address.
598**
599** Returns:
600** is this some automated/junk/bulk/list mail?
601**
602*/
551}
552
553/*
554** NSEARCH --
555** do a nice, slow, search of a string for a substring.
556**
557** Parameters:
558** name -- name to search.

--- 38 unchanged lines hidden (view full) ---

597**
598** Parameters:
599** from -- sender address.
600**
601** Returns:
602** is this some automated/junk/bulk/list mail?
603**
604*/
605
606struct ignore
607{
608 char *name;
609 size_t len;
610};
611
612typedef struct ignore IGNORE_T;
613
614#define MAX_USER_LEN 256 /* maximum length of local part (sender) */
615
616/* delimiters for the local part of an address */
617#define isdelim(c) ((c) == '%' || (c) == '@' || (c) == '+')
618
603bool
604junkmail(from)
605 char *from;
606{
619bool
620junkmail(from)
621 char *from;
622{
607 register size_t len;
608 register char *p;
609 register struct ignore *cur;
610 static struct ignore
623 bool quot;
624 char *e;
625 size_t len;
626 IGNORE_T *cur;
627 char sender[MAX_USER_LEN];
628 static IGNORE_T ignore[] =
611 {
629 {
612 char *name;
613 size_t len;
614 } ignore[] =
615 {
616 { "-request", 8 },
617 { "postmaster", 10 },
618 { "uucp", 4 },
619 { "mailer-daemon", 13 },
620 { "mailer", 6 },
630 { "postmaster", 10 },
631 { "uucp", 4 },
632 { "mailer-daemon", 13 },
633 { "mailer", 6 },
634 { NULL, 0 }
635 };
636
637 static IGNORE_T ignorepost[] =
638 {
639 { "-request", 8 },
621 { "-relay", 6 },
640 { "-relay", 6 },
641 { "-owner", 6 },
622 { NULL, 0 }
623 };
624
642 { NULL, 0 }
643 };
644
645 static IGNORE_T ignorepre[] =
646 {
647 { "owner-", 6 },
648 { NULL, 0 }
649 };
650
625 /*
651 /*
626 * This is mildly amusing, and I'm not positive it's right; trying
627 * to find the "real" name of the sender, assuming that addresses
628 * will be some variant of:
629 *
630 * From site!site!SENDER%site.domain%site.domain@site.domain
631 */
632 if ((p = strchr(from, '%')) == NULL &&
633 (p = strchr(from, '@')) == NULL)
652 ** This is mildly amusing, and I'm not positive it's right; trying
653 ** to find the "real" name of the sender, assuming that addresses
654 ** will be some variant of:
655 **
656 ** From site!site!SENDER%site.domain%site.domain@site.domain
657 */
658
659 quot = FALSE;
660 e = from;
661 len = 0;
662 while (*e != '\0' && (quot || !isdelim(*e)))
634 {
663 {
635 if ((p = strrchr(from, '!')) != NULL)
636 ++p;
637 else
638 p = from;
639 for (; *p; ++p)
664 if (*e == '"')
665 {
666 quot = !quot;
667 ++e;
640 continue;
668 continue;
669 }
670 if (*e == '\\')
671 {
672 if (*(++e) == '\0')
673 {
674 /* '\\' at end of string? */
675 break;
676 }
677 if (len < MAX_USER_LEN)
678 sender[len++] = *e;
679 ++e;
680 continue;
681 }
682 if (*e == '!' && !quot)
683 {
684 len = 0;
685 sender[len] = '\0';
686 }
687 else
688 if (len < MAX_USER_LEN)
689 sender[len++] = *e;
690 ++e;
641 }
691 }
642 len = p - from;
692 if (len < MAX_USER_LEN)
693 sender[len] = '\0';
694 else
695 sender[MAX_USER_LEN - 1] = '\0';
696
697 if (len <= 0)
698 return FALSE;
699#if 0
700 if (quot)
701 return FALSE; /* syntax error... */
702#endif /* 0 */
703
704 /* test prefixes */
705 for (cur = ignorepre; cur->name != NULL; ++cur)
706 {
707 if (len >= cur->len &&
708 strncasecmp(cur->name, sender, cur->len) == 0)
709 return TRUE;
710 }
711
712 /*
713 ** If the name is truncated, don't test the rest.
714 ** We could extract the "tail" of the sender address and
715 ** compare it it ignorepost, however, it seems not worth
716 ** the effort.
717 ** The address surely can't match any entry in ignore[]
718 ** (as long as all of them are shorter than MAX_USER_LEN).
719 */
720
721 if (len > MAX_USER_LEN)
722 return FALSE;
723
724 /* test full local parts */
643 for (cur = ignore; cur->name != NULL; ++cur)
644 {
725 for (cur = ignore; cur->name != NULL; ++cur)
726 {
727 if (len == cur->len &&
728 strncasecmp(cur->name, sender, cur->len) == 0)
729 return TRUE;
730 }
731
732 /* test postfixes */
733 for (cur = ignorepost; cur->name != NULL; ++cur)
734 {
645 if (len >= cur->len &&
735 if (len >= cur->len &&
646 strncasecmp(cur->name, p - cur->len, cur->len) == 0)
736 strncasecmp(cur->name, e - cur->len - 1,
737 cur->len) == 0)
647 return TRUE;
648 }
738 return TRUE;
739 }
740
649 return FALSE;
650}
651
652#define VIT "__VACATION__INTERVAL__TIMER__"
653
654/*
655** RECENT --
656** find out if user has gotten a vacation message recently.

--- 13 unchanged lines hidden (view full) ---

670 bool trydomain = FALSE;
671 int st;
672 char *domain;
673
674 memset(&key, '\0', sizeof key);
675 memset(&data, '\0', sizeof data);
676
677 /* get interval time */
741 return FALSE;
742}
743
744#define VIT "__VACATION__INTERVAL__TIMER__"
745
746/*
747** RECENT --
748** find out if user has gotten a vacation message recently.

--- 13 unchanged lines hidden (view full) ---

762 bool trydomain = FALSE;
763 int st;
764 char *domain;
765
766 memset(&key, '\0', sizeof key);
767 memset(&data, '\0', sizeof data);
768
769 /* get interval time */
678 key.data.data = VIT;
679 key.data.size = sizeof(VIT);
770 key.data = VIT;
771 key.size = sizeof(VIT);
680
681 st = Db->smdb_get(Db, &key, &data, 0);
682 if (st != SMDBE_OK)
683 next = SECSPERDAY * DAYSPERWEEK;
684 else
772
773 st = Db->smdb_get(Db, &key, &data, 0);
774 if (st != SMDBE_OK)
775 next = SECSPERDAY * DAYSPERWEEK;
776 else
685 memmove(&next, data.data.data, sizeof(next));
777 memmove(&next, data.data, sizeof(next));
686
687 memset(&data, '\0', sizeof data);
688
689 /* get record for this address */
778
779 memset(&data, '\0', sizeof data);
780
781 /* get record for this address */
690 key.data.data = From;
691 key.data.size = strlen(From);
782 key.data = From;
783 key.size = strlen(From);
692
693 do
694 {
695 st = Db->smdb_get(Db, &key, &data, 0);
696 if (st == SMDBE_OK)
697 {
784
785 do
786 {
787 st = Db->smdb_get(Db, &key, &data, 0);
788 if (st == SMDBE_OK)
789 {
698 memmove(&then, data.data.data, sizeof(then));
790 memmove(&then, data.data, sizeof(then));
699 if (next == ONLY_ONCE || then == ONLY_ONCE ||
700 then + next > time(NULL))
701 return TRUE;
702 }
703 if ((trydomain = !trydomain) &&
704 (domain = strchr(From, '@')) != NULL)
705 {
791 if (next == ONLY_ONCE || then == ONLY_ONCE ||
792 then + next > time(NULL))
793 return TRUE;
794 }
795 if ((trydomain = !trydomain) &&
796 (domain = strchr(From, '@')) != NULL)
797 {
706 key.data.data = domain;
707 key.data.size = strlen(domain);
798 key.data = domain;
799 key.size = strlen(domain);
708 }
709 } while (trydomain);
710 return FALSE;
711}
712
713/*
714** SETINTERVAL --
715** store the reply interval

--- 11 unchanged lines hidden (view full) ---

727setinterval(interval)
728 time_t interval;
729{
730 SMDB_DBENT key, data;
731
732 memset(&key, '\0', sizeof key);
733 memset(&data, '\0', sizeof data);
734
800 }
801 } while (trydomain);
802 return FALSE;
803}
804
805/*
806** SETINTERVAL --
807** store the reply interval

--- 11 unchanged lines hidden (view full) ---

819setinterval(interval)
820 time_t interval;
821{
822 SMDB_DBENT key, data;
823
824 memset(&key, '\0', sizeof key);
825 memset(&data, '\0', sizeof data);
826
735 key.data.data = VIT;
736 key.data.size = sizeof(VIT);
737 data.data.data = (char*) &interval;
738 data.data.size = sizeof(interval);
739 (void)(Db->smdb_put)(Db, &key, &data, 0);
827 key.data = VIT;
828 key.size = sizeof(VIT);
829 data.data = (char*) &interval;
830 data.size = sizeof(interval);
831 (void) (Db->smdb_put)(Db, &key, &data, 0);
740}
741
742/*
743** SETREPLY --
744** store that this user knows about the vacation.
745**
746** Parameters:
747** from -- sender address.

--- 10 unchanged lines hidden (view full) ---

758 char *from;
759 time_t when;
760{
761 SMDB_DBENT key, data;
762
763 memset(&key, '\0', sizeof key);
764 memset(&data, '\0', sizeof data);
765
832}
833
834/*
835** SETREPLY --
836** store that this user knows about the vacation.
837**
838** Parameters:
839** from -- sender address.

--- 10 unchanged lines hidden (view full) ---

850 char *from;
851 time_t when;
852{
853 SMDB_DBENT key, data;
854
855 memset(&key, '\0', sizeof key);
856 memset(&data, '\0', sizeof data);
857
766 key.data.data = from;
767 key.data.size = strlen(from);
768 data.data.data = (char*) &when;
769 data.data.size = sizeof(when);
770 (void)(Db->smdb_put)(Db, &key, &data, 0);
858 key.data = from;
859 key.size = strlen(from);
860 data.data = (char*) &when;
861 data.size = sizeof(when);
862 (void) (Db->smdb_put)(Db, &key, &data, 0);
771}
772
773/*
774** XCLUDE --
775** add users to vacation db so they don't get a reply.
776**
777** Parameters:
778** f -- file pointer with list of address to exclude

--- 148 unchanged lines hidden (view full) ---

927 errstring(result));
928 return;
929 }
930
931 while ((result = cursor->smdbc_get(cursor, &db_key, &db_value,
932 SMDB_CURSOR_GET_NEXT)) == SMDBE_OK)
933 {
934 /* skip magic VIT entry */
863}
864
865/*
866** XCLUDE --
867** add users to vacation db so they don't get a reply.
868**
869** Parameters:
870** f -- file pointer with list of address to exclude

--- 148 unchanged lines hidden (view full) ---

1019 errstring(result));
1020 return;
1021 }
1022
1023 while ((result = cursor->smdbc_get(cursor, &db_key, &db_value,
1024 SMDB_CURSOR_GET_NEXT)) == SMDBE_OK)
1025 {
1026 /* skip magic VIT entry */
935 if ((int)db_key.data.size -1 == strlen(VIT) &&
936 strncmp((char *)db_key.data.data, VIT,
937 (int)db_key.data.size - 1) == 0)
1027 if ((int)db_key.size -1 == strlen(VIT) &&
1028 strncmp((char *)db_key.data, VIT,
1029 (int)db_key.size - 1) == 0)
938 continue;
939
940 /* skip bogus values */
1030 continue;
1031
1032 /* skip bogus values */
941 if (db_value.data.size != sizeof t)
1033 if (db_value.size != sizeof t)
942 {
943 fprintf(stderr, "vacation: %.*s invalid time stamp\n",
1034 {
1035 fprintf(stderr, "vacation: %.*s invalid time stamp\n",
944 (int) db_key.data.size,
945 (char *) db_key.data.data);
1036 (int) db_key.size, (char *) db_key.data);
946 continue;
947 }
948
1037 continue;
1038 }
1039
949 memcpy(&t, db_value.data.data, sizeof t);
1040 memcpy(&t, db_value.data, sizeof t);
950
1041
951 if (db_key.data.size > 40)
952 db_key.data.size = 40;
1042 if (db_key.size > 40)
1043 db_key.size = 40;
953
954 printf("%-40.*s %-10s",
1044
1045 printf("%-40.*s %-10s",
955 (int) db_key.data.size, (char *) db_key.data.data,
956 ctime(&t));
1046 (int) db_key.size, (char *) db_key.data, ctime(&t));
957
958 memset(&db_key, '\0', sizeof db_key);
959 memset(&db_value, '\0', sizeof db_value);
960 }
961
962 if (result != SMDBE_OK && result != SMDBE_LAST_ENTRY)
963 {
964 fprintf(stderr, "vacation: get value at cursor: %s\n",

--- 104 unchanged lines hidden ---
1047
1048 memset(&db_key, '\0', sizeof db_key);
1049 memset(&db_value, '\0', sizeof db_value);
1050 }
1051
1052 if (result != SMDBE_OK && result != SMDBE_LAST_ENTRY)
1053 {
1054 fprintf(stderr, "vacation: get value at cursor: %s\n",

--- 104 unchanged lines hidden ---