Home | History | Annotate | Line # | Download | only in cris
rvdummy.c revision 1.1.1.2
      1      1.1  christos /* Test-driver for the remote-virtual-component simulator framework
      2      1.1  christos    for GDB, the GNU Debugger.
      3      1.1  christos 
      4  1.1.1.2  christos    Copyright 2006-2013 Free Software Foundation, Inc.
      5      1.1  christos 
      6      1.1  christos    This file is part of GDB.
      7      1.1  christos 
      8      1.1  christos    This program is free software; you can redistribute it and/or modify
      9      1.1  christos    it under the terms of the GNU General Public License as published by
     10      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     11      1.1  christos    (at your option) any later version.
     12      1.1  christos 
     13      1.1  christos    This program is distributed in the hope that it will be useful,
     14      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     15      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16      1.1  christos    GNU General Public License for more details.
     17      1.1  christos 
     18      1.1  christos    You should have received a copy of the GNU General Public License
     19      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     20      1.1  christos 
     21      1.1  christos /* Avoid any problems whatsoever building this program if we're not
     22      1.1  christos    also building hardware support.  */
     23      1.1  christos 
     24      1.1  christos #if !WITH_HW
     25      1.1  christos int
     26      1.1  christos main (int argc, char *argv[])
     27      1.1  christos {
     28      1.1  christos   return 2;
     29      1.1  christos }
     30      1.1  christos #else
     31      1.1  christos 
     32      1.1  christos #ifdef HAVE_CONFIG_H
     33      1.1  christos #include "cconfig.h"
     34      1.1  christos #include "tconfig.h"
     35      1.1  christos #endif
     36      1.1  christos 
     37      1.1  christos #include "getopt.h"
     38      1.1  christos #include "libiberty.h"
     39      1.1  christos 
     40      1.1  christos #define _GNU_SOURCE
     41      1.1  christos #include <stdio.h>
     42      1.1  christos 
     43      1.1  christos #ifdef HAVE_UNISTD_H
     44      1.1  christos #include <unistd.h>
     45      1.1  christos #endif
     46      1.1  christos #ifdef HAVE_STDLIB_H
     47      1.1  christos #include <stdlib.h>
     48      1.1  christos #endif
     49      1.1  christos #ifdef HAVE_STRING_H
     50      1.1  christos #include <string.h>
     51      1.1  christos #endif
     52      1.1  christos 
     53      1.1  christos #ifdef HAVE_SYS_TYPES_H
     54      1.1  christos #include <sys/types.h>
     55      1.1  christos #endif
     56      1.1  christos 
     57      1.1  christos #ifdef HAVE_SYS_TIME_H
     58      1.1  christos #include <sys/time.h>
     59      1.1  christos #endif
     60      1.1  christos 
     61      1.1  christos #ifdef HAVE_SYS_SELECT_H
     62      1.1  christos #include <sys/select.h>
     63      1.1  christos #endif
     64      1.1  christos 
     65      1.1  christos #ifdef HAVE_ERRNO_H
     66      1.1  christos #include <errno.h>
     67      1.1  christos #endif
     68      1.1  christos 
     69      1.1  christos /* Not guarded in dv-sockser.c, so why here.  */
     70      1.1  christos #include <netinet/in.h>
     71      1.1  christos #include <arpa/inet.h>
     72      1.1  christos #include <netdb.h>
     73      1.1  christos #include <sys/socket.h>
     74      1.1  christos 
     75      1.1  christos enum rv_command {
     76      1.1  christos   RV_READ_CMD = 0,
     77      1.1  christos   RV_WRITE_CMD = 1,
     78      1.1  christos   RV_IRQ_CMD = 2,
     79      1.1  christos   RV_MEM_RD_CMD = 3,
     80      1.1  christos   RV_MEM_WR_CMD = 4,
     81      1.1  christos   RV_MBOX_HANDLE_CMD = 5,
     82      1.1  christos   RV_MBOX_PUT_CMD = 6,
     83      1.1  christos   RV_WATCHDOG_CMD = 7
     84      1.1  christos };
     85      1.1  christos 
     86      1.1  christos enum opts { OPT_PORT = 1, OPT_TIMEOUT, OPT_VERBOSE };
     87      1.1  christos 
     88      1.1  christos struct option longopts[] =
     89      1.1  christos   {
     90      1.1  christos     {"port", required_argument, NULL, OPT_PORT},
     91      1.1  christos     {"timeout", required_argument, NULL, OPT_TIMEOUT},
     92      1.1  christos     {"verbose", no_argument, NULL, OPT_VERBOSE},
     93      1.1  christos     {NULL, 0, NULL, 0}
     94      1.1  christos   };
     95      1.1  christos 
     96      1.1  christos int port = 10000;
     97      1.1  christos time_t timeout = 30000;
     98      1.1  christos char *progname = "(unknown)";
     99      1.1  christos int verbose = 0;
    100      1.1  christos 
    101      1.1  christos /* Required forward-declarations.  */
    102      1.1  christos static void handle_input_file (int, char *);
    103      1.1  christos 
    104      1.1  christos /* Set up a "server" listening to the port in PORT for a raw TCP
    105      1.1  christos    connection.  Return a file descriptor for the connection or -1 on
    106      1.1  christos    error.  */
    107      1.1  christos 
    108      1.1  christos int setupsocket (void)
    109      1.1  christos {
    110      1.1  christos   int s;
    111      1.1  christos   socklen_t len;
    112      1.1  christos   int reuse = 1;
    113      1.1  christos   struct sockaddr_in sa_in;
    114      1.1  christos   struct sockaddr_in from;
    115      1.1  christos 
    116      1.1  christos   len = sizeof (from);
    117      1.1  christos   memset (&from, 0, len);
    118      1.1  christos   memset (&sa_in, 0, sizeof (sa_in));
    119      1.1  christos 
    120      1.1  christos   s = socket (AF_INET, SOCK_STREAM, 0);
    121      1.1  christos   if (s == -1)
    122      1.1  christos     return -1;
    123      1.1  christos 
    124      1.1  christos   if (setsockopt (s, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof reuse) != 0)
    125      1.1  christos     return -1;
    126      1.1  christos 
    127      1.1  christos   sa_in.sin_port = htons (port);
    128      1.1  christos   sa_in.sin_family = AF_INET;
    129      1.1  christos 
    130      1.1  christos   if (bind (s, (struct sockaddr *) & sa_in, sizeof sa_in) < 0)
    131      1.1  christos     return -1;
    132      1.1  christos 
    133      1.1  christos   if (listen (s, 1) < 0)
    134      1.1  christos     return -1;
    135      1.1  christos 
    136      1.1  christos   return accept (s, (struct sockaddr *) &from, &len);
    137      1.1  christos }
    138      1.1  christos 
    139      1.1  christos /* Basic host-to-little-endian 32-bit value.  Could use the BFD
    140      1.1  christos    machinery, but let's avoid it for this only dependency.  */
    141      1.1  christos 
    142      1.1  christos static void
    143      1.1  christos h2le32 (unsigned char *dest, unsigned int val)
    144      1.1  christos {
    145      1.1  christos   dest[0] = val & 255;
    146      1.1  christos   dest[1] = (val >> 8) & 255;
    147      1.1  christos   dest[2] = (val >> 16) & 255;
    148      1.1  christos   dest[3] = (val >> 24) & 255;
    149      1.1  christos }
    150      1.1  christos 
    151      1.1  christos /* Send a blob of data.  */
    152      1.1  christos 
    153      1.1  christos static void
    154      1.1  christos send_output (int fd, unsigned char *buf, int nbytes)
    155      1.1  christos {
    156      1.1  christos   while (nbytes > 0)
    157      1.1  christos     {
    158      1.1  christos       ssize_t written = write (fd, buf, nbytes);
    159      1.1  christos       if (written < 0)
    160      1.1  christos 	{
    161      1.1  christos 	  fprintf (stderr, "%s: write to socket failed: %s\n",
    162      1.1  christos 		  progname, strerror (errno));
    163      1.1  christos 	  exit (2);
    164      1.1  christos 	}
    165      1.1  christos       nbytes -= written;
    166      1.1  christos     }
    167      1.1  christos }
    168      1.1  christos 
    169      1.1  christos /* Receive a blob of data, NBYTES large.  Compare to the first NCOMP
    170      1.1  christos    bytes of BUF; if not a match, write error message to stderr and
    171      1.1  christos    exit (2).  Else put it in buf.  */
    172      1.1  christos 
    173      1.1  christos static void
    174      1.1  christos expect_input (int fd, unsigned char *buf, int nbytes, int ncomp)
    175      1.1  christos {
    176      1.1  christos   unsigned char byt;
    177      1.1  christos   int i;
    178      1.1  christos 
    179      1.1  christos   for (i = 0; i < nbytes; i++)
    180      1.1  christos     {
    181      1.1  christos       int r;
    182      1.1  christos 
    183      1.1  christos       do
    184      1.1  christos 	{
    185      1.1  christos 	  errno = 0;
    186      1.1  christos 	  r = read (fd, &byt, 1);
    187      1.1  christos 	}
    188      1.1  christos       while (r <= 0 && (r == 0 || errno == EAGAIN));
    189      1.1  christos 
    190      1.1  christos       if (r != 1)
    191      1.1  christos 	{
    192      1.1  christos 	  fprintf (stderr, "%s: read from socket failed: %s",
    193      1.1  christos 		  progname, strerror (errno));
    194      1.1  christos 	  exit (2);
    195      1.1  christos 	}
    196      1.1  christos 
    197      1.1  christos       if (i < ncomp && byt != buf[i])
    198      1.1  christos 	{
    199      1.1  christos 	  int j;
    200      1.1  christos 	  fprintf (stderr, "%s: unexpected input,\n ", progname);
    201      1.1  christos 	  if (i == 0)
    202      1.1  christos 	    fprintf (stderr, "nothing,");
    203      1.1  christos 	  else
    204      1.1  christos 	    for (j = 0; j < i; j++)
    205      1.1  christos 	      fprintf (stderr, "%02x", buf[j]);
    206      1.1  christos 	  fprintf (stderr, "\nthen %02x instead of %02x\n", byt, buf[i]);
    207      1.1  christos 	  exit (2);
    208      1.1  christos 	}
    209      1.1  christos       else
    210      1.1  christos 	buf[i] = byt;
    211      1.1  christos     }
    212      1.1  christos }
    213      1.1  christos 
    214      1.1  christos /* Handle everything about a nil-terminated line of input.
    215      1.1  christos    Call exit (2) on error with error text on stderr.  */
    216      1.1  christos 
    217      1.1  christos static void
    218      1.1  christos handle_input (int fd, char *buf, char *fname, int lineno)
    219      1.1  christos {
    220      1.1  christos   int nbytes = 0;
    221      1.1  christos   int n = -1;
    222      1.1  christos   char *s = buf + 2;
    223      1.1  christos   unsigned int data;
    224      1.1  christos   static unsigned char bytes[1024];
    225      1.1  christos   int i;
    226      1.1  christos 
    227      1.1  christos   memset (bytes, 0, sizeof bytes);
    228      1.1  christos   lineno++;
    229      1.1  christos 
    230      1.1  christos   if (buf[1] != ',')
    231      1.1  christos     goto syntax_error;
    232      1.1  christos 
    233      1.1  christos   switch (buf[0])
    234      1.1  christos     {
    235      1.1  christos       /* Comment characters and empty lines.  */
    236      1.1  christos     case 0: case '!': case '#':
    237      1.1  christos       break;
    238      1.1  christos 
    239      1.1  christos       /* Include another file.  */
    240      1.1  christos     case '@':
    241      1.1  christos       handle_input_file (fd, s);
    242      1.1  christos       break;
    243      1.1  christos 
    244      1.1  christos       /* Raw input (to be expected).  */
    245      1.1  christos     case 'i':
    246      1.1  christos       do
    247      1.1  christos 	{
    248      1.1  christos 	  n = -1;
    249      1.1  christos 	  sscanf (s, "%02x%n", &data, &n);
    250      1.1  christos 	  s += n;
    251      1.1  christos 	  if (n > 0)
    252      1.1  christos 	    bytes[nbytes++] = data;
    253      1.1  christos 	}
    254      1.1  christos       while (n > 0);
    255      1.1  christos       expect_input (fd, bytes, nbytes, nbytes);
    256      1.1  christos       if (verbose)
    257      1.1  christos 	{
    258      1.1  christos 	  printf ("i,");
    259      1.1  christos 	  for (i = 0; i < nbytes; i++)
    260      1.1  christos 	    printf ("%02x", bytes[i]);
    261      1.1  christos 	  printf ("\n");
    262      1.1  christos 	}
    263      1.1  christos       break;
    264      1.1  christos 
    265      1.1  christos       /* Raw output (to be written).  */
    266      1.1  christos     case 'o':
    267      1.1  christos       do
    268      1.1  christos 	{
    269      1.1  christos 	  n = -1;
    270      1.1  christos 	  sscanf (s, "%02x%n", &data, &n);
    271      1.1  christos 	  if (n > 0)
    272      1.1  christos 	    {
    273      1.1  christos 	      s += n;
    274      1.1  christos 	      bytes[nbytes++] = data;
    275      1.1  christos 	    }
    276      1.1  christos 	}
    277      1.1  christos       while (n > 0);
    278      1.1  christos       if (*s != 0)
    279      1.1  christos 	goto syntax_error;
    280      1.1  christos       send_output (fd, bytes, nbytes);
    281      1.1  christos       if (verbose)
    282      1.1  christos 	{
    283      1.1  christos 	  printf ("o,");
    284      1.1  christos 	  for (i = 0; i < nbytes; i++)
    285      1.1  christos 	    printf ("%02x", bytes[i]);
    286      1.1  christos 	  printf ("\n");
    287      1.1  christos 	}
    288      1.1  christos       break;
    289      1.1  christos 
    290      1.1  christos       /* Read a register.  */
    291      1.1  christos     case 'r':
    292      1.1  christos       {
    293      1.1  christos 	unsigned int addr;
    294      1.1  christos 	sscanf (s, "%x,%x%n", &addr, &data, &n);
    295      1.1  christos 	if (n < 0 || s[n] != 0)
    296      1.1  christos 	  goto syntax_error;
    297      1.1  christos 	bytes[0] = 11;
    298      1.1  christos 	bytes[1] = 0;
    299      1.1  christos 	bytes[2] = RV_READ_CMD;
    300      1.1  christos 	h2le32 (bytes + 3, addr);
    301      1.1  christos 	expect_input (fd, bytes, 11, 7);
    302      1.1  christos 	h2le32 (bytes + 7, data);
    303      1.1  christos 	send_output (fd, bytes, 11);
    304      1.1  christos 	if (verbose)
    305      1.1  christos 	  printf ("r,%x,%x\n", addr, data);
    306      1.1  christos       }
    307      1.1  christos       break;
    308      1.1  christos 
    309      1.1  christos       /* Write a register.  */
    310      1.1  christos     case 'w':
    311      1.1  christos       {
    312      1.1  christos 	unsigned int addr;
    313      1.1  christos 	sscanf (s, "%x,%x%n", &addr, &data, &n);
    314      1.1  christos 	if (n < 0 || s[n] != 0)
    315      1.1  christos 	  goto syntax_error;
    316      1.1  christos 	bytes[0] = 11;
    317      1.1  christos 	bytes[1] = 0;
    318      1.1  christos 	bytes[2] = RV_WRITE_CMD;
    319      1.1  christos 	h2le32 (bytes + 3, addr);
    320      1.1  christos 	h2le32 (bytes + 7, data);
    321      1.1  christos 	expect_input (fd, bytes, 11, 11);
    322      1.1  christos 	send_output (fd, bytes, 11);
    323      1.1  christos 	if (verbose)
    324      1.1  christos 	  printf ("w,%x,%x\n", addr, data);
    325      1.1  christos       }
    326      1.1  christos       break;
    327      1.1  christos 
    328      1.1  christos       /* Wait for some milliseconds.  */
    329      1.1  christos     case 't':
    330      1.1  christos       {
    331      1.1  christos 	int del = 0;
    332      1.1  christos 	struct timeval to;
    333      1.1  christos 	sscanf (s, "%d%n", &del, &n);
    334      1.1  christos 	if (n < 0 || s[n] != 0 || del == 0)
    335      1.1  christos 	  goto syntax_error;
    336      1.1  christos 
    337      1.1  christos 	to.tv_sec = del / 1000;
    338      1.1  christos 	to.tv_usec = (del % 1000) * 1000;
    339      1.1  christos 
    340      1.1  christos 	if (select (0, NULL, NULL, NULL, &to) != 0)
    341      1.1  christos 	  {
    342      1.1  christos 	    fprintf (stderr, "%s: problem waiting for %d ms:\n %s\n",
    343      1.1  christos 		     progname, del, strerror (errno));
    344      1.1  christos 	    exit (2);
    345      1.1  christos 	  }
    346      1.1  christos 	if (verbose)
    347      1.1  christos 	  printf ("t,%d\n", del);
    348      1.1  christos       }
    349      1.1  christos       break;
    350      1.1  christos 
    351      1.1  christos       /* Expect a watchdog command.  */
    352      1.1  christos     case 'W':
    353      1.1  christos       if (*s != 0)
    354      1.1  christos 	goto syntax_error;
    355      1.1  christos       bytes[0] = 3;
    356      1.1  christos       bytes[1] = 0;
    357      1.1  christos       bytes[2] = RV_WATCHDOG_CMD;
    358      1.1  christos       expect_input (fd, bytes, 3, 3);
    359      1.1  christos       if (verbose)
    360      1.1  christos 	printf ("W\n");
    361      1.1  christos       break;
    362      1.1  christos 
    363      1.1  christos       /* Send an IRQ notification.  */
    364      1.1  christos     case 'I':
    365      1.1  christos       sscanf (s, "%x%n", &data, &n);
    366      1.1  christos       if (n < 0 || s[n] != 0)
    367      1.1  christos 	goto syntax_error;
    368      1.1  christos       bytes[0] = 7;
    369      1.1  christos       bytes[1] = 0;
    370      1.1  christos       bytes[2] = RV_IRQ_CMD;
    371      1.1  christos       h2le32 (bytes + 3, data);
    372      1.1  christos       send_output (fd, bytes, 7);
    373      1.1  christos       if (verbose)
    374      1.1  christos 	printf ("I,%x\n", data);
    375      1.1  christos       break;
    376      1.1  christos 
    377      1.1  christos       /* DMA store (to CPU).  */
    378      1.1  christos     case 's':
    379      1.1  christos       {
    380      1.1  christos 	unsigned int addr;
    381      1.1  christos 	sscanf (s, "%x,%n", &addr, &n);
    382      1.1  christos 
    383      1.1  christos 	if (n < 0 || s[n] == 0)
    384      1.1  christos 	  goto syntax_error;
    385      1.1  christos 	s += n;
    386      1.1  christos 	do
    387      1.1  christos 	  {
    388      1.1  christos 	    n = -1;
    389      1.1  christos 	    sscanf (s, "%02x%n", &data, &n);
    390      1.1  christos 	    if (n > 0)
    391      1.1  christos 	      {
    392      1.1  christos 		s += n;
    393      1.1  christos 		bytes[11 + nbytes++] = data;
    394      1.1  christos 	      }
    395      1.1  christos 	  }
    396      1.1  christos 	while (n > 0);
    397      1.1  christos 
    398      1.1  christos 	if (*s != 0)
    399      1.1  christos 	  goto syntax_error;
    400      1.1  christos 	h2le32 (bytes, nbytes + 11);
    401      1.1  christos 	bytes[2] = RV_MEM_WR_CMD;
    402      1.1  christos 	h2le32 (bytes + 3, addr);
    403      1.1  christos 	h2le32 (bytes + 7, nbytes);
    404      1.1  christos 	send_output (fd, bytes, nbytes + 11);
    405      1.1  christos 	if (verbose)
    406      1.1  christos 	  {
    407      1.1  christos 	    printf ("s,%x,", addr);
    408      1.1  christos 	    for (i = 0; i < nbytes; i++)
    409      1.1  christos 	      printf ("%02x", bytes[i]);
    410      1.1  christos 	    printf ("\n");
    411      1.1  christos 	  }
    412      1.1  christos       }
    413      1.1  christos       break;
    414      1.1  christos 
    415      1.1  christos       /* DMA load (from CPU).  */
    416      1.1  christos     case 'l':
    417      1.1  christos       {
    418      1.1  christos 	unsigned int addr;
    419      1.1  christos 	sscanf (s, "%x,%n", &addr, &n);
    420      1.1  christos 
    421      1.1  christos 	if (n < 0 || s[n] == 0)
    422      1.1  christos 	  goto syntax_error;
    423      1.1  christos 	s += n;
    424      1.1  christos 	do
    425      1.1  christos 	  {
    426      1.1  christos 	    n = -1;
    427      1.1  christos 	    sscanf (s, "%02x%n", &data, &n);
    428      1.1  christos 	    if (n > 0)
    429      1.1  christos 	      {
    430      1.1  christos 		s += n;
    431      1.1  christos 		bytes[11 + nbytes++] = data;
    432      1.1  christos 	      }
    433      1.1  christos 	  }
    434      1.1  christos 	while (n > 0);
    435      1.1  christos 
    436      1.1  christos 	if (*s != 0)
    437      1.1  christos 	  goto syntax_error;
    438      1.1  christos 	h2le32 (bytes, nbytes + 11);
    439      1.1  christos 	bytes[0] = 11;
    440      1.1  christos 	bytes[1] = 0;
    441      1.1  christos 	bytes[2] = RV_MEM_RD_CMD;
    442      1.1  christos 	h2le32 (bytes + 3, addr);
    443      1.1  christos 	h2le32 (bytes + 7, nbytes);
    444      1.1  christos 	send_output (fd, bytes, 11);
    445      1.1  christos 	bytes[0] = (nbytes + 11) & 255;
    446      1.1  christos 	bytes[1] = ((nbytes + 11) >> 8) & 255;
    447      1.1  christos 	expect_input (fd, bytes, nbytes + 11, nbytes + 11);
    448      1.1  christos 	if (verbose)
    449      1.1  christos 	  {
    450      1.1  christos 	    printf ("l,%x,", addr);
    451      1.1  christos 	    for (i = 0; i < nbytes; i++)
    452      1.1  christos 	      printf ("%02x", bytes[i]);
    453      1.1  christos 	    printf ("\n");
    454      1.1  christos 	  }
    455      1.1  christos       }
    456      1.1  christos       break;
    457      1.1  christos 
    458      1.1  christos     syntax_error:
    459      1.1  christos     default:
    460      1.1  christos       fprintf (stderr, "%s: invalid command line in %s:%d:\n %s",
    461      1.1  christos 	       progname, fname, lineno, strerror (errno));
    462      1.1  christos       exit (2);
    463      1.1  christos     }
    464      1.1  christos }
    465      1.1  christos 
    466      1.1  christos /* Loop over the contents of FNAME, using handle_input to parse each line.
    467      1.1  christos    Errors to stderr, exit (2).  */
    468      1.1  christos 
    469      1.1  christos static void
    470      1.1  christos handle_input_file (int fd, char *fname)
    471      1.1  christos {
    472      1.1  christos   static char buf[2048] = {0};
    473      1.1  christos   int lineno = 0;
    474      1.1  christos   FILE *f = fopen (fname, "r");
    475      1.1  christos 
    476      1.1  christos   if (f == NULL)
    477      1.1  christos     {
    478      1.1  christos       fprintf (stderr, "%s: problem opening %s: %s\n",
    479      1.1  christos 	       progname, fname, strerror (errno));
    480      1.1  christos       exit (2);
    481      1.1  christos     }
    482      1.1  christos 
    483      1.1  christos   /* Let's cut the buffer short, so we always get a newline.  */
    484      1.1  christos   while (fgets (buf, sizeof (buf) - 1, f) != NULL)
    485      1.1  christos     {
    486      1.1  christos       buf[strlen (buf) - 1] = 0;
    487      1.1  christos       lineno++;
    488      1.1  christos       handle_input (fd, buf, fname, lineno);
    489      1.1  christos     }
    490      1.1  christos 
    491      1.1  christos   fclose (f);
    492      1.1  christos }
    493      1.1  christos 
    494      1.1  christos int
    495      1.1  christos main (int argc, char *argv[])
    496      1.1  christos {
    497      1.1  christos   int optc;
    498      1.1  christos   int fd;
    499      1.1  christos   FILE *f;
    500      1.1  christos   int i;
    501      1.1  christos 
    502      1.1  christos   progname = argv[0];
    503      1.1  christos   while ((optc = getopt_long (argc, argv, "", longopts, NULL)) != -1)
    504      1.1  christos     switch (optc)
    505      1.1  christos       {
    506      1.1  christos       case OPT_PORT:
    507      1.1  christos 	port = atoi (optarg);
    508      1.1  christos 	break;
    509      1.1  christos 
    510      1.1  christos       case OPT_TIMEOUT:
    511      1.1  christos 	timeout = (time_t) atoi (optarg);
    512      1.1  christos 	break;
    513      1.1  christos 
    514      1.1  christos       case OPT_VERBOSE:
    515      1.1  christos 	verbose = 1;
    516      1.1  christos 	break;
    517      1.1  christos       }
    518      1.1  christos 
    519      1.1  christos   fd = setupsocket ();
    520      1.1  christos   if (fd == -1)
    521      1.1  christos     {
    522      1.1  christos       fprintf (stderr, "%s: problem setting up the connection: %s\n",
    523      1.1  christos 	       progname, strerror (errno));
    524      1.1  christos       exit (2);
    525      1.1  christos     }
    526      1.1  christos 
    527      1.1  christos   for (i = optind; i < argc; i++)
    528      1.1  christos     handle_input_file (fd, argv[i]);
    529      1.1  christos 
    530      1.1  christos   /* FIXME: option-controlled test for remaining input?  */
    531      1.1  christos   close (fd);
    532      1.1  christos   return 1;
    533      1.1  christos }
    534      1.1  christos #endif
    535