home *** CD-ROM | disk | FTP | other *** search
- /* roscli.c
- * Roscli source file
- * (c) Chris Rutter 1997
- */
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "os:socket.h"
- #include "os:osfile.h"
- #include "wimplib:socket.h"
- #include "wimplib:types.h"
-
- extern void close_sock (void);
- socket_s sock = socket_UNUSED;
-
- int main (int argc, char *argv[])
- {
- int argp = 1, base = 1, n;
- struct hostent *hostaddr;
- socket_sockaddr addr;
- static char command[256], host[64], spool[256], col[256];
- bool wimp = FALSE;
-
- if (argc < 3)
- {
- printf ("Syntax: *roscli [-wimp] <host> <command>\n");
- exit (1);
- }
-
- if (!strcmp (argv[1], "-wimp"))
- {
- wimp = TRUE;
- base++;
- }
-
- for (n = base+1; n<argc; n++)
- {
- strcat (col, argv[n]);
- if (n<argc-1) strcat (col, " ");
- }
-
- os_gs_trans (col, command, 256, 0);
- os_gs_trans (argv[base], host, 64, 0);
-
- if ((hostaddr = gethostbyname (host)) == NULL)
- {
- printf ("Error: failed to resolve %s.\n", host);
- exit (1);
- }
-
- addr.sockaddr_in.af = socket_AF_INET;
- addr.sockaddr_in.port = htons (8805);
- bzero (addr.sockaddr_in.data, 8);
- memcpy (&addr.sockaddr_in.addr, hostaddr->h_addr, hostaddr->h_length);
-
- sock = socket_creat (socket_AF_INET, socket_SOCK_DGRAM, socket_IPPROTO_UDP);
- atexit (close_sock);
-
- socket_setsockopt (sock, socket_SOL_SOCKET, socket_SO_REUSEADDR, (byte *) &argp, sizeof argp);
-
- if (command[0] == '*')
- {
- os_gs_trans (" { > <OscliD$Spool> }", spool, 256, 0);
- strcat (command, spool);
- remove ("<OscliD$Spool>");
- }
-
- if (wimp)
- {
- char temp[256];
- strcpy (temp, command);
- sprintf (command, "OscliD_Task %s", temp);
- }
-
- socket_sendto (sock, (byte *) command, strlen (command) + 1, 0x00, &addr, sizeof (addr));
-
- if (command[0] == '*')
- {
- FILE *output;
- while ((output = fopen ("<OscliD$Spool>", "r")) == NULL)
- {
- /* wait for output to appear */
- }
- fclose (output);
- osfile_set_type ("<OscliD$Spool>", 0xfff);
- if (fsize ("<OscliD$Spool>")) xos_cli ("Filer_Run <OscliD$Spool>");
- }
- }
-
- void close_sock ()
- {
- if (sock != socket_UNUSED)
- {
- xsocket_close (sock);
- sock = socket_UNUSED;
- }
- }
-