/** * Execute script * * @v image Script * @ret rc Return status code */ static int script_exec ( struct image *image ) { size_t saved_offset; int rc; /* Temporarily de-register image, so that a "boot" command * doesn't throw us into an execution loop. */ unregister_image ( image ); /* Preserve state of any currently-running script */ saved_offset = script_offset; /* Process script */ rc = process_script ( image, script_exec_line, terminate_on_exit_or_failure ); /* Restore saved state */ script_offset = saved_offset; /* Re-register image (unless we have been replaced) */ if ( ! image->replacement ) register_image ( image ); return rc; }
/** * Execute script * * @v image Script * @ret rc Return status code */ static int script_exec ( struct image *image ) { size_t offset = 0; off_t eol; size_t len; int rc; /* Temporarily de-register image, so that a "boot" command * doesn't throw us into an execution loop. */ unregister_image ( image ); while ( offset < image->len ) { /* Find length of next line, excluding any terminating '\n' */ eol = memchr_user ( image->data, offset, '\n', ( image->len - offset ) ); if ( eol < 0 ) eol = image->len; len = ( eol - offset ); /* Copy line, terminate with NUL, and execute command */ { char cmdbuf[ len + 1 ]; copy_from_user ( cmdbuf, image->data, offset, len ); cmdbuf[len] = '\0'; DBG ( "$ %s\n", cmdbuf ); if ( ( rc = system ( cmdbuf ) ) != 0 ) { DBG ( "Command \"%s\" failed: %s\n", cmdbuf, strerror ( rc ) ); goto done; } } /* Move to next line */ offset += ( len + 1 ); } rc = 0; done: /* Re-register image and return */ register_image ( image ); return rc; }
status_t _user_unregister_image(image_id id) { return unregister_image(thread_get_current_thread()->team, id); }
/** * Free an image * * @v image Executable/loadable image */ void imgfree ( struct image *image ) { unregister_image ( image ); }