static int run_prd_daemon(struct opal_prd_ctx *ctx) { int rc; /* log to syslog */ pr_log_daemon_init(); ctx->fd = -1; ctx->socket = -1; i2c_init(); #ifdef DEBUG_I2C { uint8_t foo[128]; int i; rc = i2c_read(0, 1, 2, 0x50, 2, 0x10, 128, foo); pr_debug("I2C: read rc: %d", rc); for (i = 0; i < sizeof(foo); i += 8) { pr_debug("I2C: %02x %02x %02x %02x %02x %02x %02x %02x", foo[i + 0], foo[i + 1], foo[i + 2], foo[i + 3], foo[i + 4], foo[i + 5], foo[i + 6], foo[i + 7]); } } #endif rc = init_control_socket(ctx); if (rc) { pr_log(LOG_WARNING, "CTRL: Error initialising PRD control: %m"); goto out_close; } rc = prd_init(ctx); if (rc) { pr_log(LOG_ERR, "FW: Error initialising PRD channel"); goto out_close; } if (ctx->hbrt_file_name) { rc = map_hbrt_file(ctx, ctx->hbrt_file_name); if (rc) { pr_log(LOG_ERR, "IMAGE: Can't access hbrt file %s", ctx->hbrt_file_name); goto out_close; } } else { rc = map_hbrt_physmem(ctx, hbrt_code_region_name); if (rc) { pr_log(LOG_ERR, "IMAGE: Can't access hbrt " "physical memory"); goto out_close; } dump_hbrt_map(ctx); } pr_debug("IMAGE: hbrt map at %p, size 0x%zx", ctx->code_addr, ctx->code_size); fixup_hinterface_table(); pr_debug("HBRT: calling hservices_init"); hservices_init(ctx, ctx->code_addr); pr_debug("HBRT: hservices_init done"); if (ctx->pnor.path) { rc = pnor_init(&ctx->pnor); if (rc) { pr_log(LOG_ERR, "PNOR: Failed to open pnor: %m"); goto out_close; } } ipmi_init(ctx); /* Test a scom */ if (ctx->debug) { uint64_t val; pr_debug("SCOM: trying scom read"); fflush(stdout); hservice_scom_read(0x00, 0xf000f, &val); pr_debug("SCOM: f00f: %lx", be64toh(val)); } run_attn_loop(ctx); rc = 0; out_close: pnor_close(&ctx->pnor); if (ctx->fd != -1) close(ctx->fd); if (ctx->socket != -1) close(ctx->socket); return rc; }
int main(int argc, char **argv) { struct tomatosaver tomatosaver; size_t control_socket_length, socket_path_length, socket_path_root_length; enum message_type msg_type; int bytes_read, control_socket; char *socket_path, *socket_path_root; socket_path = NULL; socket_path_root = NULL; if (argc != 2) { usage(argv[0]); goto error_out; } if (!strcmp("status", argv[1])) { msg_type = MSG_CTL_STATUS; } else if (!strcmp("quit", argv[1])) { msg_type = MSG_CTL_QUIT; } else { usage(argv[0]); goto error_out; } control_socket_length = strlen(TOMATOSAVER_CONTROL_SOCKET); socket_path_root = working_dir(); socket_path_root_length = strlen(socket_path_root); socket_path_length = socket_path_root_length + control_socket_length; socket_path = (char *)malloc(socket_path_length + 1); if (socket_path == NULL) { log_error("Unable to allocate enough memory to hold control " "socket path: %s\n", strerror(errno)); goto free_error_out; } memset(socket_path, 0, socket_path_length + 1); strcpy(socket_path, socket_path_root); strcat(socket_path, TOMATOSAVER_CONTROL_SOCKET); control_socket = init_control_socket(socket_path, connect); if (control_socket == -1) { goto free_error_out; } write(control_socket, &msg_type, sizeof(msg_type)); memset(&tomatosaver, 0, sizeof(tomatosaver)); bytes_read = read(control_socket, &tomatosaver, sizeof(tomatosaver)); if (bytes_read == -1) { log_error("Unable to read response from daemon: %s\n", strerror(errno)); goto close_error_out; } switch (tomatosaver.current_state) { case STATE_POMODORI: case STATE_SHORT_BREAK: case STATE_LONG_BREAK: case STATE_WAITING: log_info("Running (pid=%ld) since %s", (long)tomatosaver.process_id, ctime(&tomatosaver.started_at)); log_info("Next transition at %s", ctime(&tomatosaver.next_transition)); break; case STATE_NOT_RUNNING: log_info("Not running\n"); break; default: log_error("Unknown state\n"); goto close_error_out; } close(control_socket); free(socket_path_root); free(socket_path); return EXIT_SUCCESS; close_error_out: close(control_socket); free_error_out: if (socket_path_root != NULL) { free(socket_path_root); } if (socket_path != NULL) { free(socket_path); } error_out: exit(EXIT_FAILURE); }