/** * Generic send function for dsmesock messages * * @param msg A pointer to the message to send */ static bool mce_dsme_send(gpointer msg, const char *request_name) { bool res = false; if( !mce_dsme_connection ) { mce_log(LL_WARN, "failed to send %s to dsme; %s", request_name, "not connected"); goto EXIT; } if( dsmesock_send(mce_dsme_connection, msg) == -1) { mce_log(LL_ERR, "failed to send %s to dsme; %m", request_name); /* close and try to re-connect */ mce_dsme_reconnect(); goto EXIT; } mce_log(LL_DEBUG, "%s sent to DSME", request_name); res = true; EXIT: return res; }
/** * Generic send function for dsmesock messages * XXX: How should we handle sending failures? * * @param msg A pointer to the message to send */ static void mce_dsme_send(gpointer msg) { if (dsme_disabled == TRUE) goto EXIT; if (dsme_conn == NULL) { mce_log(LL_CRIT, "Attempt to use dsme_conn uninitialised; aborting!"); // FIXME: this is not how one should exit from mainloop mce_quit_mainloop(); exit(EXIT_FAILURE); } if ((dsmesock_send(dsme_conn, msg)) == -1) { mce_log(LL_CRIT, "dsmesock_send error: %s", g_strerror(errno)); #ifdef MCE_DSME_ERROR_POLICY // FIXME: this is not how one should exit from mainloop mce_quit_mainloop(); exit(EXIT_FAILURE); #endif /* MCE_DSME_ERROR_POLICY */ } EXIT: return; }
static bool send_to_dsme(dsmesock_connection_t* conn, const void* msg) { bool success = true; if (dsmesock_send(conn, msg) == -1) { success = false; } return success; }
static gboolean send_dsme_empty(gpointer data G_GNUC_UNUSED) { DSM_MSGTYPE_SET_BATTERY_STATE msg = DSME_MSG_INIT(DSM_MSGTYPE_SET_BATTERY_STATE); msg.empty = 1; if (!global_is_charging) dsmesock_send(dsme_conn, &msg); return FALSE; }
int send_kick_wd(void) { int ret = 0; DSM_MSGTYPE_HWWD_KICK msg = DSME_MSG_INIT(DSM_MSGTYPE_HWWD_KICK); ret = dsmesock_send(conn, &msg); printf("Message sent to DSME!"); return ret; }
int main(int argc, char *argv[]) { dsmesock_connection_t * conn; int next_option; const char* program_name = argv[0]; int batt_status = -1; int charger_status = -1; const char* short_options = "hb:c:"; const struct option long_options[] = { { "battery", 0, NULL, 'b' }, { "charger", 0, NULL, 'c' }, { "help", 0, NULL, 'h' } }; do { next_option = getopt_long(argc, argv, short_options, long_options, NULL); switch (next_option) { case 'b': batt_status = atoi(optarg); break; case 'c': charger_status = atoi(optarg); break; case 'h': usage(program_name); return EXIT_SUCCESS; break; case '?': usage(program_name); return EXIT_FAILURE; break; } } while (next_option != -1); if (batt_status == -1 && charger_status == -1) { usage(program_name); return EXIT_FAILURE; } conn = dsmesock_connect(); if (conn == 0) { perror("dsmesock_connect"); return 2; } if (batt_status != -1) { DSM_MSGTYPE_SET_BATTERY_STATE msg = DSME_MSG_INIT(DSM_MSGTYPE_SET_BATTERY_STATE); msg.empty = !batt_status; dsmesock_send(conn, &msg); } if (charger_status != -1) { DSM_MSGTYPE_SET_CHARGER_STATE msg = DSME_MSG_INIT(DSM_MSGTYPE_SET_CHARGER_STATE); msg.connected = !!charger_status; dsmesock_send(conn, &msg); } dsmesock_close(conn); exit(0); }
int main(void) { dsmesock_connection_t* dsme_conn; fd_set rfds; DSM_MSGTYPE_STATE_QUERY req_msg = DSME_MSG_INIT(DSM_MSGTYPE_STATE_QUERY); dsmemsg_generic_t* msg; DSM_MSGTYPE_STATE_CHANGE_IND* msg2; int ret; dsme_conn = dsmesock_connect(); if (dsme_conn == 0) { fprintf(stderr, "dsmesock_connect\n"); return state; } /* Sending a query if the original message has already gone by */ dsmesock_send(dsme_conn, &req_msg); while (1) { struct timeval tv; tv.tv_sec = DSME_STATE_TIMEOUT; tv.tv_usec = 0; FD_ZERO(&rfds); FD_SET(dsme_conn->fd, &rfds); ret = select(dsme_conn->fd + 1, &rfds, NULL, NULL, &tv); if (ret == -1) { fprintf(stderr, "error in select()\n"); printf("MALF"); return EXIT_FAILURE; } if (ret == 0) { fprintf(stderr, "Timeout!\n"); printf("MALF"); return EXIT_FAILURE; } msg = (dsmemsg_generic_t*)dsmesock_receive(dsme_conn); if ((msg2 = DSMEMSG_CAST(DSM_MSGTYPE_STATE_CHANGE_IND, msg)) != 0) { fprintf(stderr, "received state:%i\n", msg2->state); switch (msg2->state) { case DSME_STATE_ACTDEAD: printf("ACTDEAD"); return EXIT_SUCCESS; case DSME_STATE_USER: printf("USER"); return EXIT_SUCCESS; case DSME_STATE_TEST: printf("TEST"); return EXIT_SUCCESS; case DSME_STATE_LOCAL: printf("LOCAL"); return EXIT_SUCCESS; case DSME_STATE_MALF: printf("MALF"); return EXIT_SUCCESS; case DSME_STATE_SHUTDOWN: printf("SHUTDOWN"); return EXIT_SUCCESS; case DSME_STATE_BOOT: printf("BOOT"); return EXIT_SUCCESS; default: fprintf(stderr, "unknown state: %d\n", msg2->state); break; } } else { fprintf(stderr, "The received message wasn't state change indication\n"); } free(msg); } return EXIT_FAILURE; }