#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"
extern int blesscontextprintf(BLContextPtr context, int loglevel, char const *fmt, ...);
extern int setboot(BLContextPtr context, char *device, CFDataRef bootxData,
CFDataRef labelData);
int modeDevice(BLContextPtr context, struct clarg actargs[klast]) {
int err = 0;
CFDataRef labeldata = NULL;
CFDataRef bootXdata = NULL;
if(!(geteuid() == 0)) {
blesscontextprintf(context, kBLLogLevelError, "Not run as root\n" );
return 1;
}
if(actargs[klabelfile].present) {
err = BLLoadFile(context, actargs[klabelfile].argument, 0, &labeldata);
if(err) {
blesscontextprintf(context, kBLLogLevelError, "Can't load label '%s'\n",
actargs[klabelfile].argument);
return 2;
}
} else if(actargs[klabel].present) {
err = BLGenerateOFLabel(context, actargs[klabel].argument, &labeldata);
if(err) {
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;
}
err = BLLoadFile(context, actargs[kbootinfo].argument, 0, &bootXdata);
if(err) {
blesscontextprintf(context, kBLLogLevelError, "Could not load BootX data from %s\n",
actargs[kbootinfo].argument);
}
}
if(actargs[ksetboot].present) {
err = setboot(context, actargs[kdevice].argument, bootXdata, labeldata);
if(err) {
return 3;
}
} else if(labeldata) {
err = BLSetOFLabelForDevice(context, actargs[kdevice].argument, labeldata);
if(err) {
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;
}