vshelper-sync.c (2711B)
1 // $Id$ --*- c -*-- 2 3 // Copyright (C) 2004 Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de> 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; version 2 of the License. 8 // 9 // This program is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with this program; if not, write to the Free Software 16 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 17 18 19 #ifdef HAVE_CONFIG_H 20 # include <config.h> 21 #endif 22 23 #include "util.h" 24 25 #include <sys/select.h> 26 #include <stdlib.h> 27 #include <fcntl.h> 28 #include <unistd.h> 29 #include <signal.h> 30 #include <stdio.h> 31 #include <assert.h> 32 33 static void 34 showHelp(int fd, char const *cmd, int res) 35 { 36 WRITE_MSG(fd, "Usage: "); 37 WRITE_STR(fd, cmd); 38 WRITE_MSG(fd, 39 " [--] <pipe> <timeout>\n\n" 40 "Please report bugs to " PACKAGE_BUGREPORT "\n"); 41 exit(res); 42 } 43 44 static void 45 showVersion() 46 { 47 WRITE_MSG(1, 48 "vshelper-sync " VERSION " -- waits for data from a pipe" 49 "This program is part of " PACKAGE_STRING "\n\n" 50 "Copyright (C) 2004 Enrico Scholz\n" 51 VERSION_COPYRIGHT_DISCLAIMER); 52 exit(0); 53 } 54 55 int main(int argc, char *argv[]) 56 { 57 int fd; 58 int idx = 1; 59 struct timeval timeout; 60 61 if (argc>=2) { 62 if (strcmp(argv[1], "--help") ==0) showHelp(1, argv[0], 0); 63 if (strcmp(argv[1], "--version")==0) showVersion(); 64 if (strcmp(argv[1], "--") ==0) ++idx; 65 } 66 67 if (argc<idx+2) { 68 WRITE_MSG(2, "Not enough parameters; use '--help' for more information\n"); 69 return EXIT_FAILURE; 70 } 71 72 fd = open(argv[idx], O_RDONLY|O_NONBLOCK, 0); 73 if (fd==-1) { 74 perror("vshelper-sync: open()"); 75 return EXIT_FAILURE; 76 } 77 78 timeout.tv_sec = atoi(argv[idx+1]); 79 timeout.tv_usec = 0; 80 81 for (;;) { 82 char buf[512]; 83 ssize_t len; 84 fd_set fds; 85 86 FD_ZERO(&fds); 87 FD_SET(fd, &fds); 88 89 #ifndef __linux__ 90 # error vshelper relies on the Linux select() behavior (timeout holds remaining time) 91 #endif 92 93 switch (select(fd+1, &fds, 0,0, &timeout)) { 94 case 0 : return EXIT_FAILURE; // timeout 95 case -1 : 96 perror("vshelper: select()"); 97 return EXIT_FAILURE; 98 default : break; 99 } 100 101 assert(FD_ISSET(fd, &fds)); 102 103 len = read(fd,buf,sizeof buf); 104 if (len==0) break; 105 if (len==-1) { 106 perror("vshelper-sync: read()"); 107 return EXIT_FAILURE; 108 } 109 } 110 111 return EXIT_SUCCESS; 112 }