#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/mount.h>
#include <sys/paths.h>
#include <string.h>
#include "enums.h"
#include "structs.h"
#include "bless.h"
#include "protos.h"
int modeDevice(BLContextPtr context, struct clarg actargs[klast]) {
int ret = 0;
CFDataRef labeldata = NULL;
CFDataRef bootXdata = NULL;
BLPreBootEnvType preboot;
if(!(geteuid() == 0)) {
blesscontextprintf(context, kBLLogLevelError, "Not run as root\n" );
return 1;
}
ret = BLGetPreBootEnvironmentType(context, &preboot);
if(ret) {
blesscontextprintf(context, kBLLogLevelError, "Could not determine preboot environment\n");
return 1;
}
if(actargs[klabelfile].present) {
ret = BLLoadFile(context, actargs[klabelfile].argument, 0, &labeldata);
if(ret) {
blesscontextprintf(context, kBLLogLevelError, "Can't load label '%s'\n",
actargs[klabelfile].argument);
return 2;
}
} else if(actargs[klabel].present) {
ret = BLGenerateOFLabel(context, actargs[klabel].argument, &labeldata);
if(ret) {
blesscontextprintf(context, kBLLogLevelError, "Can't render label '%s'\n",
actargs[klabel].argument);
return 3;
}
}
if(actargs[kbootinfo].present) {
if(!actargs[kbootinfo].hasArg) {
blesscontextprintf(context, kBLLogLevelError,
"BootX file must be specified in Device Mode\n");
return 4;
}
ret = BLLoadFile(context, actargs[kbootinfo].argument, 0, &bootXdata);
if(ret) {
blesscontextprintf(context, kBLLogLevelError, "Could not load BootX data from %s\n",
actargs[kbootinfo].argument);
}
}
if(actargs[ksetboot].present) {
if(preboot == kBLPreBootEnvType_EFI) {
ret = setefidevice(context, actargs[kdevice].argument + strlen("/dev/"),
actargs[knextonly].present,
actargs[klegacy].present,
actargs[klegacydrivehint].present ? actargs[klegacydrivehint].argument : NULL,
actargs[koptions].present ? actargs[koptions].argument : NULL,
actargs[kshortform].present ? true : false);
} else {
ret = setboot(context, actargs[kdevice].argument, bootXdata, labeldata);
}
if(ret) {
return 3;
}
} else if(labeldata) {
ret = BLSetOFLabelForDevice(context, actargs[kdevice].argument, labeldata);
if(ret) {
blesscontextprintf(context, kBLLogLevelError, "Error while setting label for %s\n", actargs[kdevice].argument );
return 3;
}
}
if(labeldata) CFRelease(labeldata);
if(bootXdata) CFRelease(bootXdata);
return 0;
}