static int rain_cec_adap_transmit(struct cec_adapter *adap, u8 attempts, u32 signal_free_time, struct cec_msg *msg) { struct rain *rain = cec_get_drvdata(adap); char cmd[2 * CEC_MAX_MSG_SIZE + 16]; unsigned int i; int err; if (msg->len == 1) { snprintf(cmd, sizeof(cmd), "x%x", cec_msg_destination(msg)); } else { char hex[3]; snprintf(cmd, sizeof(cmd), "x%x %02x ", cec_msg_destination(msg), msg->msg[1]); for (i = 2; i < msg->len; i++) { snprintf(hex, sizeof(hex), "%02x", msg->msg[i]); strlcat(cmd, hex, sizeof(cmd)); } } mutex_lock(&rain->write_lock); err = rain_send(rain, cmd); mutex_unlock(&rain->write_lock); return err; }
static int rain_send_and_wait(struct rain *rain, const char *cmd, const char *reply) { int err; init_completion(&rain->cmd_done); mutex_lock(&rain->write_lock); err = rain_send(rain, cmd); if (err) goto err; if (!wait_for_completion_timeout(&rain->cmd_done, HZ)) { err = -ETIMEDOUT; goto err; } if (reply && strncmp(rain->cmd_reply, reply, strlen(reply))) { dev_dbg(rain->dev, "transmit of '%s': received '%s' instead of '%s'\n", cmd, rain->cmd_reply, reply); err = -EIO; } err: mutex_unlock(&rain->write_lock); return err; }
void tcpsvr_notifyconnect(tcpsvr_t * svr,tcpclient_t * cli) { struct rainMsg msg; msg.data = &cli->id; msg.sz = sizeof(cli->id); msg.type = CONNECT; rain_send(svr->ctx,svr->watchdog,msg,RAIN_COPY,NULL); }
void tcpsvr_notifyclose(tcpsvr_t * svr,tcpclient_t * cli) { struct rainMsg msg; msg.data = &cli->id; msg.sz = sizeof(cli->id); msg.type = CLOSE; rain_send(svr->ctx,svr->watchdog,msg,RAIN_COPY,NULL); tcpclient_destroy(cli); }
void tcpsvr_notifyread(tcpsvr_t * svr,tcpclient_t * cli ,void *buf,int sz) { svr->all_recv += sz-4; struct rainMsg msg; msg.data = buf; msg.sz = sz; msg.type = MESSAGE; rain_send(svr->ctx,svr->watchdog,msg,RAIN_NOCOPY,NULL); }
void tcpsvr_notifyerror(tcpsvr_t *svr,tcpclient_t *cli) { svr->num_cli -- ; struct rainMsg msg; msg.data = &cli->id; msg.sz = sizeof(cli->id); msg.type = ERROR; rain_send(svr->ctx,svr->watchdog,msg,RAIN_COPY,NULL); svr->num_cli -- ; cli->binuse = false; }