static int get_mode (void) { GError *error = NULL; char *standard_output; char *standard_error; int exit_status; int retval; if (!bm.has_bm) { return NORMAL_MODE; } if (g_spawn_command_line_sync ("/usr/sbin/boot-mode --status", &standard_output, &standard_error, &exit_status, &error)) { retval = STARTSWITH (standard_output, "update") ? UPDATE_MODE : NORMAL_MODE; } g_free (standard_output); g_free (standard_error); if (error) { g_error_free (error); } return retval; }
static void gpsd_read_gpsd(struct globals *globals) { ssize_t ret; size_t cnt; bool eol = false; char buf[4096]; const size_t tpv_size = sizeof(globals->buf) - sizeof(*globals->push) - sizeof(struct alfred_data) - sizeof(*globals->gpsd_data); cnt = 0; do { ret = read(globals->gpsdata.gps_fd, &buf[cnt], 1); if (ret != 1) { gps_close(&globals->gpsdata); globals->gpsdata.gps_fd = -1; return; } switch (buf[cnt]) { case '\r': cnt--; break; case '\n': eol = true; buf[cnt] = '\0'; break; } } while (cnt++ < sizeof(buf) - 1 && !eol); if (!eol) { gps_close(&globals->gpsdata); globals->gpsdata.gps_fd = -1; return; } #define STARTSWITH(str, prefix) strncmp(str, prefix, sizeof(prefix)-1)==0 if (STARTSWITH(buf, "{\"class\":\"TPV\"")) { strncpy(globals->gpsd_data->tpv, buf, tpv_size); globals->gpsd_data->tpv[tpv_size - 1] = '\0'; globals->gpsd_data->tpv_len = htonl(strlen(globals->gpsd_data->tpv) + 1); } }
int main(int argc, char** argv) { logLevel = 2; int atFile = 0; unsigned addr = 0; unsigned lastAddr = 0xffff; bool debugSymbols = false; char c; DByteOrder byteOrder = DBO_LittleEndian; const char* files[2] = {NULL, NULL}; const char* usage = "usage: %s (-vX | -h | -sX | -d | -eX) [dasm file] [out binary]"; for(int i = 1; i < argc; i++){ char* v = argv[i]; if(STARTSWITH(v, '-')){ if(!strcmp(v, "-h")){ LogI(usage, argv[0]); LogI(" "); LogI("Available flags:"); LogI(" -vX set log level, where X is [0-5] - default: 2"); LogI(" -sX set assembly start address [0-FFFF] - default 0"); LogI(" -h show this help message"); LogI(" -d generate debug symbols"); LogI(" -eX set endianness of output, where X is [l | b] default: l"); return 0; } else if(sscanf(v, "-v%d", &logLevel) == 1){} else if(sscanf(v, "-s%x", &addr) == 1){} else if(sscanf(v, "-e%1c", &c) == 1){ byteOrder = c == 'l' ? DBO_LittleEndian : DBO_BigEndian; } else if(!strcmp(v, "-d")){ debugSymbols = true; } else{ LogF("No such flag: %s", v); return 1; } }else{ LAssert(atFile < 2, "Please specify exactly one input file and one output file"); files[atFile++] = v; } } LAssert(argc >= 3 && files[0] && files[1], usage, argv[0]); LAssert(addr <= 0xffff, "Assembly start address must be within range 0 - 0xFFFF (not %x)", addr); // Allocate 64 kword RAM file uint16_t* ram = calloc(1, sizeof(uint16_t) * 0x10000); Dasm* d = Dasm_Create(); if(debugSymbols){ char tmp[4096]; sprintf(tmp, "%s.dbg", files[1]); d->debugFile = fopen(tmp, "w"); LogV("Opening debug file: %s", tmp); LAssert(d->debugFile, "could not open file: %s", tmp); } uint16_t len = Dasm_Assemble(d, files[0], ram, addr, lastAddr); if(d->debugFile) fclose(d->debugFile); Dasm_Destroy(&d); if(logLevel == 0) DumpRam(ram, len - 1); LogV("Writing to: %s", files[1]); WriteRam(ram, files[1], len - 1, byteOrder); free(ram); return 0; }
int main(int argc, char** argv) { logLevel = 2; int atFile = 0; int romSize = 1024 * 1024 * 16; unsigned addr = 0; bool debugSymbols = false; const char* files[2] = {NULL, NULL}; const char* usage = "usage: %s (-vX | -h | -sX | -d | -eX) [hasm file] [out binary]"; for(int i = 1; i < argc; i++){ char* v = argv[i]; if(STARTSWITH(v, '-')){ if(!strcmp(v, "-h")){ LogI(usage, argv[0]); LogI(" "); LogI("Available flags:"); LogI(" -vX set log level, where X is [0-5] - default: 2"); LogI(" -sX set assembly start address [0-FFFF] - default 0"); LogI(" -h show this help message"); LogI(" -d generate debug symbols"); LogI(" -t unit tests"); return 0; } else if(sscanf(v, "-v%d", &logLevel) == 1){} else if(sscanf(v, "-s%x", &addr) == 1){} else if(!strcmp(v, "-d")){ debugSymbols = true; } else if(!strcmp(v, "-t")){ return Tests(argc, argv); } else{ LogF("No such flag: %s", v); return 1; } }else{ LAssert(atFile < 2, "Please specify exactly one input file and one output file"); files[atFile++] = v; } } LAssert(argc >= 3 && files[0] && files[1], usage, argv[0]); // Allocate 16 MB ROM uint8_t* ram = calloc(1, romSize); Hasm* d = Hasm_Create(); if(debugSymbols){ char tmp[4096]; sprintf(tmp, "%s.dbg", files[1]); d->debugFile = fopen(tmp, "w"); LogV("Opening debug file: %s", tmp); LAssert(d->debugFile, "could not open file: %s", tmp); } uint32_t len = Hasm_Assemble(d, files[0], ram, addr, romSize - 1); if(d->debugFile) fclose(d->debugFile); Hasm_Destroy(&d); if(logLevel == 0 && len) DumpRam(ram, len - 1); LogV("Writing to: %s", files[1]); WriteFile(ram, len ? len - 1 : 0, files[1]); LAssertWarn(len, "produced empty file"); free(ram); return 0; }