mirror of https://github.com/ipxe/ipxe.git
[uri] Allow tftp_uri() to construct a URI with a custom port
Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/34/head
parent
2dfdcae938
commit
e2a26f76de
|
@ -661,6 +661,7 @@ struct uri * resolve_uri ( const struct uri *base_uri,
|
||||||
* Construct TFTP URI from next-server and filename
|
* Construct TFTP URI from next-server and filename
|
||||||
*
|
*
|
||||||
* @v next_server Next-server address
|
* @v next_server Next-server address
|
||||||
|
* @v port Port number, or zero to use the default port
|
||||||
* @v filename Filename
|
* @v filename Filename
|
||||||
* @ret uri URI, or NULL on failure
|
* @ret uri URI, or NULL on failure
|
||||||
*
|
*
|
||||||
|
@ -669,12 +670,18 @@ struct uri * resolve_uri ( const struct uri *base_uri,
|
||||||
* generic URI parser. We provide a mechanism for directly
|
* generic URI parser. We provide a mechanism for directly
|
||||||
* constructing a TFTP URI from the next-server and filename.
|
* constructing a TFTP URI from the next-server and filename.
|
||||||
*/
|
*/
|
||||||
struct uri * tftp_uri ( struct in_addr next_server, const char *filename ) {
|
struct uri * tftp_uri ( struct in_addr next_server, unsigned int port,
|
||||||
|
const char *filename ) {
|
||||||
|
char buf[ 6 /* "65535" + NUL */ ];
|
||||||
struct uri uri;
|
struct uri uri;
|
||||||
|
|
||||||
memset ( &uri, 0, sizeof ( uri ) );
|
memset ( &uri, 0, sizeof ( uri ) );
|
||||||
uri.scheme = "tftp";
|
uri.scheme = "tftp";
|
||||||
uri.host = inet_ntoa ( next_server );
|
uri.host = inet_ntoa ( next_server );
|
||||||
|
if ( port ) {
|
||||||
|
snprintf ( buf, sizeof ( buf ), "%d", port );
|
||||||
|
uri.port = buf;
|
||||||
|
}
|
||||||
uri.path = filename;
|
uri.path = filename;
|
||||||
return uri_dup ( &uri );
|
return uri_dup ( &uri );
|
||||||
}
|
}
|
||||||
|
|
|
@ -203,7 +203,7 @@ extern char * resolve_path ( const char *base_path,
|
||||||
const char *relative_path );
|
const char *relative_path );
|
||||||
extern struct uri * resolve_uri ( const struct uri *base_uri,
|
extern struct uri * resolve_uri ( const struct uri *base_uri,
|
||||||
struct uri *relative_uri );
|
struct uri *relative_uri );
|
||||||
extern struct uri * tftp_uri ( struct in_addr next_server,
|
extern struct uri * tftp_uri ( struct in_addr next_server, unsigned int port,
|
||||||
const char *filename );
|
const char *filename );
|
||||||
extern void churi ( struct uri *uri );
|
extern void churi ( struct uri *uri );
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,8 @@ struct uri_resolve_test {
|
||||||
struct uri_tftp_test {
|
struct uri_tftp_test {
|
||||||
/** Next-server address */
|
/** Next-server address */
|
||||||
struct in_addr next_server;
|
struct in_addr next_server;
|
||||||
|
/** Port number */
|
||||||
|
unsigned int port;
|
||||||
/** Filename */
|
/** Filename */
|
||||||
const char *filename;
|
const char *filename;
|
||||||
/** URI */
|
/** URI */
|
||||||
|
@ -330,7 +332,7 @@ static void uri_tftp_okx ( struct uri_tftp_test *test, const char *file,
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
/* Construct URI */
|
/* Construct URI */
|
||||||
uri = tftp_uri ( test->next_server, test->filename );
|
uri = tftp_uri ( test->next_server, test->port, test->filename );
|
||||||
okx ( uri != NULL, file, line );
|
okx ( uri != NULL, file, line );
|
||||||
if ( uri ) {
|
if ( uri ) {
|
||||||
uri_okx ( uri, &test->uri, file, line );
|
uri_okx ( uri, &test->uri, file, line );
|
||||||
|
@ -674,7 +676,7 @@ static struct uri_resolve_test uri_fragment = {
|
||||||
|
|
||||||
/** TFTP URI with absolute path */
|
/** TFTP URI with absolute path */
|
||||||
static struct uri_tftp_test uri_tftp_absolute = {
|
static struct uri_tftp_test uri_tftp_absolute = {
|
||||||
{ .s_addr = htonl ( 0xc0a80002 ) /* 192.168.0.2 */ },
|
{ .s_addr = htonl ( 0xc0a80002 ) /* 192.168.0.2 */ }, 0,
|
||||||
"/absolute/path",
|
"/absolute/path",
|
||||||
{
|
{
|
||||||
.scheme = "tftp",
|
.scheme = "tftp",
|
||||||
|
@ -686,7 +688,7 @@ static struct uri_tftp_test uri_tftp_absolute = {
|
||||||
|
|
||||||
/** TFTP URI with relative path */
|
/** TFTP URI with relative path */
|
||||||
static struct uri_tftp_test uri_tftp_relative = {
|
static struct uri_tftp_test uri_tftp_relative = {
|
||||||
{ .s_addr = htonl ( 0xc0a80003 ) /* 192.168.0.3 */ },
|
{ .s_addr = htonl ( 0xc0a80003 ) /* 192.168.0.3 */ }, 0,
|
||||||
"relative/path",
|
"relative/path",
|
||||||
{
|
{
|
||||||
.scheme = "tftp",
|
.scheme = "tftp",
|
||||||
|
@ -698,7 +700,7 @@ static struct uri_tftp_test uri_tftp_relative = {
|
||||||
|
|
||||||
/** TFTP URI with path containing special characters */
|
/** TFTP URI with path containing special characters */
|
||||||
static struct uri_tftp_test uri_tftp_icky = {
|
static struct uri_tftp_test uri_tftp_icky = {
|
||||||
{ .s_addr = htonl ( 0x0a000006 ) /* 10.0.0.6 */ },
|
{ .s_addr = htonl ( 0x0a000006 ) /* 10.0.0.6 */ }, 0,
|
||||||
"C:\\tftpboot\\icky#path",
|
"C:\\tftpboot\\icky#path",
|
||||||
{
|
{
|
||||||
.scheme = "tftp",
|
.scheme = "tftp",
|
||||||
|
@ -708,6 +710,19 @@ static struct uri_tftp_test uri_tftp_icky = {
|
||||||
"tftp://10.0.0.6/C%3A\\tftpboot\\icky%23path",
|
"tftp://10.0.0.6/C%3A\\tftpboot\\icky%23path",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** TFTP URI with custom port */
|
||||||
|
static struct uri_tftp_test uri_tftp_port = {
|
||||||
|
{ .s_addr = htonl ( 0xc0a80001 ) /* 192.168.0.1 */ }, 4069,
|
||||||
|
"/another/path",
|
||||||
|
{
|
||||||
|
.scheme = "tftp",
|
||||||
|
.host = "192.168.0.1",
|
||||||
|
.port = "4069",
|
||||||
|
.path = "/another/path",
|
||||||
|
},
|
||||||
|
"tftp://192.168.0.1:4069/another/path",
|
||||||
|
};
|
||||||
|
|
||||||
/** Current working URI test */
|
/** Current working URI test */
|
||||||
static struct uri_churi_test uri_churi[] = {
|
static struct uri_churi_test uri_churi[] = {
|
||||||
{
|
{
|
||||||
|
@ -842,6 +857,7 @@ static void uri_test_exec ( void ) {
|
||||||
uri_tftp_ok ( &uri_tftp_absolute );
|
uri_tftp_ok ( &uri_tftp_absolute );
|
||||||
uri_tftp_ok ( &uri_tftp_relative );
|
uri_tftp_ok ( &uri_tftp_relative );
|
||||||
uri_tftp_ok ( &uri_tftp_icky );
|
uri_tftp_ok ( &uri_tftp_icky );
|
||||||
|
uri_tftp_ok ( &uri_tftp_port );
|
||||||
|
|
||||||
/* Current working URI tests */
|
/* Current working URI tests */
|
||||||
uri_churi_ok ( uri_churi );
|
uri_churi_ok ( uri_churi );
|
||||||
|
|
|
@ -101,7 +101,7 @@ static struct uri * parse_next_server_and_filename ( struct in_addr next_server,
|
||||||
/* Construct a TFTP URI for the filename, if applicable */
|
/* Construct a TFTP URI for the filename, if applicable */
|
||||||
if ( next_server.s_addr && filename[0] && ! uri_is_absolute ( uri ) ) {
|
if ( next_server.s_addr && filename[0] && ! uri_is_absolute ( uri ) ) {
|
||||||
uri_put ( uri );
|
uri_put ( uri );
|
||||||
uri = tftp_uri ( next_server, filename );
|
uri = tftp_uri ( next_server, 0, filename );
|
||||||
if ( ! uri )
|
if ( ! uri )
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue