示例#1
0
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;
}
示例#2
0
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);
}