ftp.h
author Sunil Nimmagadda <sunil@nimmagadda.net>
Tue, 06 Dec 2022 13:51:55 +0000
changeset 0 1d0ce1ebbc72
permissions -rw-r--r--
An HTTP(S), FTP client. Found a copy of some old OpenBSD days hacking stashed somewhere in the backups. This version saw the light of the day as official OpenBSD ftp(1) for a grand total of 1 day :-)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     1
/*
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     2
 * Copyright (c) 2015 Sunil Nimmagadda <sunil@openbsd.org>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     3
 *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     4
 * Permission to use, copy, modify, and distribute this software for any
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     5
 * purpose with or without fee is hereby granted, provided that the above
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     6
 * copyright notice and this permission notice appear in all copies.
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     7
 *
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     8
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
     9
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    10
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    11
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    12
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    13
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    14
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    15
 */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    16
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    17
#ifndef	FTP_H
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    18
#define	FTP_H
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    19
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    20
#include <sys/types.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    21
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    22
#include <signal.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    23
#include <stdarg.h>
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    24
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    25
#define	S_HTTP	0
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    26
#define S_FTP	1
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    27
#define S_FILE	2
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    28
#define S_HTTPS	3
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    29
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    30
#define TMPBUF_LEN	131072
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    31
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    32
#define P_PRE	100
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    33
#define P_OK	200
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    34
#define P_INTER	300
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    35
#define N_TRANS	400
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    36
#define	N_PERM	500
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    37
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    38
#ifndef nitems
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    39
#define nitems(_a)	(sizeof((_a)) / sizeof((_a)[0]))
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    40
#endif /* nitems */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    41
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    42
struct url {
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    43
	int	 scheme;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    44
	int	 ip_literal;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    45
	char	*host;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    46
	char	*port;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    47
	char	*path;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    48
	char	*basic_auth;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    49
};
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    50
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    51
/* main.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    52
extern volatile sig_atomic_t interrupted;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    53
extern struct url	*ftp_proxy, *http_proxy;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    54
extern const char	*useragent;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    55
extern char		*oarg;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    56
extern int		 activemode, family, io_debug, verbose, progressmeter;
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    57
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    58
int		 fd_request(char *, int, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    59
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    60
/* cmd.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    61
void		 cmd(const char *, const char *, const char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    62
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    63
/* file.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    64
struct url	*file_get(struct url *, off_t *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    65
void		 file_save(struct url *, FILE *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    66
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    67
/* ftp.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    68
void		 ftp_connect(struct url *, int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    69
struct url	*ftp_get(struct url *, off_t *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    70
void		 ftp_close(struct url *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    71
void		 ftp_save(struct url *, FILE *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    72
int		 ftp_auth(FILE *, const char *, const char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    73
int		 ftp_command(FILE *, const char *, ...)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    74
		     __attribute__((__format__ (printf, 2, 3)))
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    75
		     __attribute__((__nonnull__ (2)));
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    76
int		 ftp_eprt(FILE *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    77
int		 ftp_epsv(FILE *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    78
int		 ftp_getline(char **, size_t *, int, FILE *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    79
int		 ftp_size(FILE *, const char *, off_t *, char **);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    80
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    81
/* http.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    82
void		 http_connect(struct url *, int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    83
struct url	*http_get(struct url *, off_t *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    84
void		 http_close(struct url *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    85
void		 http_save(struct url *, FILE *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    86
void		 https_init(char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    87
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    88
/* progressmeter.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    89
void		start_progress_meter(const char *, const char *, off_t, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    90
void		stop_progress_meter(void);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    91
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    92
/* url.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    93
int		 url_scheme_lookup(const char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    94
void		 url_connect(struct url *, int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    95
char		*url_encode(const char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    96
void		 url_free(struct url *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    97
struct url	*xurl_parse(const char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    98
struct url	*url_parse(const char *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
    99
struct url	*url_request(struct url *, off_t *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   100
void		 url_save(struct url *, FILE *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   101
void		 url_close(struct url *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   102
char		*url_str(struct url *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   103
const char	*url_scheme_str(int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   104
const char	*url_port_str(int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   105
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   106
/* util.c */
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   107
int		 connect_wait(int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   108
void		 copy_file(FILE *, FILE *, off_t *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   109
int		 tcp_connect(const char *, const char *, int);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   110
void		 log_request(const char *, struct url *, struct url *);
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   111
void		 log_info(const char *, ...)
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   112
		     __attribute__((__format__ (printf, 1, 2)))
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   113
		     __attribute__((__nonnull__ (1)));
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   114
1d0ce1ebbc72 An HTTP(S), FTP client.
Sunil Nimmagadda <sunil@nimmagadda.net>
parents:
diff changeset
   115
#endif	/* FTP_H */