+ if (case_startb(line.s,line.len,"Content-type: multipart/report"))
+ if (!stralloc_copyb(&dsnline,line.s,line.len - 1)) die_nomem();
+ flagdsn = 1;
+ } /* end of header */
+
+ if (flagdsn) { /* always only one recipient/action */
+ flagdsn = 0; /* will be set for correct report type */
+ for (i=0; i < dsnline.len; i += 1+byte_chr(dsnline.s+i,dsnline.len-i,';')) {
+ while (dsnline.s[i] == ' ' || dsnline.s[i] == '\t')
+ if (++i >= dsnline.len) break;
+ if (case_startb(dsnline.s + i,dsnline.len - i,"report-type=")) {
+ i += 12;
+ while (dsnline.s[i] ==' ' || dsnline.s[i] =='\t' || dsnline.s[i] =='"')
+ if (++i >= dsnline.len) break;
+ if (case_startb(dsnline.s + i,dsnline.len - i,"delivery-status"))
+ flagdsn = 1;
+ } else if (case_startb(dsnline.s + i,dsnline.len - i,"boundary=")) {
+ i += 9;
+ while (dsnline.s[i] ==' ' || dsnline.s[i] =='\t')
+ if (++i >= dsnline.len) break;
+ if (dsnline.s[i] == '"') {
+ if (++i >= dsnline.len) break;
+ j = i + byte_chr(dsnline.s + i,dsnline.len - i,'"');
+ if (j >= dsnline.len) break;
+ } else {
+ j = i;
+ while (dsnline.s[j] !=' ' && dsnline.s[j] !='\t' &&
+ dsnline.s[j] !=';')
+ if (++j >= dsnline.len) break;
+ } /* got boundary */
+ if (!stralloc_copyb(&boundary,dsnline.s+i,j-i)) die_nomem();
+ }
+ }
+ }
+ if (flagdsn && boundary.len) { /* parse DSN message */
+ get(&line); /* if bad format we exit(0) via get() */
+ for (;;) {
+ if (isboundary()) {
+ if (line.len == boundary.len + 5 && line.s[line.len - 1] == '-'
+ && line.s[line.len - 2] == '-')
+ _exit(99); /* end: not failure report */
+ get(&line); /* Content-type */
+ if (case_startb(line.s,line.len,"content-type:")) {
+ i = 13;
+ while (line.s[i] == ' ' || line.s[i] == '\t')
+ if (++i >= line.len) break;
+ if (case_startb(line.s+i,line.len-i,"message/delivery-status")) {
+ for (;;) {
+ get(&line);
+ if (isboundary()) break;
+ if (case_startb(line.s,line.len,"action:")) {
+ i = 8;
+ while (line.s[i] == ' ' || line.s[i] == '\t')
+ if (++i >= line.len) break;
+ if (case_startb(line.s + i, line.len - i,"failed"))
+ _exit(0); /* failure notice */
+ else
+ _exit(99); /* there shouldn't be more than 1 action */
+ }
+ }
+ }
+ }
+ } else
+ get(&line);
+ }