Cleaner separation between imgXXX() functions and image_cmd.c
[people/dverkamp/gpxe.git] / src / usr / imgmgmt.c
1 /*
2  * Copyright (C) 2007 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17  */
18
19 #include <stdint.h>
20 #include <stdlib.h>
21 #include <errno.h>
22 #include <vsprintf.h>
23 #include <gpxe/image.h>
24 #include <usr/fetch.h>
25 #include <usr/imgmgmt.h>
26
27 /** @file
28  *
29  * Image management
30  *
31  */
32
33 /**
34  * Fetch an image
35  *
36  * @v filename          Filename for image
37  * @v name              Name for image, or NULL
38  * @ret new_image       Newly created image
39  * @ret rc              Return status code
40  */
41 int imgfetch ( const char *filename, const char *name,
42                struct image **new_image ) {
43         struct image *image;
44         int rc;
45
46         /* Allocate new image */
47         image = malloc ( sizeof ( *image ) );
48         if ( ! image )
49                 return -ENOMEM;
50         memset ( image, 0, sizeof ( *image ) );
51
52         /* Fill in image name */
53         if ( name )
54                 strncpy ( image->name, name, ( sizeof ( image->name ) - 1 ) );
55
56         /* Fetch the file */
57         if ( ( rc = fetch ( image, filename ) ) != 0 )
58                 goto err;
59
60         /* Register the image */
61         if ( ( rc = register_image ( image ) ) != 0 )
62                 goto err;
63
64         *new_image = image;
65         return 0;
66
67  err:
68         free_image ( image );
69         free ( image );
70         return rc;
71 }
72
73 /**
74  * Load an image
75  *
76  * @v image             Image
77  * @ret rc              Return status code
78  */
79 int imgload ( struct image *image ) {
80         return image_autoload ( image );
81 }
82
83 /**
84  * Execute an image
85  *
86  * @v image             Image
87  * @ret rc              Return status code
88  */
89 int imgexec ( struct image *image ) {
90         return image_exec ( image );
91 }
92
93 /**
94  * Display status of an image
95  *
96  * @v image             Executable/loadable image
97  */
98 void imgstat ( struct image *image ) {
99         printf ( "%s: %zd bytes", image->name, image->len );
100         if ( image->type )
101                 printf ( " [%s]", image->type->name );
102         if ( image->flags & IMAGE_LOADED )
103                 printf ( " [LOADED]" );
104         if ( image->cmdline[0] )
105                 printf ( " \"%s\"", image->cmdline );
106         printf ( "\n" );
107 }
108
109 /**
110  * Free an image
111  *
112  * @v image             Executable/loadable image
113  */
114 void imgfree ( struct image *image ) {
115         unregister_image ( image );
116         free_image ( image );
117         free ( image );
118 }