コード例 #1
0
ファイル: tftpd.c プロジェクト: FreeBSDFoundation/freebsd
/*
 * WRQ - receive a file from the client
 */
void
tftp_wrq(int peer, char *recvbuffer, ssize_t size)
{
	char *cp;
	int has_options = 0, ecode;
	char *filename, *mode;
	char fnbuf[PATH_MAX];

	cp = parse_header(peer, recvbuffer, size, &filename, &mode);
	size -= (cp - recvbuffer) + 1;

	strlcpy(fnbuf, filename, sizeof(fnbuf));
	reduce_path(fnbuf);
	filename = fnbuf;

	if (size > 0) {
		if (options_rfc_enabled)
			has_options = !parse_options(peer, cp, size);
		else
			tftp_log(LOG_INFO, "Options found but not enabled");
	}

	ecode = validate_access(peer, &filename, WRQ);
	if (ecode == 0) {
		if (has_options)
			send_oack(peer);
		else
			send_ack(peer, 0);
	}
	if (logging) {
		tftp_log(LOG_INFO, "%s: write request for %s: %s", peername,
			    filename, errtomsg(ecode));
	}

	if (ecode) {
		send_error(peer, ecode);
		exit(1);
	}
	tftp_recvfile(peer, mode);
	exit(0);
}
コード例 #2
0
ファイル: tftpc.c プロジェクト: MagicGroup/magicinstaller2
static PyObject * tftpc_get(PyTFtpClientObject *obj, PyObject *args) {
    int    localfd;
    int    amount;
    char  *remote_file = NULL;
    char  *local_file = NULL;
    if (!PyArg_ParseTuple(args, "s|s:get", &remote_file, &local_file))
	return NULL;
    if (!obj->connected) {
	PyErr_SetString(PyExc_Connect, "Not connected yet.");
	return NULL;
    }
    if (local_file == NULL)  local_file = remote_file;
    localfd = open(local_file, O_WRONLY|O_CREAT|O_TRUNC, 0666);
    if (localfd < 0) {
	PyErr_SetFromErrno(PyExc_IOError);
	return NULL;
    }
    obj->peeraddr.sin_port = obj->port;
    amount = tftp_recvfile(obj->socketfd, &(obj->peeraddr),
			   localfd, remote_file,
			   obj->mode ? "netascii" : "octet");
    return Py_BuildValue("i", amount);
}
コード例 #3
0
ファイル: main.c プロジェクト: 274914765/C
/*
 * Receive file(s).
 */
void get (int argc, char *argv[])
{
    int fd;

    int n;

    char *cp;

    char *src;

    if (argc < 2)
    {
        getmoreargs ("get ", "(files) ");
        makeargv ();
        argc = margc;
        argv = margv;
    }
    if (argc < 2)
    {
        getusage (argv[0]);
        return;
    }
    if (!connected)
    {
        for (n = 1; n < argc; n++)
            if (strchr (argv[n], ':') == 0)
            {
                getusage (argv[0]);
                return;
            }
    }
    for (n = 1; n < argc; n++)
    {
        src = strchr (argv[n], ':');
        if (src == NULL)
            src = argv[n];
        else
        {
            struct hostent *hp;

            *src++ = 0;
            hp = gethostbyname (argv[n]);
            if (hp == NULL)
            {
                fprintf (stderr, "tftp: %s: ", argv[n]);
                herror ((char *) NULL);
                continue;
            }
            bcopy (hp->h_addr, (caddr_t) & peeraddr.sin_addr, hp->h_length);
            peeraddr.sin_family = hp->h_addrtype;
            connected = 1;
            hostname = xstrdup (hp->h_name);
        }
        if (argc < 4)
        {
            cp = argc == 3 ? argv[2] : tail (src);
            fd = open (cp, O_WRONLY | O_CREAT | O_TRUNC | mode->m_openflags, 0666);
            if (fd < 0)
            {
                fprintf (stderr, "tftp: ");
                perror (cp);
                return;
            }
            if (verbose)
                printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode->m_mode);
            peeraddr.sin_port = port;
            tftp_recvfile (fd, src, mode->m_mode);
            break;
        }
        cp = tail (src);        /* new .. jdg */
        fd = open (cp, O_WRONLY | O_CREAT | O_TRUNC | mode->m_openflags, 0666);
        if (fd < 0)
        {
            fprintf (stderr, "tftp: ");
            perror (cp);
            continue;
        }
        if (verbose)
            printf ("getting from %s:%s to %s [%s]\n", hostname, src, cp, mode->m_mode);
        peeraddr.sin_port = port;
        tftp_recvfile (fd, src, mode->m_mode);
    }
}