예제 #1
0
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;
}
예제 #2
0
파일: sendmail.c 프로젝트: MhdAlyan/courier
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);
}
예제 #3
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);
}