X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/6294d633e80db8e89697db796e6f6025d5af0cae..ad7871609881e73855d0b04da49b486cd93efca7:/usr/src/libexec/ftpd/ftpd.c diff --git a/usr/src/libexec/ftpd/ftpd.c b/usr/src/libexec/ftpd/ftpd.c index 7aaec859c1..30c26ca8b9 100644 --- a/usr/src/libexec/ftpd/ftpd.c +++ b/usr/src/libexec/ftpd/ftpd.c @@ -2,7 +2,33 @@ * Copyright (c) 1985, 1988, 1990, 1992, 1993 * The Regents of the University of California. All rights reserved. * - * %sccs.include.redist.c% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. */ #ifndef lint @@ -12,7 +38,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)ftpd.c 8.1 (Berkeley) %G%"; +static char sccsid[] = "@(#)ftpd.c 8.1 (Berkeley) 6/4/93"; #endif /* not lint */ /* @@ -59,6 +85,7 @@ static char sccsid[] = "@(#)ftpd.c 8.1 (Berkeley) %G%"; extern off_t restart_point; extern char *home; /* pointer to home directory for glob */ extern char cbuf[]; +extern char version[]; struct sockaddr_in ctrl_addr; struct sockaddr_in data_source; @@ -637,6 +664,25 @@ retrieve(cmd, name) reply(550, "%s: not a plain file.", name); goto done; } + if (restart_point) { + if (type == TYPE_A) { + register int i, n, c; + + n = restart_point; + i = 0; + while (i++ < n) { + if ((c=getc(fin)) == EOF) { + perror_reply(550, name); + goto done; + } + if (c == '\n') + i++; + } + } else if (lseek(fileno(fin), restart_point, L_SET) < 0) { + perror_reply(550, name); + goto done; + } + } dout = dataconn(name, st.st_size, "w"); if (dout == NULL) goto done; @@ -665,6 +711,8 @@ store(name, mode, unique) return; } + if (restart_point) + mode = "r+w"; fout = fopen(name, mode); closefunc = fclose; if (fout == NULL) { @@ -672,6 +720,35 @@ store(name, mode, unique) LOGCMD(*mode == 'w' ? "put" : "append", name); return; } + byte_count = -1; + if (restart_point) { + if (type == TYPE_A) { + register int i, n, c; + + n = restart_point; + i = 0; + while (i++ < n) { + if ((c=getc(fout)) == EOF) { + perror_reply(550, name); + goto done; + } + if (c == '\n') + i++; + } + /* + * We must do this seek to "current" position + * because we are changing from reading to + * writing. + */ + if (fseek(fout, 0L, L_INCR) < 0) { + perror_reply(550, name); + goto done; + } + } else if (lseek(fileno(fout), restart_point, L_SET) < 0) { + perror_reply(550, name); + goto done; + } + } din = dataconn(name, (off_t)-1, "r"); if (din == NULL) goto done;