/* * 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); }
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); }
/* * 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); } }