From 9817f9309496e7620dd87610c9d0bef8d840ccee Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Fri, 12 Jan 2007 06:05:27 +0000 Subject: Add basic "fetch" and "imgstat" commands. --- src/usr/fetch.c | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/usr/imgmgmt.c | 45 +++++++++++++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 src/usr/fetch.c create mode 100644 src/usr/imgmgmt.c (limited to 'src/usr') diff --git a/src/usr/fetch.c b/src/usr/fetch.c new file mode 100644 index 000000000..f7f3a771e --- /dev/null +++ b/src/usr/fetch.c @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2007 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +/** + * @file + * + * Fetch file as executable/loadable image + * + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +/** + * Fetch file as executable/loadable image + * + * @v image Executable/loadable image + * @v filename Filename + * @ret rc Return status code + */ +int fetch ( struct image *image, const char *filename ) { + struct buffer buffer; + int rc; + + /* Name the image, if it isn't explicitly named */ + if ( ! image->name[0] ) { + strncpy ( image->name, basename ( filename ), + ( sizeof ( image->name ) - 1 ) ); + } + + /* Allocate an expandable buffer to hold the file */ + if ( ( rc = ebuffer_alloc ( &buffer, 0 ) ) != 0 ) + return rc; + + /* Retrieve the file */ + struct tftp_session tftp; + union { + struct sockaddr_tcpip st; + struct sockaddr_in sin; + } server; + + memset ( &tftp, 0, sizeof ( tftp ) ); + memset ( &server, 0, sizeof ( server ) ); + server.sin.sin_family = AF_INET; + find_global_dhcp_ipv4_option ( DHCP_EB_SIADDR, + &server.sin.sin_addr ); + server.sin.sin_port = htons ( TFTP_PORT ); + udp_connect ( &tftp.udp, &server.st ); + tftp.filename = filename; + tftp.buffer = &buffer; + if ( ( rc = async_wait ( tftp_get ( &tftp ) ) ) != 0 ) { + efree ( buffer.addr ); + return rc; + } + + /* Transfer ownserhip of the data buffer to the image */ + image->data = buffer.addr; + image->len = buffer.fill; + image->free = efree; + + return 0; +} diff --git a/src/usr/imgmgmt.c b/src/usr/imgmgmt.c new file mode 100644 index 000000000..437cf8e48 --- /dev/null +++ b/src/usr/imgmgmt.c @@ -0,0 +1,45 @@ +/* + * Copyright (C) 2007 Michael Brown . + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include +#include +#include +#include + +/** @file + * + * Image management + * + */ + +/** + * Display status of an image + * + * @v image Executable/loadable image + */ +void imgstat ( struct image *image ) { + printf ( "%s: %zd bytes ", image->name, image->len ); + if ( image->type ) + printf ( " [%s]", image->type->name ); + if ( image->flags & IMAGE_LOADED ) + printf ( " [LOADED]" ); + if ( image->cmdline[0] ) + printf ( "\"%s\"", image->cmdline ); + printf ( "\n" ); +} + -- cgit v1.2.3-55-g7522