ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/RCU/helper.c
Revision: 1.1
Committed: Sun Nov 6 17:17:37 2005 UTC (19 years, 1 month ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: HEAD
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 #include <sys/time.h>
2     #include <sys/types.h>
3     #include <unistd.h>
4     #include <stdlib.h>
5     #include <stdio.h>
6     #include <string.h>
7    
8     /* return filehandle */
9     static int if_init (int argc, char *argv[]);
10     static void if_exit (int fd);
11     static void if_parse (int fd);
12    
13     void
14     tx_error (const char *err)
15     {
16     char buf[512];
17     write (1, buf, snprintf (buf, sizeof (buf), "E%s", err) + 1);
18     }
19    
20     void
21     tx_abort (const char *err)
22     {
23     if (err)
24     tx_error (err);
25    
26     exit (1);
27     }
28    
29     void tx_code (const char *raw, const char *cooked)
30     {
31     char buf[512];
32     struct timeval tv;
33    
34     gettimeofday (&tv, 0);
35     write (1, buf, snprintf (buf, sizeof (buf), "=%ld.%06ld\x01%s\x01%s",
36     tv.tv_sec, tv.tv_usec,
37     raw, cooked) + 1);
38     }
39    
40     #define USAGE "This program should only be called by the perl RCU module\n"
41     #define MAX(a,b) ((a) > (b) ? (a) : (b))
42    
43     int
44     main (int argc, char *argv[])
45     {
46     int ifd;
47    
48     if (argc < 2)
49     {
50     write (1, USAGE, sizeof USAGE);
51     exit (1);
52     }
53    
54     ifd = if_init (argc - 2, argv + 2);
55    
56     if (ifd >= 0)
57     {
58     write (1, "I", 2); /* I<nul> */
59    
60     for(;;)
61     {
62     fd_set fds;
63    
64     FD_ZERO (&fds);
65     FD_SET (ifd, &fds);
66     FD_SET (0, &fds);
67    
68     if (select (ifd + 1, &fds, 0, 0, 0) >= 0)
69     {
70     if (FD_ISSET (0, &fds))
71     break;
72    
73     if (FD_ISSET (ifd, &fds))
74     if_parse (ifd);
75     }
76     }
77     }
78     else
79     tx_abort ("unable to set-up ir-link");
80    
81     if_exit (ifd);
82    
83     return 0;
84     }