9 date 95.12.07.18.59.08; author jromine; state Exp;
14 date 95.12.06.21.09.05; author jromine; state Exp;
19 date 93.08.27.23.00.00; author jromine; state Exp;
24 date 93.08.25.17.25.08; author jromine; state Exp;
29 date 92.12.15.00.20.22; author jromine; state Exp;
34 date 92.02.03.22.26.17; author jromine; state Exp;
39 date 92.01.31.22.09.37; author jromine; state Exp;
44 date 90.11.05.13.26.50; author mh; state Exp;
49 date 90.04.05.15.01.09; author sources; state Exp;
54 date 90.04.02.14.20.04; author sources; state Exp;
59 date 90.03.23.16.38.59; author sources; state Exp;
64 date 90.03.16.14.50.27; author sources; state Exp;
69 date 90.03.16.10.27.41; author sources; state Exp;
74 date 90.03.16.09.43.56; author sources; state Exp;
79 date 90.03.12.10.19.22; author sources; state Exp;
84 date 90.03.12.10.13.31; author sources; state Exp;
89 date 90.02.08.14.09.55; author sources; state Exp;
94 date 90.02.06.13.18.17; author sources; state Exp;
99 date 90.02.06.13.18.04; author sources; state Exp;
110 @64bit fix: call mbx_read with 0L not (off_t)0
113 @/* dropsbr.c - write to a mailbox */
115 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.18 1995/12/06 21:09:05 jromine Exp jromine $";
121 #include "../h/dropsbr.h"
122 #include "../zotnet/mts.h"
126 #include "mmdfonly.h"
127 #endif /* MMDFONLY */
129 #include <sys/types.h>
130 #include <sys/stat.h>
131 #if (defined(BSD42) || defined(SOCKETS)) && defined(NTOHLSWAP)
132 #include <netinet/in.h>
143 static int mbx_style = MMDF;
145 static int mbx_create(), mbx_chk(), map_open();
154 int style = mbx_style;
162 int style = mbx_style;
170 int mbx_open (file, uid, gid, mode)
179 if ((fd = mbx_Xopen (file, uid, gid, mode, &clear)) == NOTOK)
186 if (mbx_chk (fd) == NOTOK) {
193 if (lseek (fd, (off_t)0, 2) == (off_t) NOTOK) {
205 int mbx_Xopen (file, uid, gid, mode, clear)
217 for (*clear = 0, count = 4, j = 0; count > 0; count--)
218 if ((fd = lkopen (file, 6)) == NOTOK)
221 if (mbx_create (file, uid, gid, mode) == NOTOK)
238 *clear = fstat (fd, &st) != NOTOK && st.st_size == (off_t)0;
248 static int mbx_create (file, uid, gid, mode)
256 if ((fd = creat (file, 0600)) == NOTOK)
260 (void) chown (file, uid, gid);
261 (void) chmod (file, mode);
267 static int mbx_chk (fd)
273 count = strlen (mmdlm2);
275 if (lseek (fd, (off_t) (-count), 2) == (off_t) NOTOK
276 || read (fd, ldelim, count) != count)
280 if (strcmp (ldelim, mmdlm2)
281 && write (fd, "\n", 1) != 1
282 && write (fd, mmdlm2, count) != count)
290 int mbx_read (fp, pos, drops, noisy)
302 register struct drop *cp,
307 pp = (struct drop *) calloc ((unsigned) (len = MAXFOLDER), sizeof *dp);
310 admonish (NULLCP, "unable to allocate drop storage");
314 ld1 = (long) strlen (mmdlm1);
315 ld2 = (long) strlen (mmdlm2);
317 (void) fseek (fp, pos, 0);
318 for (ep = (dp = pp) + len - 1; fgets (buffer, sizeof buffer, fp);) {
320 if (strcmp (buffer, mmdlm1) == 0)
321 pos += ld1, dp -> d_start = (long) pos;
323 dp -> d_start = (long)pos , pos += (long) strlen (buffer);
324 for (bp = buffer; *bp; bp++, size++)
329 while (fgets (buffer, sizeof buffer, fp) != NULL)
330 if (strcmp (buffer, mmdlm2) == 0)
333 pos += (long) strlen (buffer);
334 for (bp = buffer; *bp; bp++, size++)
339 if (dp -> d_start != (long) pos) {
341 dp -> d_size = (long) size;
342 dp -> d_stop = (long) pos;
348 register int curlen = dp - pp;
350 cp = (struct drop *) realloc ((char *) pp,
351 (unsigned) (len += MAXFOLDER) * sizeof *pp);
354 admonish (NULLCP, "unable to allocate drop storage");
358 dp = cp + curlen, ep = (pp = cp) + len - 1;
371 int mbx_write (mailbox, md, fp, id, last, pos, stop, mapping, noisy)
390 off = (long) lseek (md, (off_t)0, 1);
392 if (write (md, mmdlm1, j) != j)
394 start = (long) lseek (md, (off_t)0, 1);
397 (void) fseek (fp, pos, 0);
398 while (fgets (buffer, sizeof buffer, fp) != NULL && pos < stop) {
400 for (j = 0; (j = stringdex (mmdlm1, buffer)) >= 0; buffer[j]++)
402 for (j = 0; (j = stringdex (mmdlm2, buffer)) >= 0; buffer[j]++)
404 if (write (md, buffer, i) != i)
408 for (cp = buffer; i-- > 0; size++)
413 stop = (long) lseek (md, (off_t)0, 1);
415 if (write (md, mmdlm2, j) != j)
418 (void) map_write (mailbox, md, id, last, start, stop, off, size, noisy);
425 int mbx_copy (mailbox, md, fd, mapping, text, noisy)
443 pos = (long) lseek (md, (off_t)0, 1);
450 if (write (md, mmdlm1, j) != j)
452 start = (long) lseek (md, (off_t)0, 1);
456 if (write (md, text, i) != i)
458 for (cp = text; *cp++; size++)
463 while ((i = read (fd, buffer, sizeof buffer)) > 0) {
465 (j = stringdex (mmdlm1, buffer)) >= 0;
469 (j = stringdex (mmdlm2, buffer)) >= 0;
472 if (write (md, buffer, i) != i)
475 for (cp = buffer; i-- > 0; size++)
480 stop = (long) lseek (md, (off_t)0, 1);
482 if (write (md, mmdlm2, j) != j)
485 (void) map_write (mailbox, md, 0, (long)0, start, stop, pos, size,
488 return (i != NOTOK ? OK : NOTOK);
490 case UUCP: /* I hate this... */
491 if ((j = dup (fd)) == NOTOK)
493 if ((fp = fdopen (j, "r")) == NULL) {
497 start = (long) lseek (md, (off_t)0, 1);
501 if (write (md, text, i) != i)
503 for (cp = text; *cp++; size++)
508 for (j = 0; fgets (buffer, sizeof buffer, fp) != NULL; j++) {
509 if (j != 0 && strncmp (buffer, "From ", 5) == 0) {
510 (void) write (md, ">", 1);
514 if (write (md, buffer, i) != i) {
519 for (cp = buffer; i-- > 0; size++)
523 if (write (md, "\n", 1) != 1) {
527 if (mapping) size += 2;
530 (void) (long) lseek (fd, (off_t)0, 2);
531 stop = (long) lseek (md, (off_t)0, 1);
533 (void) map_write (mailbox, md, 0, (long)0, start, stop, pos, size,
542 int mbx_size (md, start, stop)
552 if ((fd = dup (md)) == NOTOK || (fp = fdopen (fd, "r")) == NULL) {
558 (void) fseek (fp, start, 0);
559 for (i = 0, pos = stop - start; pos-- > 0; i++)
560 if (fgetc (fp) == '\n')
570 int mbx_close (mailbox, md)
574 (void) lkclose (md, mailbox);
581 /* This function is performed implicitly by getbbent.c:
583 bb -> bb_map = map_name (bb -> bb_file);
586 char *map_name (file)
590 static char buffer[BUFSIZ];
592 if ((cp = r1bindex (file, '/')) == file)
593 (void) sprintf (buffer, ".%s.map", cp);
595 (void) sprintf (buffer, "%.*s.%s.map", cp - file, file, cp);
602 int map_read (file, pos, drops, noisy)
613 register struct drop *mp,
616 if ((md = open (cp = map_name (file), 0)) == NOTOK
617 || map_chk (cp, md, mp = &d, pos, noisy)) {
624 dp = (struct drop *) calloc ((unsigned) (msgp + 1), sizeof *dp);
630 bcopy ((char *) mp, (char *) dp, sizeof *dp);
632 (void) lseek (md, (off_t) sizeof *mp, 0);
633 if ((i = read (md, (char *) (dp + 1), msgp * sizeof *dp)) < sizeof *dp) {
639 register struct drop *tdp;
640 for (j = 0, tdp = dp; j < i / sizeof(*dp); j++, tdp++) {
641 tdp->d_id = ntohl(tdp->d_id);
642 tdp->d_size = ntohl(tdp->d_size);
643 tdp->d_start = ntohl(tdp->d_start);
644 tdp->d_stop = ntohl(tdp->d_stop);
652 return (i / sizeof *dp);
657 int map_write (mailbox, md, id, last, start, stop, pos, size, noisy)
658 register char *mailbox;
673 register struct drop *dp;
679 if ((fd = map_open (file = map_name (mailbox), &clear, md)) == NOTOK)
682 if (!clear && map_chk (file, fd, &d1, pos, noisy)) {
683 (void) unlink (file);
684 (void) mbx_close (file, fd);
685 if ((fd = map_open (file, &clear, md)) == NOTOK)
691 if ((td = dup (md)) == NOTOK || (fp = fdopen (td, "r")) == NULL) {
693 admonish (file, "unable to %s", td != NOTOK ? "fdopen" : "dup");
696 (void) mbx_close (file, fd);
700 switch (i = mbx_read (fp, 0L, &rp, noisy)) {
703 (void) mbx_close (file, fd);
711 for (dp = rp; i-- >0; dp++) {
712 if (dp -> d_start == start)
714 (void) lseek (fd, (off_t) (++d1.d_id * sizeof *dp), 0);
715 if (write (fd, (char *) dp, sizeof *dp) != sizeof *dp) {
717 admonish (file, "write error");
718 (void) mbx_close (file, fd);
732 dp -> d_size = (long) (size ? size : mbx_size (fd, start, stop));
733 dp -> d_start = (long) start;
734 dp -> d_stop = (long) stop;
735 (void) lseek (fd, (off_t) (++d1.d_id * sizeof *dp), 0);
736 if (write (fd, (char *) dp, sizeof *dp) != sizeof *dp) {
738 admonish (file, "write error");
739 (void) mbx_close (file, fd);
745 dp -> d_size = DRVRSN;
746 dp -> d_start = (long) last;
747 dp -> d_stop = (long) lseek (md, (off_t)0, 1);
749 (void) lseek (fd, (off_t)0, 0);
750 if (write (fd, (char *) dp, sizeof *dp) != sizeof *dp) {
752 admonish (file, "write error");
753 (void) mbx_close (file, fd);
757 (void) mbx_close (file, fd);
764 static int map_open (file, clear, md)
772 mode = fstat (md, &st) != NOTOK ? (int) (st.st_mode & 0777) : m_gmprot ();
773 return mbx_Xopen (file, st.st_uid, st.st_gid, mode, clear);
778 int map_chk (file, fd, dp, pos, noisy)
782 register struct drop *dp;
787 register struct drop *dl;
789 if (read (fd, (char *) &tmpd, sizeof *dp) != sizeof *dp) {
791 admonish (NULLCP, "%s: missing or partial index", file);
796 *dp = tmpd; /* if ntohl(n)=(n), can use struct assign */
798 dp->d_id = ntohl(tmpd.d_id);
799 dp->d_size = ntohl(tmpd.d_size);
800 dp->d_start = ntohl(tmpd.d_start);
801 dp->d_stop = ntohl(tmpd.d_stop);
804 if (dp -> d_size != DRVRSN) {
806 admonish (NULLCP, "%s: version mismatch (%d != %d)", file,
811 if (dp -> d_stop != (long) pos) {
812 if (noisy && pos != (long)0)
814 "%s: pointer mismatch or incomplete index (%ld!=%ld)",
815 file, dp -> d_stop, (long) pos);
819 if ((long) ((dp -> d_id + 1) * sizeof *dp) != (long) lseek (fd, (off_t)0, 2)) {
821 admonish (NULLCP, "%s: corrupt index(1)", file);
826 count = (long) strlen (mmdlm2);
827 (void) lseek (fd, (off_t) (dp -> d_id * sizeof *dp), 0);
828 if (read (fd, (char *) dl, sizeof *dl) != sizeof *dl
829 || (ntohl(dl -> d_stop) != dp -> d_stop
830 && ntohl(dl -> d_stop) + count != dp -> d_stop)) {
832 admonish (NULLCP, "%s: corrupt index(2)", file);
848 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.17 1993/08/27 23:00:00 jromine Exp jromine $";
851 switch (i = mbx_read (fp, (off_t)0, &rp, noisy)) {
857 @don't increment tdp twice (with NTOHLSWAP)
862 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.16 1993/08/25 17:25:08 jromine Exp jromine $";
869 if ((dp = index (cp = r1bindex (file, '/'), '.')) == NULL)
870 dp = cp + strlen (cp);
872 (void) sprintf (buffer, ".%.*s%s", dp - cp, cp, ".map");
875 (void) sprintf (buffer, "%.*s.%.*s%s", cp - file, file, dp - cp,
882 @off_t fixes for BSD44
887 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.15 1992/12/15 00:20:22 jromine Exp jromine $";
900 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.14 1992/02/03 22:26:17 jromine Exp jromine $";
906 if (lseek (fd, 0L, 2) == (long) NOTOK) {
909 *clear = fstat (fd, &st) != NOTOK && st.st_size == 0L;
912 if (lseek (fd, (long) (-count), 2) == (long) NOTOK
919 pos += ld1, dp -> d_start = pos;
922 dp -> d_start = pos, pos += (long) strlen (buffer);
925 if (dp -> d_start != pos) {
935 off = lseek (md, 0L, 1);
938 start = lseek (md, 0L, 1);
941 stop = lseek (md, 0L, 1);
947 pos = lseek (md, 0L, 1);
950 start = lseek (md, 0L, 1);
953 stop = lseek (md, 0L, 1);
956 (void) map_write (mailbox, md, 0, 0L, start, stop, pos, size,
959 start = lseek (md, 0L, 1);
962 (void) lseek (fd, 0L, 2);
963 stop = lseek (md, 0L, 1);
966 (void) map_write (mailbox, md, 0, 0L, start, stop, pos, size,
969 int mbx_size (md, start, stop)
972 (void) lseek (md, (long) sizeof *mp, 0);
978 switch (i = mbx_read (fp, 0L, &rp, noisy)) {
981 (void) lseek (fd, (long) (++d1.d_id * sizeof *dp), 0);
984 dp -> d_size = size ? size : mbx_size (fd, start, stop);
985 dp -> d_start = start;
987 (void) lseek (fd, (long) (++d1.d_id * sizeof *dp), 0);
990 dp -> d_start = last;
991 dp -> d_stop = lseek (md, 0L, 1);
994 (void) lseek (fd, 0L, 0);
997 if (dp -> d_stop != pos) {
998 if (noisy && pos != 0L)
1001 file, dp -> d_stop, pos);
1004 if ((long) ((dp -> d_id + 1) * sizeof *dp) != lseek (fd, 0L, 2)) {
1007 (void) lseek (fd, (long) (dp -> d_id * sizeof *dp), 0);
1013 @writing ">" on wrong fd
1018 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.13 1992/01/31 22:09:37 jromine Exp jromine $";
1042 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.12 1990/11/05 13:26:50 mh Exp jromine $";
1045 (void) write (fd, ">", 1);
1051 @add extra \n if UUCP maildrop
1056 static char ident[] = "@@(#)$Id: dropsbr.c,v 1.11 90/04/05 15:01:09 sources Exp Locker: mh $";
1059 ldelim[count] = NULL;
1070 static char ident[] = "@@(#)$Id:$";
1086 @add NTOHL (remove NONTOHL)
1091 #if (defined(BSD42) || defined(SOCKETS)) && defined(NTOHL)
1103 @yuk. fix ntohl() stuff so it works
1108 #if (defined(BSD42) || defined(SOCKETS)) && !defined(NONTOHL)
1129 tmpdp = (struct drop *) calloc ((unsigned) msgp, sizeof *dp);
1133 for (j = 0; j < i / sizeof(*dp); j++) {
1134 tmp1dp->d_id = ntohl(tmpdp->d_id);
1135 tmp1dp->d_size = ntohl(tmpdp->d_size);
1136 tmp1dp->d_start = ntohl(tmpdp->d_start);
1137 tmp1dp->d_stop = ntohl(tmpdp->d_stop);
1144 dp->d_id = ntohl(tmpd.d_id);
1145 dp->d_size = ntohl(tmpd.d_size);
1146 dp->d_start = ntohl(tmpd.d_start);
1147 dp->d_stop = ntohl(tmpd.d_stop);
1160 #if defined(BSD42) || defined(SOCKETS)
1168 @fixup netinet/in.h include to be under BSD42
1178 @include <netinet/in.h> for ntohl macros
1188 @fixes for byteswapped map files
1217 if (read (fd, (char *) dp, sizeof *dp) != sizeof *dp) {
1220 admonish (NULLCP, "%s: version mismatch", file);
1223 || (dl -> d_stop != dp -> d_stop
1224 && dl -> d_stop + count != dp -> d_stop)) {