Skip to content

Commit

Permalink
libupload: use url_set_ip()
Browse files Browse the repository at this point in the history
We already have a core function for setting the IP address of an URL
object based on network lookup or the server default.  Export and use
it instead of open-coding the equivalent logic in upload_tftp.c.

Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
  • Loading branch information
H. Peter Anvin committed Apr 6, 2016
1 parent edb6d3e commit b61bdc9
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 36 deletions.
50 changes: 18 additions & 32 deletions com32/libupload/upload_tftp.c
Expand Up @@ -34,50 +34,36 @@ const char *tftp_string_error_message[]={
static bool have_real_network(void);

static int upload_tftp_write(struct upload_backend *be) {
const union syslinux_derivative_info *sdi =
syslinux_derivative_info();
struct url_info url;
struct inode inode;
char url_path[255] = {0};
uint32_t ip;
char url_path[255];
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) {
dprintf("\nUnable to resolve hostname: %s\n", be->argv[1]);
return -TFTP_ERR_UNABLE_TO_RESOLVE;
}
} else {
ip = sdi->pxe.ipinfo->serverip;
if (!ip) {
dprintf("\nNo server IP address\n");
return -TFTP_ERR_UNABLE_TO_CONNECT;
}
}

snprintf(url_path, sizeof(url_path), "tftp://%u.%u.%u.%u/%s",
((uint8_t *)&ip)[0],
((uint8_t *)&ip)[1],
((uint8_t *)&ip)[2],
((uint8_t *)&ip)[3],
be->argv[0]);
if (!strncmp(be->argv[0], "tftp://", 7))
strlcpy(url_path, be->argv[0], sizeof(url_path));
else
snprintf(url_path, sizeof(url_path), "tftp://%s/%s",
be->argv[1] ? be->argv[1] : "", be->argv[0]);

parse_url(&url, url_path);
url.ip = ip;
err = -url_set_ip(&url);
if (err != TFTP_OK)
return err;

dprintf("Connecting to %s to send %s\n", url.host, url.path);
err = tftp_put(&url, 0, &inode, NULL, be->outbuf, be->zbytes);
err = -tftp_put(&url, 0, &inode, NULL, be->outbuf, be->zbytes);

if (-err != TFTP_OK)
printf("upload_tftp_write: TFTP server returned error %d : %s\n", err, tftp_string_error_message[-err]);
if (err != TFTP_OK) {
printf("upload_tftp_write: TFTP server returned error %d : %s\n",
err, tftp_string_error_message[err]);
}

return -err;
return err;
}

struct upload_backend upload_tftp = {
Expand Down Expand Up @@ -117,11 +103,11 @@ static bool have_real_network(void)
return tftp_put != _dummy_tftp_put;
}

__weak uint32_t pxe_dns(const char *host)
__weak int url_set_ip(struct url_info *ui)
{
(void)host;
(void)ui;

return 0;
return -TFTP_ERR_NO_NETWORK;
}

__weak void parse_url(struct url_info *ui, char *url)
Expand Down
18 changes: 15 additions & 3 deletions core/fs/pxe/pxe.c
Expand Up @@ -237,13 +237,25 @@ static uint32_t pxe_getfssec(struct file *file, char *buf,
/*
* Assign an IP address to a URL
*/
static void url_set_ip(struct url_info *url)
__export int url_set_ip(struct url_info *url)
{
int err = -ntohs(TFTP_OK);

url->ip = 0;
if (url->host)
if (url->host && url->host[0]) {
url->ip = pxe_dns(url->host);
if (!url->ip)
if (!url->ip)
err = -ntohs(TFTP_ERESOLVE);
}

/* Note: default to the server IP on resolve failure */
if (!url->ip) {
url->ip = IPInfo.serverip;
if (!url->ip)
err = -ntohs(TFTP_NONETWORK);
}make

return err;
}

/**
Expand Down
3 changes: 2 additions & 1 deletion core/fs/pxe/url.h
Expand Up @@ -19,7 +19,7 @@ struct url_info {
char *user;
char *passwd;
char *host;
uint32_t ip; /* Placeholder field not set by parse_url() */
uint32_t ip; /* Not set by parse_url(), use url_set_ip() */
unsigned int port;
char *path; /* Includes query */
enum url_type type;
Expand All @@ -29,5 +29,6 @@ enum url_type url_type(const char *url);
void parse_url(struct url_info *ui, char *url);
size_t url_escape_unsafe(char *output, const char *input, size_t bufsize);
char *url_unescape(char *buffer, char terminator);
int url_set_ip(struct url_info *ui);

#endif /* CORE_PXE_URL_H */

0 comments on commit b61bdc9

Please sign in to comment.