// StopAmiVNC - A tool to stop AmiVNC (Amiga experimental VNC server)

// Includes ***********************************************
// Needed to compile : SDK AmiTCP 4.3
#include <exec/types.h>
#include <exec/memory.h>
#include <devices/input.h>
#include <devices/inputevent.h>
#include <libraries/commodities.h>
#include <proto/all.h>
#include <proto/socket.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <fcntl.h>
#include <ctype.h>

// Specific Inculdes ***********************************************
#include "rfbproto.h"                   // Structures & constants for VNC protocol

// Constants ***********************************************
#define XDC_PORT 5900                   // Port # for bind()
#define FALSE 0
#define TRUE 1
#undef PARANO

// Common messages
char XDC_ID[] = "StopAmiVNC 0.0.1 May 28 1999";
char XDC_SEND[] = "main.c / main : send() error";
char XDC_RECV[] = "main.c / main : recv() error";

// Global variables ***********************************************
LONG iMasterSocket = NULL;

// Exit
void vCleanExit(char *cMsg, long lCode)
{
    if (iMasterSocket) CloseSocket(iMasterSocket);
    
    printf("StopAmiVNC - %s (%ld)\n", cMsg, lCode);
}

// Main entry point  ***********************************************
int main(int argc, char **argv)
{
    struct sockaddr_in sAddr;                  // Local address for bind()
    rfbProtocolVersionMsg mProtVerMsg;
    int iPort = XDC_PORT;

    // Prepare listener socket
    if (-1 == (iMasterSocket = socket(AF_INET, SOCK_STREAM, 0)))
        vCleanExit("main.c / main : socket() error", Errno());
    
    // Connect to server
    sAddr.sin_family = AF_INET;
    sAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    sAddr.sin_port = htons(iPort);

    if (-1 == connect(iMasterSocket, (struct sockaddr *) &sAddr, sizeof(sAddr)))
        vCleanExit("main.c / main : connect() error", Errno());
    
    // NegociateProtocolVersion, sending 0/0 as version to force server to exit
    if (-1 == (recv(iMasterSocket, mProtVerMsg, sz_rfbProtocolVersionMsg, 0)))
        vCleanExit(XDC_RECV, Errno());

    sprintf((char *) mProtVerMsg, rfbProtocolVersionFormat, 0, 0);

    if (-1 == (send(iMasterSocket, (UBYTE *) mProtVerMsg, sz_rfbProtocolVersionMsg, 0)))
        vCleanExit(XDC_SEND, Errno());
    
    vCleanExit("StopAmiVNC : asked server to stop", 0);
}
