176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef BACKEND_H
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BACKEND_H
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stddef.h>
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <inttypes.h>
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdbool.h>
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <zlib.h>
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "serial.h"
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include "tftp.h"
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Backend flags */
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define BE_NEEDLEN	0x01
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct upload_backend {
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char *name;
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char *helpmsg;
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    int minargs;
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    size_t dbytes;
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    size_t zbytes;
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    const char **argv;
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    uint32_t now;
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    int (*write)(struct upload_backend *);
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    z_stream zstream;
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    char *outbuf;
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    size_t alloc;
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* zout.c */
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint init_data(struct upload_backend *be, const char *argv[]);
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint write_data(struct upload_backend *be, const void *buf, size_t len);
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint flush_data(struct upload_backend *be);
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* cpio.c */
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define cpio_init init_data
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint cpio_hdr(struct upload_backend *be, uint32_t mode, size_t datalen,
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	     const char *filename);
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint cpio_mkdir(struct upload_backend *be, const char *filename);
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint cpio_writefile(struct upload_backend *be, const char *filename,
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman		   const void *data, size_t len);
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint cpio_close(struct upload_backend *be);
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MODE_FILE	0100644
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MODE_DIR	0040755
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* backends.c */
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct upload_backend *get_upload_backend(const char *name);
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* backends */
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern struct upload_backend upload_tftp;
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern struct upload_backend upload_ymodem;
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern struct upload_backend upload_srec;
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif /* BACKEND_H */
57