static int subcommand_connect(char *command, char *servername, uint16_t port) { /* SEB unsupported on Windows */ #ifdef WIN32 return -1; #else int sockfds[2]; pid_t childpid; if (socketpair(AF_UNIX, SOCK_STREAM, 0, sockfds)) return -1; childpid = fork(); if (!childpid) { do_exec_command(sockfds[1], command, servername, port); } else if (childpid == -1) { close(sockfds[0]); close(sockfds[1]); return -1; } close(sockfds[1]); /* Reap child, leaving grandchild process to run */ waitpid(childpid, NULL, 0); return sockfds[0]; #endif /* WIN32 */ }
static void exec_next_command(struct service_processor *sp) { unsigned long flags; char tsbuf[32]; dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf)); spin_lock_irqsave(&sp->lock, flags); sp->current_command = dequeue_command(sp); if (sp->current_command) { command_get(sp->current_command); spin_unlock_irqrestore(&sp->lock, flags); do_exec_command(sp); } else { spin_unlock_irqrestore(&sp->lock, flags); } }
/** * exec_command * send a command to a service processor * Commands are executed sequentially. One command (sp->current_command) * is sent to the service processor. Once the interrupt handler gets a * message of type command_response, the message is copied into * the current commands buffer, */ void ibmasm_exec_command(struct service_processor *sp, struct command *cmd) { unsigned long flags; char tsbuf[32]; dbg("%s:%d at %s\n", __FUNCTION__, __LINE__, get_timestamp(tsbuf)); spin_lock_irqsave(&sp->lock, flags); if (!sp->current_command) { sp->current_command = cmd; command_get(sp->current_command); spin_unlock_irqrestore(&sp->lock, flags); do_exec_command(sp); } else { enqueue_command(sp, cmd); spin_unlock_irqrestore(&sp->lock, flags); } }