]>
diplodocus.org Git - nmh/blob - uip/distsbr.c
1 /* distsbr.c -- routines to do additional "dist-style" processing
3 * This code is Copyright (c) 2002, by the authors of nmh. See the
4 * COPYRIGHT file in the root directory of the nmh distribution for
5 * complete copyright information.
12 static int hdrfd
= NOTOK
;
13 static int txtfd
= NOTOK
;
15 #define BADHDR "please re-edit %s to remove the ``%s'' header!"
16 #define BADTXT "please re-edit %s to consist of headers only!"
17 #define BADMSG "please re-edit %s to include a ``Resent-To:''!"
18 #define BADRFT "please re-edit %s and fix that header!"
23 static void ready_msg(char *);
26 distout (char *drft
, char *msgnam
, char *backup
)
30 char name
[NAMESZ
], buffer
[BUFSIZ
];
32 m_getfld_state_t gstate
= 0;
34 if (rename (drft
, strcpy (backup
, m_backup (drft
))) == NOTOK
)
35 adios (backup
, "unable to rename %s to",drft
);
36 if ((ifp
= fopen (backup
, "r")) == NULL
)
37 adios (backup
, "unable to read");
39 if ((ofp
= fopen (drft
, "w")) == NULL
)
40 adios (drft
, "unable to create temporary file");
41 chmod (drft
, m_gmprot ());
44 lseek (hdrfd
, (off_t
) 0, SEEK_SET
); /* msgnam not accurate */
45 cpydata (hdrfd
, fileno (ofp
), msgnam
, drft
);
47 for (resent
= NULL
;;) {
48 int buffersz
= sizeof buffer
;
49 switch (state
= m_getfld (&gstate
, name
, buffer
, &buffersz
, ifp
)) {
52 if (uprf (name
, "distribute-"))
53 snprintf (name
, sizeof(name
), "%s%s", "Resent", &name
[10]);
54 if (uprf (name
, "distribution-"))
55 snprintf (name
, sizeof(name
), "%s%s", "Resent", &name
[12]);
56 if (!uprf (name
, "resent")) {
57 inform(BADHDR
, "draft", name
);
61 resent
= add (":", add (name
, resent
));
62 resent
= add (buffer
, resent
);
63 fprintf (ofp
, "%s: %s", name
, buffer
);
64 while (state
== FLDPLUS
) {
65 buffersz
= sizeof buffer
;
66 state
= m_getfld (&gstate
, name
, buffer
, &buffersz
, ifp
);
67 resent
= add (buffer
, resent
);
73 for (dp
= buffer
; *dp
; dp
++)
74 if (!isspace ((unsigned char) *dp
)) {
75 inform(BADTXT
, "draft");
84 inform(BADRFT
, "draft");
88 (void) m_unlink (drft
);
89 if (rename (backup
, drft
) == NOTOK
)
90 adios (drft
, "unable to rename %s to", backup
);
94 adios (NULL
, "getfld() returned %d", state
);
98 m_getfld_state_destroy (&gstate
);
103 inform(BADMSG
, "draft");
105 (void) m_unlink (drft
);
106 if (rename (backup
, drft
) == NOTOK
)
107 adios (drft
, "unable to rename %s to", backup
);
112 if (txtfd
!= NOTOK
) {
113 lseek (txtfd
, (off_t
) 0, SEEK_SET
); /* msgnam not accurate */
114 cpydata (txtfd
, fileno (ofp
), msgnam
, drft
);
124 ready_msg (char *msgnam
)
127 char name
[NAMESZ
], buffer
[BUFSIZ
], tmpfil
[BUFSIZ
];
130 m_getfld_state_t gstate
= 0;
133 close (hdrfd
), hdrfd
= NOTOK
;
135 close (txtfd
), txtfd
= NOTOK
;
137 if ((ifp
= fopen (msgnam
, "r")) == NULL
)
138 adios (msgnam
, "unable to open message");
140 cp
= m_mktemp2(NULL
, "dist", &hdrfd
, NULL
);
142 adios(NULL
, "unable to create temporary file in %s", get_temp_dir());
144 strncpy(tmpfil
, cp
, sizeof(tmpfil
));
145 if ((out
= dup (hdrfd
)) == NOTOK
146 || (ofp
= fdopen (out
, "w")) == NULL
)
147 adios (NULL
, "no file descriptors -- you lose big");
148 (void) m_unlink (tmpfil
);
151 int buffersz
= sizeof buffer
;
152 switch (state
= m_getfld (&gstate
, name
, buffer
, &buffersz
, ifp
)) {
155 if (uprf (name
, "resent"))
156 fprintf (ofp
, "Prev-");
157 fprintf (ofp
, "%s: %s", name
, buffer
);
158 while (state
== FLDPLUS
) {
159 buffersz
= sizeof buffer
;
160 state
= m_getfld (&gstate
, name
, buffer
, &buffersz
, ifp
);
168 cp
= m_mktemp2(NULL
, "dist", &txtfd
, NULL
);
170 adios(NULL
, "unable to create temporary file in %s",
174 strncpy (tmpfil
, cp
, sizeof(tmpfil
));
175 if ((out
= dup (txtfd
)) == NOTOK
176 || (ofp
= fdopen (out
, "w")) == NULL
)
177 adios (NULL
, "no file descriptors -- you lose big");
178 (void) m_unlink (tmpfil
);
179 fprintf (ofp
, "\n%s", buffer
);
180 while (state
== BODY
) {
181 buffersz
= sizeof buffer
;
182 state
= m_getfld (&gstate
, name
, buffer
, &buffersz
, ifp
);
190 adios (NULL
, "format error in message %s", msgnam
);
193 adios (NULL
, "getfld() returned %d", state
);
197 m_getfld_state_destroy (&gstate
);