/*
**  Copyright 2000-2004 University of Illinois Board of Trustees
**  Copyright 2000-2004 Mark D. Roth
**  All rights reserved.
**
**  libfget.h - header file for libfget
**
**  Mark D. Roth <roth@feep.net>
*/

#ifndef LIBFGET_H
#define LIBFGET_H

#include <netdb.h>
#include <sys/types.h>
#include <sys/param.h>
#include <fcntl.h>


#ifndef MAXUSERNAMELEN
# define MAXUSERNAMELEN		16	/* max length of user name */
#endif

#ifndef MAXGROUPNAMELEN
# define MAXGROUPNAMELEN	8	/* max length of group name */
#endif


extern const char libfget_version[];

extern const int libfget_is_thread_safe;

typedef struct ftp FTP;


/***** ftpstat.c *************************************************************/

struct ftpstat
{
	mode_t fs_mode;				/* file mode */
	nlink_t fs_nlink;			/* number of links */
	char fs_username[MAXUSERNAMELEN];	/* user name */
	char fs_groupname[MAXGROUPNAMELEN];	/* group name */
	off_t fs_size;				/* size */
	time_t fs_mtime;			/* date */
	dev_t fs_rdev;				/* device ID
						   (for char or block devs) */
};

/* stat a symlink */
int ftp_lstat(FTP *, char *, struct ftpstat *);

/* stat a file */
int ftp_stat(FTP *, char *, struct ftpstat *);

/* read the contents of a symbolic link */
int ftp_readlink(FTP *, char *, char *, size_t);

/* resolve symlinks */
int ftp_realpath(FTP *, char *, char *, size_t);


/***** options.c *************************************************************/

/* options to pass ftp_connect(), ftp_set_options(), and ftp_get_options() */
enum ftp_options {
	FTP_OPT_PASSIVE		= 1,	/* flag for using PASV mode */
	FTP_OPT_USE_MLST,		/* flag for using MLST/MLSD
					   (if supported by server) */
	FTP_OPT_USE_ABOR,		/* use ABOR command */
	FTP_OPT_IO_TIMEOUT,		/* I/O timeout */
	FTP_OPT_CACHE_MAXSIZE,		/* max size for directory cache */
	FTP_OPT_CACHE_EXPIRE,		/* expire time for directory cache */
	FTP_OPT_SEND_HOOK,		/* send hook */
	FTP_OPT_RECV_HOOK,		/* receive hook */
	FTP_OPT_HOOK_DATA		/* send & receive hook data ptr */
};

/*
** ftp_get_option() - get an option from the FTP handle
*/
void ftp_get_options(FTP *, ...);

/*
** ftp_set_option() - set an option in the FTP handle
*/
void ftp_set_options(FTP *, ...);


/***** handle.c **************************************************************/

typedef void (*ftp_hookfunc_t)(char *, FTP *, void *);

/*
** ftp_connect() - open a control connection to the FTP server
** returns:
**	0				success
**	-1 (and sets errno)		failure
*/
int ftp_connect(FTP **, char *, char *, size_t, unsigned short, ...);

/* values for ftp_connect() flags bitmask */
#define FTP_CONNECT_DNS_RR	1	/* grok round-robin DNS entries */

/*
** ftp_login() - login to the FTP server
** returns:
**	0				success
**	-1 (and sets errno)		failure
*/
int ftp_login(FTP *, char *, char *);

/*
** ftp_quit() - disconnect from FTP server
** returns:
**	0				success
**	-1 (and sets errno)		failure
*/
int ftp_quit(FTP *, unsigned short);

/* flags for ftp_quit() */
#define FTP_QUIT_FAST		1	/* close without sending "QUIT" */

/*
** ftp_fd() - return file descriptor associated with FTP control connection
** returns:
**	file descriptor of ftp control connection
*/
int ftp_fd(FTP *);

/*
** ftp_data_fd() - return file descriptor associated with FTP data connection
** returns:
**	file descriptor of ftp data connection
*/
int ftp_data_fd(FTP *);

/*
** ftp_get_host() - get the hostname from the FTP handle
*/
char *ftp_get_host(FTP *);

/*
** ftp_whoami() - get the name of the logged-in user from the FTP handle
*/
char *ftp_whoami(FTP *);


/***** ftpdata.c *************************************************************/

/* values for ftp_type() argument */
#define FTP_TYPE_ASCII			"A"	/* ASCII mode */
#define FTP_TYPE_BINARY			"I"	/* binary (image) mode */

/* set TYPE for data connection */
int ftp_type(FTP *, char *);


/***** ftpdir.c **************************************************************/

typedef struct ftpdir FTPDIR;

struct ftpdirent
{
	char *fd_name;		/* file name */
};


/* open directory */
int ftp_opendir(FTPDIR **, FTP *, char *);

/* read directory */
int ftp_readdir(FTPDIR *, struct ftpdirent *);

/* rewind directory */
void ftp_rewinddir(FTPDIR *);

/* tell where we are in the directory */
off_t ftp_telldir(FTPDIR *);

/* seek to a given point in the directory */
void ftp_seekdir(FTPDIR *, off_t);

/* close directory */
void ftp_closedir(FTPDIR *);


/***** ftpfile.c *************************************************************/

typedef struct ftpfile FTPFILE;


/* open a file via FTP */
int ftp_open(FTPFILE **, FTP *, char *, int);

/* read a file via FTP */
ssize_t ftp_read(FTPFILE *, char *, size_t);

/* write a file via FTP */
ssize_t ftp_write(FTPFILE *, char *, size_t);

/* seek to a given offset in an FTP file */
off_t ftp_lseek(FTPFILE *, off_t, int);

/* close an FTP file */
int ftp_close(FTPFILE *);


/***** ftpglob.c *************************************************************/

typedef struct
{
	int gl_pathc;		/* Count of total paths so far. */
	int gl_matchc;		/* Count of paths matching pattern. */
	int gl_offs;		/* Reserved at beginning of gl_pathv. */
	int gl_flags;		/* Copy of flags parameter to glob. */
	char **gl_pathv;	/* List of paths matching pattern. */
	int (*gl_errfunc)(const char *, int);
				/* Copy of errfunc parameter to glob. */
}
ftp_glob_t;

/* Flags */
# define FTPGLOB_APPEND	0x0001	/* Append to output from previous call. */
# define FTPGLOB_DOOFFS	0x0002	/* Use gl_offs. */
# define FTPGLOB_ERR	0x0004	/* Return on error. */
# define FTPGLOB_MARK	0x0008	/* Append / to matching directories. */
# define FTPGLOB_NOCHECK 0x0010	/* Return pattern itself if nothing matches. */
# define FTPGLOB_NOSORT	0x0020	/* Don't sort. */
# define FTPGLOB_BRACE	0x0080	/* Expand braces ala csh. */
# define FTPGLOB_MAGCHAR 0x0100	/* Pattern had globbing characters. */
# define FTPGLOB_NOMAGIC 0x0200	/* FTPGLOB_NOCHECK without magic chars (csh). */
# define FTPGLOB_NOESCAPE 0x1000	/* Disable backslash escaping. */

/* Error values returned by glob(3) */
# define FTPGLOB_NOSPACE (-1)	/* Malloc call failed. */
# define FTPGLOB_ABORTED (-2)	/* Unignored error. */
# define FTPGLOB_NOMATCH (-3)	/* No match and FTPGLOB_NOCHECK not set. */


/*
** ftp_glob() - generate pathnames of remote files matching a pattern
** returns:
**	0			success
**	FTPGLOB_NOSPACE		malloc() error
**	FTPGLOB_ABORTED		error (and sets errno)
**	FTPGLOB_NOMATCH		no match and FTPGLOB_NOCHECK not set
*/
int ftp_glob(FTP *, const char *, int,
	     int (*)(const char *, int), ftp_glob_t *);

/*
** ftp_globfree() - free memory allocated by ftp_glob()
*/
void ftp_globfree(ftp_glob_t *);


/***** ftpops.c **************************************************************/

/* rename a file */
int ftp_rename(FTP *, char *, char *);

/* remove a file */
int ftp_unlink(FTP *, char *);

/* remove a file or directory */
int ftp_remove(FTP *, char *);

/* determine the remote system type */
char *ftp_systype(FTP *);

/* get server status */
int ftp_status(FTP *, char *, size_t);

/* change directory */
int ftp_chdir(FTP *, char *);

/* make a directory */
int ftp_mkdir(FTP *, char *);

/* remove a directory */
int ftp_rmdir(FTP *, char *);

/* get current directory */
char *ftp_getcwd(FTP *);


/***** ftpsite.c *************************************************************/

/* execute a site command */
int ftp_site(FTP *, char *, ...);

/* execute a site command that opens a (pseudo)file */
int ftp_site_open(FTPFILE **, FTP *, int, char *, ...);


/***** url.c *****************************************************************/

#define MAXPASSLEN              64
#define MAXURLLEN               (MAXHOSTNAMELEN + MAXUSERNAMELEN + \
                                 MAXPASSLEN + MAXPATHLEN + 9)

struct ftp_url
{
	char fu_hostname[MAXHOSTNAMELEN];
	char fu_login[MAXUSERNAMELEN];
	char fu_passwd[MAXPASSLEN];
	char fu_path[MAXPATHLEN];
	char fu_type;
};


/* parse RFC-1738 style URL and fill in caller-supplied fields */
int ftp_url_parse(char *, struct ftp_url *);


#endif /* ! LIBFGET_H */


syntax highlighted by Code2HTML, v. 0.9.1