static __attribute__((used)) char* rcsid = "$CVSHeader$"; /* * * (c) 2004 Laurent Vivier * */ #include #include #include #include "libemile.h" #include "emile.h" #include "../second/head.h" int emile_second_set_output(int fd, unsigned int enable_mask, unsigned int disable_mask, unsigned int bitrate0, int datasize0, int parity0, int stopbits0, unsigned int bitrate1, int datasize1, int parity1, int stopbits1, int gestaltid) { emile_l2_header_t header; off_t location; int ret; u_int32_t mask; location = lseek(fd, 0, SEEK_CUR); if (location == -1) return EEMILE_CANNOT_READ_SECOND; ret = read(fd, &header, sizeof(header)); if (ret != sizeof(header)) return EEMILE_CANNOT_READ_SECOND; if (!EMILE_COMPAT(EMILE_03_SIGNATURE, read_long(&header.signature))) return EEMILE_INVALID_SECOND; mask = read_long(&header.console_mask); mask |= enable_mask; mask &= ~disable_mask; write_long(&header.console_mask, mask); if (bitrate0) write_long(&header.serial0_bitrate, bitrate0); if (bitrate1) write_long(&header.serial1_bitrate, bitrate1); if (datasize0 != -1) header.serial0_datasize = datasize0; if (datasize1 != -1) header.serial1_datasize = datasize1; if (stopbits0 != -1) header.serial0_stopbits = stopbits0; if (stopbits1 != -1) header.serial1_stopbits = stopbits1; if (parity0 != -1) header.serial0_parity = parity0; if (parity1 != -1) header.serial1_parity = parity1; if (gestaltid != -1) write_long(&header.gestaltID, gestaltid); /* 0 means unset ... */ ret = lseek(fd, location, SEEK_SET); if (ret == -1) return EEMILE_CANNOT_WRITE_SECOND; ret = write(fd, &header, sizeof(header)); if (ret != sizeof(header)) return EEMILE_CANNOT_WRITE_SECOND; return 0; }