home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 3 / TheARMClub_PDCD3.iso / programs / programming / osclid / roscli / c / roscli
Encoding:
Text File  |  1997-12-06  |  2.0 KB  |  99 lines

  1. /* roscli.c
  2.  * Roscli source file
  3.  * (c) Chris Rutter 1997
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include "os:socket.h"
  10. #include "os:osfile.h"
  11. #include "wimplib:socket.h"
  12. #include "wimplib:types.h"
  13.  
  14. extern void close_sock (void);
  15. socket_s sock = socket_UNUSED;
  16.  
  17. int main (int argc, char *argv[])
  18. {
  19.     int argp = 1, base = 1, n;
  20.     struct hostent *hostaddr;
  21.     socket_sockaddr addr;
  22.     static char command[256], host[64], spool[256], col[256];
  23.     bool wimp = FALSE;
  24.  
  25.     if (argc < 3)
  26.     {
  27.         printf ("Syntax: *roscli [-wimp] <host> <command>\n");
  28.         exit (1);
  29.     }
  30.  
  31.     if (!strcmp (argv[1], "-wimp"))
  32.     {
  33.         wimp = TRUE;
  34.         base++;
  35.     }
  36.  
  37.     for (n = base+1; n<argc; n++)
  38.     {
  39.         strcat (col, argv[n]);
  40.         if (n<argc-1) strcat (col, " ");
  41.     }
  42.  
  43.     os_gs_trans (col, command, 256, 0);
  44.     os_gs_trans (argv[base], host, 64, 0);
  45.  
  46.     if ((hostaddr = gethostbyname (host)) == NULL)
  47.     {
  48.         printf ("Error: failed to resolve %s.\n", host);
  49.         exit (1);
  50.     }
  51.  
  52.      addr.sockaddr_in.af = socket_AF_INET;
  53.      addr.sockaddr_in.port = htons (8805);
  54.      bzero (addr.sockaddr_in.data, 8);
  55.      memcpy (&addr.sockaddr_in.addr, hostaddr->h_addr, hostaddr->h_length);
  56.  
  57.     sock = socket_creat (socket_AF_INET, socket_SOCK_DGRAM, socket_IPPROTO_UDP);
  58.     atexit (close_sock);
  59.  
  60.     socket_setsockopt (sock, socket_SOL_SOCKET, socket_SO_REUSEADDR, (byte *) &argp, sizeof argp);
  61.  
  62.     if (command[0] == '*')
  63.     {
  64.         os_gs_trans (" { > <OscliD$Spool> }", spool, 256, 0);
  65.         strcat (command, spool);
  66.         remove ("<OscliD$Spool>");
  67.     }
  68.  
  69.     if (wimp)
  70.     {
  71.         char temp[256];
  72.         strcpy (temp, command);
  73.         sprintf (command, "OscliD_Task %s", temp);
  74.     }
  75.  
  76.     socket_sendto (sock, (byte *) command, strlen (command) + 1, 0x00, &addr, sizeof (addr));
  77.  
  78.     if (command[0] == '*')
  79.     {
  80.         FILE *output;
  81.         while ((output = fopen ("<OscliD$Spool>", "r")) == NULL)
  82.         {
  83.             /* wait for output to appear */
  84.         }
  85.         fclose (output);
  86.         osfile_set_type ("<OscliD$Spool>", 0xfff);
  87.         if (fsize ("<OscliD$Spool>")) xos_cli ("Filer_Run <OscliD$Spool>");
  88.     }
  89. }
  90.  
  91. void close_sock ()
  92. {
  93.     if (sock != socket_UNUSED)
  94.     {
  95.         xsocket_close (sock);
  96.         sock = socket_UNUSED;
  97.     }
  98. }
  99.