summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--com32/libupload/tftp.h12
-rw-r--r--com32/libupload/upload_tftp.c78
-rw-r--r--core/fs/pxe/tftp.h4
3 files changed, 77 insertions, 17 deletions
diff --git a/com32/libupload/tftp.h b/com32/libupload/tftp.h
index 323dc16a..209d9751 100644
--- a/com32/libupload/tftp.h
+++ b/com32/libupload/tftp.h
@@ -2,7 +2,8 @@
#ifndef UPLOAD_TFTP
#define UPLOAD_TFTP
-/* TFTP Error codes */
+
+/* TFTP Error codes in host byte order */
enum tftp_error_codes {
TFTP_ERR_UNKNOWN_ERROR = 0, // We have to use the message from the server
TFTP_ERR_FILE_NOT_FOUND = 1, /**< File not found */
@@ -13,9 +14,12 @@ TFTP_ERR_UNKNOWN_TID = 5, /**< Unknown transfer ID */
TFTP_ERR_FILE_EXISTS = 6, /**< File already exists */
TFTP_ERR_UNKNOWN_USER = 7, /**< No such user */
TFTP_ERR_BAD_OPTS = 8, /**< Option negotiation failed */
-TFTP_ERR_UNABLE_TO_RESOLVE = 9, // Not in RFC, internal usage
-TFTP_ERR_UNABLE_TO_CONNECT = 10, // Not in RFC, internal usage
-TFTP_OK = 11, /* Not in RFC */
+
+/* The following are not defined in RFC, for internal usage only */
+TFTP_ERR_UNABLE_TO_RESOLVE = 9,
+TFTP_ERR_UNABLE_TO_CONNECT = 10,
+TFTP_ERR_OK = 11,
+TFTP_ERR_NO_NETWORK = 12,
};
extern const char *tftp_string_error_message[];
diff --git a/com32/libupload/upload_tftp.c b/com32/libupload/upload_tftp.c
index 387113ba..80fe0bfb 100644
--- a/com32/libupload/upload_tftp.c
+++ b/com32/libupload/upload_tftp.c
@@ -10,23 +10,29 @@
#include <sys/times.h>
#include <fs/pxe/pxe.h>
#include <fs/pxe/url.h>
+#include <fs/pxe/tftp.h>
#include "upload_backend.h"
const char *tftp_string_error_message[]={
-"Unknown error",
-"File not found",
-"Access Denied",
-"Disk Full",
-"Illegal Operation",
-"Unknown Transfert ID",
-"File already exists",
-"Unknown User",
-"Negociation failed",
-"Unable to resolve hostname", // not in RFC
-"Unable to connect", // not in RFC
-"No Error",
+ "Unknown error",
+ "File not found",
+ "Access Denied",
+ "Disk Full",
+ "Illegal Operation",
+ "Unknown Transfer ID",
+ "File already exists",
+ "Unknown User",
+ "Negotiation failed",
+
+ /* These are not in any RFC, defined internally */
+ "Unable to resolve hostname",
+ "Unable to connect",
+ "No Error",
+ "Network unavailable",
};
+static bool have_real_network(void);
+
static int upload_tftp_write(struct upload_backend *be) {
const union syslinux_derivative_info *sdi =
syslinux_derivative_info();
@@ -36,6 +42,11 @@ static int upload_tftp_write(struct upload_backend *be) {
uint32_t ip;
int err;
+ if (!have_real_network()) {
+ dprintf("\nNot running from the network\n");
+ return -TFTP_ERR_NO_NETWORK;
+ }
+
if (be->argv[1]) {
ip = pxe_dns(be->argv[1]);
if (!ip) {
@@ -75,3 +86,46 @@ struct upload_backend upload_tftp = {
.minargs = 1,
.write = upload_tftp_write,
};
+
+/*
+ * Dummy functions to prevent link failure for non-network cores
+ */
+static int _dummy_tftp_put(struct url_info *url, int flags,
+ struct inode *inode, const char **redir,
+ char *data, int data_length)
+{
+ (void)url;
+ (void)flags;
+ (void)inode;
+ (void)redir;
+ (void)data;
+ (void)data_length;
+
+ return -TFTP_ERR_NO_NETWORK;
+}
+
+__weak int __attribute__((alias("_dummy_tftp_put")))
+tftp_put(struct url_info *url, int flags, struct inode *inode,
+ const char **redir, char *data, int data_length);
+
+static int _dummy_tftp_put(struct url_info *url, int flags,
+ struct inode *inode, const char **redir,
+ char *data, int data_length);
+
+static bool have_real_network(void)
+{
+ return tftp_put != _dummy_tftp_put;
+}
+
+__weak uint32_t dns_resolv(const char *host)
+{
+ (void)host;
+
+ return 0;
+}
+
+__weak void parse_url(struct url_info *ui, char *url)
+{
+ (void)ui;
+ (void)url;
+}
diff --git a/core/fs/pxe/tftp.h b/core/fs/pxe/tftp.h
index 8802914e..82ef64a5 100644
--- a/core/fs/pxe/tftp.h
+++ b/core/fs/pxe/tftp.h
@@ -53,6 +53,7 @@
#define TFTP_ERESOLVE htons(9) // Not in RFC, internal usage
#define TFTP_ECONNECT htons(10) // Not in RFC, internal usage
#define TFTP_OK htons(11) // Not in RFC, internal usage
+#define TFTP_NONETWORK htons(12) // Not in RFC, internal usage
struct tftp_error {
uint16_t opcode;
@@ -61,5 +62,6 @@ struct tftp_error {
} __attribute__ (( packed ));
int tftp_put(struct url_info *url, int flags, struct inode *inode,
- const char **redir, char *data, int data_length);
+ const char **redir, char *data, int data_length);
+
#endif /* PXE_TFTP_H */