diff recpt1/recpt1ctl.c @ 78:5a0126d8af17

landed ipc control functionality branch
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Tue, 01 Dec 2009 20:24:22 +0900
parents
children c9b1d21c5035
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/recpt1/recpt1ctl.c	Tue Dec 01 20:24:22 2009 +0900
@@ -0,0 +1,214 @@
+#include <sys/types.h>
+#include <sys/ipc.h>
+#include <sys/msg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <ctype.h>
+#include <getopt.h>
+
+#include "version.h"
+
+#define MSGSZ     255
+
+typedef struct msgbuf {
+    long    mtype;
+    char    mtext[MSGSZ];
+} message_buf;
+
+void
+show_usage(char *cmd)
+{
+    fprintf(stderr, "Usage: \n%s --pid pid [--channel channel] [--extend time_to_extend] [--time recording_time]\n", cmd);
+    fprintf(stderr, "\n");
+}
+
+void
+show_options(void)
+{
+    fprintf(stderr, "Options:\n");
+    fprintf(stderr, "--pid:               Process id of recpt1 to control\n");
+    fprintf(stderr, "--channel:           Tune to specified channel\n");
+    fprintf(stderr, "--extend:            Extend recording time\n");
+    fprintf(stderr, "--time:              Set total recording time\n");
+    fprintf(stderr, "--help:              Show this help\n");
+    fprintf(stderr, "--version:           Show version\n");
+    fprintf(stderr, "--list:              Show channel list\n");
+}
+
+void
+show_channels(void)
+{
+    FILE *f;
+    char *home;
+    char buf[255], filename[255];
+
+    fprintf(stderr, "Available Channels:\n");
+
+    home = getenv("HOME");
+    sprintf(filename, "%s/.recpt1-channels", home);
+    f = fopen(filename, "r");
+    if(f) {
+        while(fgets(buf, 255, f))
+            fprintf(stderr, "%s", buf);
+        fclose(f);
+    }
+    else
+        fprintf(stderr, "13-62: Terrestrial Channels\n");
+
+    fprintf(stderr, "101ch: NHK BS1\n");
+    fprintf(stderr, "102ch: NHK BS2\n");
+    fprintf(stderr, "103ch: NHK BShi\n");
+    fprintf(stderr, "141ch: BS Nittele\n");
+    fprintf(stderr, "151ch: BS Asahi\n");
+    fprintf(stderr, "161ch: BS-TBS\n");
+    fprintf(stderr, "171ch: BS Japan\n");
+    fprintf(stderr, "181ch: BS Fuji\n");
+    fprintf(stderr, "191ch: WOWOW\n");
+    fprintf(stderr, "200ch: Star Channel\n");
+    fprintf(stderr, "211ch: BS11 Digital\n");
+    fprintf(stderr, "222ch: TwellV\n");
+    fprintf(stderr, "CS2-CS24: CS Channels\n");
+}
+
+int
+parse_time(char *rectimestr, int *recsec)
+{
+    /* indefinite */
+    if(!strcmp("-", rectimestr)) {
+        *recsec = -1;
+    }
+    /* colon */
+    else if(strchr(rectimestr, ':')) {
+        int n1, n2, n3;
+        if(sscanf(rectimestr, "%d:%d:%d", &n1, &n2, &n3) == 3)
+            *recsec = n1 * 3600 + n2 * 60 + n3;
+        else if(sscanf(rectimestr, "%d:%d", &n1, &n2) == 2)
+            *recsec = n1 * 3600 + n2 * 60;
+    }
+    /* HMS */
+    else {
+        char *tmpstr;
+        char *p1, *p2;
+
+        tmpstr = strdup(rectimestr);
+        p1 = tmpstr;
+        while(*p1 && !isdigit(*p1))
+            p1++;
+
+        /* hour */
+        if((p2 = strchr(p1, 'H')) || (p2 = strchr(p1, 'h'))) {
+            *p2 = '\0';
+            *recsec += atoi(p1) * 3600;
+            p1 = p2 + 1;
+            while(*p1 && !isdigit(*p1))
+                p1++;
+        }
+
+        /* minute */
+        if((p2 = strchr(p1, 'M')) || (p2 = strchr(p1, 'm'))) {
+            *p2 = '\0';
+            *recsec += atoi(p1) * 60;
+            p1 = p2 + 1;
+            while(*p1 && !isdigit(*p1))
+                p1++;
+        }
+
+        /* second */
+        *recsec += atoi(p1);
+
+        free(tmpstr);
+    }
+
+    return 0; /* success */
+}
+
+int
+main(int argc, char **argv)
+{
+    int msqid;
+    int msgflg = IPC_CREAT | 0666;
+    key_t key = 0;
+    int channel=0, recsec = 0, extsec=0;
+    message_buf sbuf;
+    size_t buf_length;
+
+    int result;
+    int option_index;
+    struct option long_options[] = {
+        { "pid",       1, NULL, 'p'},
+        { "channel",   1, NULL, 'c'},
+        { "extend",    1, NULL, 'e'},
+        { "time",      1, NULL, 't'},
+        { "help",      0, NULL, 'h'},
+        { "version",   0, NULL, 'v'},
+        { "list",      0, NULL, 'l'},
+        {0, 0, NULL, 0} /* terminate */
+    };
+
+    while((result = getopt_long(argc, argv, "p:c:e:t:hvl",
+                                long_options, &option_index)) != -1) {
+        switch(result) {
+        case 'h':
+            fprintf(stderr, "\n");
+            show_usage(argv[0]);
+            fprintf(stderr, "\n");
+            show_options();
+            fprintf(stderr, "\n");
+            show_channels();
+            fprintf(stderr, "\n");
+            exit(0);
+            break;
+        case 'v':
+            fprintf(stderr, "%s %s\n", argv[0], version);
+            fprintf(stderr, "control command for recpt1.\n");
+            exit(0);
+            break;
+        case 'l':
+            show_channels();
+            exit(0);
+            break;
+        /* following options require argument */
+        case 'p':
+            key = (key_t)atoi(optarg);
+            fprintf(stderr, "Pid = %d\n", key);
+            break;
+        case 'c':
+            channel = atoi(optarg);
+            fprintf(stderr, "Channel = %d\n", channel);
+            break;
+        case 'e':
+            parse_time(optarg, &extsec);
+            fprintf(stderr, "Extend %d sec\n", extsec);
+            break;
+        case 't':
+            parse_time(optarg, &recsec);
+            fprintf(stderr, "Total recording time = %d sec\n", recsec);
+            break;
+        }
+    }
+
+    if(!key) {
+        fprintf(stderr, "Arguments are necessary!\n");
+        fprintf(stderr, "Try '%s --help' for more information.\n", argv[0]);
+        exit(1);
+    }
+
+    if ((msqid = msgget(key, msgflg )) < 0) {
+        perror("msgget");
+        exit(1);
+    }
+
+    sbuf.mtype = 1;
+    sprintf(sbuf.mtext, "ch=%d t=%d e=%d", channel, recsec, extsec);
+
+    buf_length = strlen(sbuf.mtext) + 1 ;
+
+    if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) {
+        perror("msgsnd");
+        exit(1);
+    }
+
+    exit(0);
+}