ssize_t send_recv(struct stlink_libusb* handle, int terminate, unsigned char* txbuf, size_t txsize, unsigned char* rxbuf, size_t rxsize) { /* note: txbuf and rxbuf can point to the same area */ int res = 0; libusb_fill_bulk_transfer(handle->req_trans, handle->usb_handle, handle->ep_req, txbuf, txsize, NULL, NULL, 0 ); if (submit_wait(handle, handle->req_trans)) return -1; /* send_only */ if (rxsize != 0) { /* read the response */ libusb_fill_bulk_transfer(handle->rep_trans, handle->usb_handle, handle->ep_rep, rxbuf, rxsize, NULL, NULL, 0); if (submit_wait(handle, handle->rep_trans)) return -1; res = handle->rep_trans->actual_length; } if ((handle->protocoll == 1) && terminate) { fprintf(stderr, "This is never used....\n"); exit(EXIT_FAILURE); /* Read the SG reply */ unsigned char sg_buf[13]; libusb_fill_bulk_transfer (handle->rep_trans, handle->usb_handle, handle->ep_rep, sg_buf, 13, NULL, NULL, 0); res = submit_wait(handle, handle->rep_trans); /* The STLink doesn't seem to evaluate the sequence number */ handle->sg_transfer_idx++; if (res ) return -1; } return handle->rep_trans->actual_length; }
int main(int argc, char **argv) { const char *from=0; const char *From=0; const char *ret=0, *dsn=0, *security=0, *envid=0; int argn, argp; int errflag=0; int c; char *args[6]; char *envs[7]; int envp; int tostdout=0; char frombuf[NUMBUFSIZE+30]; int doverp=0; int bcconly=0; char ubuf[NUMBUFSIZE]; char *uucprmail=0; char *s; char ret_buf[2], security_buf[40]; int submit_errcode; /* ** Immediately drop uid, force GID to MAILGID ** The reason we can't just setgid ourselves to MAILGID is because ** that only sets the effective uid. We need to also set both ** real and effective GIDs, otherwise maildrop filtering will fail, ** because the real gid won't be trusted. */ setgid(MAILGID); setuid(getuid()); signal(SIGCHLD, SIG_DFL); signal(SIGPIPE, SIG_IGN); argn=1; putenv("AUTHMODULES="); /* See module.local/local.c */ putenv("LANG=en_US"); putenv("CHARSET=iso-8859-1"); putenv("MM_CHARSET=iso-8859-1"); #if HAVE_SETLOCALE setlocale(LC_ALL, "C"); #endif /* Only uucp can run rmail (this better be installed setgid) */ if ((s=strrchr(argv[0], '/')) != 0) ++s; else s=argv[0]; if (strcmp(s, "rmail") == 0) { struct passwd *p=mypwd(); char *uu_machine, *uu_user; if (!p || strcmp(p->pw_name, "uucp")) { fprintf(stderr, "rmail: permission denied.\n"); exit(EX_NOPERM); } uu_machine=getenv("UU_MACHINE"); uu_user=getenv("UU_USER"); if (!uu_machine || !uu_user) { fprintf(stderr, "rmail: UU_MACHINE!UU_USER required.\n"); exit(EX_NOPERM); } uucprmail=malloc(strlen(uu_machine)+strlen(uu_user)+2); if (!uucprmail) { perror("malloc"); exit(EX_TEMPFAIL); } strcat(strcat(strcpy(uucprmail, uu_machine), "!"), uu_user); } while (argn < argc) { const char *arg; int c; if (argv[argn][0] != '-') break; if (strcmp(argv[argn], "-") == 0) { ++argn; break; } if (uucprmail && strncmp(argv[argn], "-f", 2) /* ** Ok, obviously no UUCP version will give me the following ** options, must I can hope, can't I? */ && strcmp(argv[argn], "-verp") && strncmp(argv[argn], "-N", 2) && strncmp(argv[argn], "-R", 2) && strncmp(argv[argn], "-V", 2) /* Ignore the ignorable */ && strncmp(argv[argn], "-o", 2) && strncmp(argv[argn], "-t", 2) ) { fprintf(stderr, "rmail: invalid option %s\n", argv[argn]); exit(EX_NOPERM); } if (strcmp(argv[argn], "-verp") == 0) { doverp=1; ++argn; continue; } if (strcmp(argv[argn], "-bcc") == 0) { bcconly=1; ++argn; continue; } if (strcmp(argv[argn], "-bs") == 0) { esmtpd(); } switch (c=argv[argn][1]) { case 'o': case 'f': case 'F': case 'R': case 'N': case 'S': case 'V': break; case 'n': tostdout=1; ++argn; continue; default: ++argn; continue; } arg=argv[argn]+2; if (!*arg && argn+1 < argc) arg=argv[++argn]; ++argn; if (c == 'f') from=arg; else if (c == 'F') From=arg; else if (c == 'N') dsn=arg; else if (c == 'S') { char *q; if (strcasecmp(arg, "NONE") && strcasecmp(arg, "STARTTLS")) { fprintf(stderr, "sendmail: invalid option" " -S %s\n", arg); exit(EX_NOPERM); } strcpy(security_buf, arg); for (q=security_buf; *q; q++) *q=toupper((int)(unsigned char)*q); security=security_buf; } else if (c == 'R') { ret_buf[0]= toupper((int)(unsigned char)*arg); ret_buf[1]= 0; ret=ret_buf; } else if (c == 'V') envid=arg; } sprintf(frombuf, "uid %s", libmail_str_uid_t(getuid(), ubuf)); argp=0; args[argp++]="submit"; if (bcconly) args[argp++]="-bcc"; if (uucprmail) { if (argn >= argc) { fprintf(stderr, "rmail: missing recipients\n"); exit(EX_NOPERM); } args[argp++]="uucp"; s=malloc(sizeof("unknown; uucp ()")+strlen(uucprmail)); if (!s) { perror("malloc"); exit(EX_TEMPFAIL); } strcat(strcat(strcpy(s, "unknown; uucp ("), uucprmail), ")"); args[argp++]=s; } else { args[argp++]="local"; args[argp++]="dns; localhost (localhost [127.0.0.1])"; args[argp++]=frombuf; } args[argp++]=0; envp=0; clog_open_stderr("sendmail"); if (ret || security || doverp) { envs[envp]=strcat(strcat(strcpy(courier_malloc(strlen(ret ? ret:"")+strlen(security ? security:"") + 30), "DSNRET="), (ret ? ret:"")), (doverp ? "V":"")); if (security) strcat(strcat(strcat(envs[envp], "S{"), security), "}"); ++envp; } if (dsn) { envs[envp]=strcat(strcpy(courier_malloc(strlen(dsn)+11), "DSNNOTIFY="), dsn); ++envp; } if (envid) { envs[envp]=strcat(strcpy(courier_malloc(strlen(envid)+10), "DSNENVID="), envid); ++envp; } envs[envp++]="TCPREMOTEHOST=localhost"; envs[envp++]="TCPREMOTEIP=127.0.0.1"; if (!uucprmail) envs[envp++]=strcat(strcpy(courier_malloc(strlen(frombuf)+ sizeof("TCPREMOTEINFO=")), "TCPREMOTEINFO="), frombuf); envs[envp]=0; if (!tostdout && submit_fork(args, envs, submit_print_stdout)) { fprintf(stderr, "sendmail: Service temporarily unavailable.\n"); exit(EX_TEMPFAIL); } if (tostdout) submit_to=stdout; else { if (uucprmail) { submit_write_message(from ? from:""); } else { char *p; p=rewrite_env_sender(from); submit_write_message(p); free(p); } if ((submit_errcode=submit_readrcprinterr()) != 0) { exit_submit(submit_errcode); } } while (!tostdout && argn < argc) { submit_write_message(argv[argn]); if ((errflag=submit_readrcprinterr()) != 0) { fprintf(stderr, "%s: invalid address.\n", argv[argn]); } ++argn; } if (errflag) exit_submit(errflag); if (!tostdout) putc('\n', submit_to); if (!uucprmail) rewrite_headers(From); while ((c=getchar()) != EOF) { putc(c, submit_to); } fflush(submit_to); signal(SIGINT, SIG_IGN); signal(SIGTERM, SIG_IGN); signal(SIGHUP, SIG_IGN); errflag=0; if (ferror(submit_to) || (!tostdout && ( fclose(submit_to) || (errflag=submit_readrcprinterr()) || submit_wait())) ) { fprintf(stderr, "sendmail: Unable to submit message.\n"); if (errflag) exit_submit(errflag); exit(EX_TEMPFAIL); } exit(0); }
static void wait_delivery(pid_t pid, struct ctlfile *ctf, unsigned rcptnum, int msgpipe, int fwdpipe, const char *user, const char *ext) { fd_set fds; int maxfd= msgpipe > fwdpipe ? msgpipe:fwdpipe; char buf[BUFSIZ]; int waitstat; char *sender=verp_getsender(ctf, ctf->receipients[rcptnum]); const char *oreceipient; char *oreceipients=0; if ( ctf->oreceipients[rcptnum] == 0 || ctf->oreceipients[rcptnum][0]) { oreceipient=ctf->oreceipients[rcptnum]; } else { oreceipient=oreceipients=dsnencodeorigaddr( ctf->receipients[rcptnum]); } ++maxfd; msglen=0; fwdlen=0; while (msgpipe >= 0 && fwdpipe >= 0) { int l; FD_ZERO(&fds); if (msgpipe >= 0) FD_SET(msgpipe, &fds); if (fwdpipe >= 0) FD_SET(fwdpipe, &fds); if (select(maxfd, &fds, 0, 0, 0) < 0) { clog_msg_prerrno(); continue; } if (msgpipe >= 0 && FD_ISSET(msgpipe, &fds)) { if ( (l=read(msgpipe, buf, sizeof(buf))) <= 0) { close(msgpipe); msgpipe=-1; } else savemsg(buf, l); } if (fwdpipe >= 0 && FD_ISSET(fwdpipe, &fds)) { if ( (l=read(fwdpipe, buf, sizeof(buf))) <= 0) { close(fwdpipe); fwdpipe=-1; } else fwdmsg(buf, l, sender, ctf->receipients[rcptnum], oreceipient); } } free(sender); while ( wait(&waitstat) != pid) ; if (msglen) { char *p, *q; msgbuf[msglen]=0; for (p=msgbuf; *p; ) { for (q=p; *q; ) { if (*q == '\n') { *q++=0; break; } q++; } ctlfile_append_info(ctf, rcptnum, p); p=q; } } if (submit_started && !submit_err) { FILE *f=fopen(qmsgsdatname(ctf->n), "r"); if (!f) submit_err=1; else { int c; fprintf(submit_to, "\nDelivered-To: %s\n", ctf->receipients[rcptnum]); while ((c=getc(f)) != EOF) putc(c, submit_to); if (ferror(f) || fflush(submit_to) || fclose(submit_to)) { submit_cancel(); submit_err=1; } else if (submit_readrcprinterr()) { submit_wait(); submit_err=1; } else if (submit_wait()) submit_err=1; } } if (WIFEXITED(waitstat)) switch (WEXITSTATUS(waitstat)) { case 0: case 99: if (submit_err) { ctlfile_append_reply(ctf, rcptnum, errbuf, COMCTLFILE_DELFAIL, 0); } else { ctlfile_append_reply(ctf, rcptnum, "Message delivered.", COMCTLFILE_DELSUCCESS, " l"); } if (oreceipients) free (oreceipients); return; case EX_SOFTWARE: ctlfile_append_reply(ctf, rcptnum, "", COMCTLFILE_DELFAIL_NOTRACK, 0); if (oreceipients) free (oreceipients); return; case 64: case 65: case 67: case 68: case 69: case 76: case 77: case 78: case 100: case 112: break; default: ctlfile_append_reply(ctf, rcptnum, "", COMCTLFILE_DELDEFERRED, 0); if (oreceipients) free (oreceipients); return; } ctlfile_append_reply(ctf, rcptnum, "", COMCTLFILE_DELFAIL, 0); if (oreceipients) free (oreceipients); }