/* * * (c) 2005-2007 Laurent Vivier * */ #include #include #include #include #include #include "libemile.h" #include "emile.h" #include "bootblock.h" int emile_second_set_configuration(int fd, char *configuration) { emile_l2_header_t header; int ret; int size; int len; off_t offset; if (configuration == NULL) return EEMILE_CANNOT_READ_SECOND; len = strlen (configuration) + 1; /* + 1 for ending 0 */ memset(&header, 0, sizeof(header)); ret = read(fd, &header, sizeof(header)); if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) { offset = lseek(fd, FIRST_LEVEL_SIZE, SEEK_SET); ret = read(fd, &header, sizeof(header)); if (!EMILE_COMPAT(EMILE_06_SIGNATURE, read_long(&header.signature))) return EEMILE_INVALID_SECOND; } if (ret != sizeof(header)) return EEMILE_CANNOT_READ_SECOND; size = read_short(&header.conf_size); if (len > size) return EEMILE_INVALID_SECOND; ret = write(fd, configuration, len); if (ret != len) return EEMILE_CANNOT_WRITE_SECOND; return 0; }