/* $Id$ * $URL$ * * imond/telmond data processing * * Copyright (C) 2003 Nico Wallmeier * * This file is part of LCD4Linux. * * LCD4Linux is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) * any later version. * * LCD4Linux is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ #include "config.h" #include "debug.h" #include "plugin.h" #include "qprintf.h" #include "cfg.h" #include "hash.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* decl of inet_addr() */ #include static HASH TELMON; static HASH IMON; static char thost[256]; static int tport; static char phoneb[256]; static char ihost[256]; static char ipass[256]; static int iport; static int fd = 0; static int err = 0; /*---------------------------------------------------------------------------- * service_connect (host_name, port) - connect to tcp-service *---------------------------------------------------------------------------- */ static int service_connect(const char *host_name, const int port) { struct sockaddr_in addr; struct hostent *host_p; int fd; int opt = 1; (void) memset((char *) &addr, 0, sizeof(addr)); if ((addr.sin_addr.s_addr = inet_addr((char *) host_name)) == INADDR_NONE) { host_p = gethostbyname(host_name); if (!host_p) { error("%s: host not found\n", host_name); return (-1); } (void) memcpy((char *) (&addr.sin_addr), host_p->h_addr, host_p->h_length); } addr.sin_family = AF_INET; addr.sin_port = htons((unsigned short) port); /* open socket */ if ((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0) { perror("socket"); return (-1); } (void) setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *) &opt, sizeof(opt)); if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) != 0) { (void) close(fd); perror(host_name); return (-1); } return (fd); } /* service_connect (char * host_name, int port) */ /*---------------------------------------------------------------------------- * send_command (int fd, char * str) - send command to imond *---------------------------------------------------------------------------- */ static void send_command(const int fd, const char *str) { char buf[256]; int len = strlen(str); sprintf(buf, "%s\r\n", str); write(fd, buf, len + 2); return; } /* send_command (int fd, char * str) */ /*---------------------------------------------------------------------------- * get_answer (int fd) - get answer from imond *---------------------------------------------------------------------------- */ static char *get_answer(const int fd) { static char buf[8192]; int len; len = read(fd, buf, 8192); if (len <= 0) { return ((char *) NULL); } while (len > 1 && (buf[len - 1] == '\n' || buf[len - 1] == '\r')) { buf[len - 1] = '\0'; len--; } if (!strncmp(buf, "OK ", 3)) { /* OK xxxx */ return (buf + 3); } else if (len > 2 && !strcmp(buf + len - 2, "OK")) { *(buf + len - 2) = '\0'; return (buf); } else if (len == 2 && !strcmp(buf + len - 2, "OK"
# Sweden - Ängelholm/Vegeholm
# T freq bw fec_hi fec_lo mod transmission-mode guard-interval hierarchy
T 482000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
T 506000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
T 634000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
T 818000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
T 794000000 8MHz 3/4 NONE QAM64 8k 1/4 NONE
l; char buf[128]; if (configure_imon() < 0) { SetResult(&result, R_STRING, ""); return; } if (parse_imon_rates(R2S(arg1)) < 0) { SetResult(&result, R_STRING, ""); return; } qprintf(buf, sizeof(buf), "rate %s %s", R2S(arg1), R2S(arg2)); val = hash_get(&IMON, buf, NULL); if (val == NULL) val = ""; SetResult(&result, R_STRING, val); } static int parse_imon_quantity(const char *channel) { char buf[256], fill1[25], in[25], fill2[25], out[25]; char *s; int age; qprintf(buf, sizeof(buf), "quantity %s in", channel); /* reread every half sec only */ age = hash_age(&IMON, buf); if (age > 0 && age <= 500) return 0; init(); /* establish connection */ if (err) return -1; qprintf(buf, sizeof(buf), "quantity %s", channel); s = get_value(buf); if (sscanf(s, "%s %s %s %s", fill1, in, fill2, out) != 4) return -1; qprintf(buf, sizeof(buf), "quantity %s in", channel); hash_put(&IMON, buf, in); qprintf(buf, sizeof(buf), "quantity %s out", channel); hash_put(&IMON, buf, out); return 0; } static int parse_imon_status(const char *channel) { char buf[256], status[25]; char *s; int age; qprintf(buf, sizeof(buf), "status %s", channel); /* reread every half sec only */ age = hash_age(&IMON, buf); if (age > 0 && age <= 500) return 0; init(); /* establish connection */ if (err) return -1; qprintf(buf, sizeof(buf), "status %s", channel); s = get_value(buf); if (sscanf(s, "%s", status) != 1) return -1; qprintf(buf, sizeof(buf), "status %s", channel); if (strcasecmp(status, "Online") == 0) hash_put(&IMON, buf, "1"); else hash_put(&IMON, buf, "0"); return 0; } static void my_imon_quantity(RESULT * result, RESULT * arg1, RESULT * arg2) { char *val; char buf[256]; if (configure_imon() < 0) { SetResult(&result, R_STRING, ""); return; } if (parse_imon_quantity(R2S(arg1)) < 0) { SetResult(&result, R_STRING, ""); return; } qprintf(buf, sizeof(buf), "quantity %s %s", R2S(arg1), R2S(arg2)); val = hash_get(&IMON, buf, NULL); if (val == NULL) val = ""; SetResult(&result, R_STRING, val); } static void my_imon_status(RESULT * result, RESULT * arg1) { char *val; char buf[256]; if (configure_imon() < 0) { SetResult(&result, R_NUMBER, "-1"); return; } if (parse_imon_status(R2S(arg1)) < 0) { SetResult(&result, R_STRING, "-1"); return; } qprintf(buf, sizeof(buf), "status %s", R2S(arg1)); val = hash_get(&IMON, buf, NULL); if (val == NULL) val = "-1"; SetResult(&result, R_STRING, val); } static void my_imon(RESULT * result, RESULT * arg1) { char *val; char *cmd; if (configure_imon() < 0) { SetResult(&result, R_STRING, ""); return; } cmd = R2S(arg1); if (parse_imon(cmd) < 0) { SetResult(&result, R_STRING, ""); return; } val = hash_get(&IMON, cmd, NULL); if (val == NULL) val = ""; SetResult(&result, R_STRING, val); } int plugin_init_imon(void) { AddFunction("imon", 1, my_imon); AddFunction("imon::version", 0, my_imon_version); AddFunction("imon::rates", 2, my_imon_rates); AddFunction("imon::quantity", 2, my_imon_quantity); AddFunction("imon::status", 1, my_imon_status); AddFunction("imon::telmon", 1, my_telmon); return 0; } void plugin_exit_imon(void) { if (fd > 0) { send_command(fd, "quit"); close(fd); } hash_destroy(&TELMON); hash_destroy(&IMON); }