ostree-prepare-root: Cope with /proc not being mounted
When trying to read kernel command-line. Closes: #403 Approved by: cgwalters
This commit is contained in:
parent
c9551dc231
commit
a0a4052365
|
|
@ -45,21 +45,20 @@
|
||||||
#include "ostree-mount-util.h"
|
#include "ostree-mount-util.h"
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
parse_ostree_cmdline (void)
|
read_proc_cmdline (void)
|
||||||
{
|
{
|
||||||
FILE *f = fopen("/proc/cmdline", "r");
|
FILE *f = fopen("/proc/cmdline", "r");
|
||||||
char *cmdline = NULL;
|
char *cmdline = NULL;
|
||||||
const char *iter;
|
|
||||||
char *ret = NULL;
|
|
||||||
size_t len;
|
size_t len;
|
||||||
|
|
||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
goto out;
|
||||||
|
|
||||||
/* Note that /proc/cmdline will not end in a newline, so getline
|
/* Note that /proc/cmdline will not end in a newline, so getline
|
||||||
* will fail unelss we provide a length.
|
* will fail unelss we provide a length.
|
||||||
*/
|
*/
|
||||||
if (getline (&cmdline, &len, f) < 0)
|
if (getline (&cmdline, &len, f) < 0)
|
||||||
return NULL;
|
goto out;
|
||||||
/* ... but the length will be the size of the malloc buffer, not
|
/* ... but the length will be the size of the malloc buffer, not
|
||||||
* strlen(). Fix that.
|
* strlen(). Fix that.
|
||||||
*/
|
*/
|
||||||
|
|
@ -67,6 +66,47 @@ parse_ostree_cmdline (void)
|
||||||
|
|
||||||
if (cmdline[len-1] == '\n')
|
if (cmdline[len-1] == '\n')
|
||||||
cmdline[len-1] = '\0';
|
cmdline[len-1] = '\0';
|
||||||
|
out:
|
||||||
|
if (f)
|
||||||
|
fclose (f);
|
||||||
|
return cmdline;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
parse_ostree_cmdline (void)
|
||||||
|
{
|
||||||
|
char *cmdline = NULL;
|
||||||
|
const char *iter;
|
||||||
|
char *ret = NULL;
|
||||||
|
int tmp_errno;
|
||||||
|
|
||||||
|
cmdline = read_proc_cmdline ();
|
||||||
|
if (!cmdline)
|
||||||
|
{
|
||||||
|
// Mount proc
|
||||||
|
if (mount ("proc", "/proc", "proc", 0, NULL) < 0)
|
||||||
|
{
|
||||||
|
perrorv ("failed to mount proc on /proc: ");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmdline = read_proc_cmdline ();
|
||||||
|
tmp_errno = errno;
|
||||||
|
|
||||||
|
/* Leave the filesystem in the state that we found it: */
|
||||||
|
if (umount ("/proc"))
|
||||||
|
{
|
||||||
|
perrorv ("failed to umount proc from /proc: ");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = tmp_errno;
|
||||||
|
if (!cmdline)
|
||||||
|
{
|
||||||
|
perrorv ("failed to read /proc/cmdline: ");
|
||||||
|
exit (EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
iter = cmdline;
|
iter = cmdline;
|
||||||
while (iter != NULL)
|
while (iter != NULL)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue