Beispiel #1
0
BOOL InitLocks(char *service, char *host, int port)
{
   /* Set up the port address                                           */
   if(port == 0)
   {
      if((sPort = atoport(service, "tcp")) < 0)
      {
         sPort = htons(DEFAULT_QLPORT);
      }
   }
   else
   {
      sPort = htons(port);
   }

   /* Get an address for the remote server                              */
   if((sAddr=atoaddr(host))==NULL)
      return(FALSE);

   /* Fill in an address structure for the remote server                */
   memset((char *) &sAddress, 0, sizeof(sAddress));
   sAddress.sin_family = AF_INET;
   sAddress.sin_port = sPort;
   sAddress.sin_addr.s_addr = sAddr->s_addr;

   
   return(TRUE);
}
Beispiel #2
0
int makeConnection(char *service,int type,char *netaddress)
{
    int
        port=(-1);

    struct in_addr
        *addr;

    int
        sockfd,
        connected;

    struct sockaddr_in
        address;

    if (type == SOCK_STREAM)
        port=atoport(service,"tcp");

    if (type == SOCK_DGRAM)
        port=atoport(service,"udp");

    if (port == -1)
    {
        (void) fprintf (stderr,"makeConnection: Invalid socket type\n");
        return (-1);
    }

    addr=atoaddr(netaddress);
    if (addr == (struct in_addr *) NULL)
    {
        (void) fprintf (stderr,"makeConnection: Invalid network address\n");
        return (-1);
    }

    memset((char *) &address,0,sizeof(address));
    address.sin_family=AF_INET;
    address.sin_port=port;
    address.sin_addr.s_addr=addr->s_addr;

    sockfd=socket(AF_INET,type,0);

    if (type == SOCK_STREAM)
    {
        connected=connect(sockfd,(struct sockaddr *) &address,
            sizeof(address));

        if (connected < 0)
        {
            perror("connect");
            return (-1);
        }

        return (sockfd);
    }

    /*
    ** must be udp
    */

    if (bind(sockfd,(struct sockaddr *) &address,sizeof(address)) < 0)
    {
        perror ("bind");
        return (-1);
    }
    return (sockfd);
}
Beispiel #3
0
int main(int argc, char **argv) {

  /*Set default values for tty device, server port and background operation*/
  char ttydev[1024];
  strncpy(ttydev, "/dev/ttyS0", 1023);
  char serverport[1024];
  strncpy(serverport, "3376", 1023);
  int auth = FALSE;
  int verbose = FALSE;
  
  /*Find options on the commandline*/
  int c;
  extern char *optarg;
  
  while ((c = getopt(argc, argv, "s:p:dv")) != -1) {
    switch(c) {
      case 's':
        strncpy(ttydev, optarg, 1023);
        break;
      case 'p':
        strncpy(serverport, optarg, 1023);
	break;
      case 'd':
        background = TRUE;
	break;
      case 'a':
        auth = TRUE;
	break;
      case 'v':
        verbose = TRUE;
	break;
      case '?':
        print_usage();
    }
  }
  
  /*open camera interface*/
  VISCA_open_interface(&interface, &camera, ttydev);
  
  /*Set up some signal handling*/
  ignore_pipe();
  struct sigaction sa;  
  sigemptyset(&sa.sa_mask);
  sa.sa_flags = 0;
  sa.sa_handler = sig_chld;
  sigaction(SIGCHLD, &sa, NULL);
  sa.sa_handler = sig_abort;
  sigaction(SIGINT, &sa, NULL);
  sigaction(SIGQUIT, &sa, NULL);
  sigaction(SIGTERM, &sa, NULL);

  /*initialize network stuff - taken from socket-faq*/
  int port = -1;
  port = atoport(serverport, "tcp");
  if (port == -1) {
    fprintf(stderr,"Unable to find service: %s\n",serverport);
    exit(1);
  }

  /*check for lock file*/
  struct stat tempstat;
  if (stat("/var/lock/visca-daemon.lock", &tempstat) == 0) {
    fprintf(stderr, "Lockfile /var/lock/visca-daemon.lock exists\nMaybe another visca-daemo is running already?\n\n");
    exit(1);      
  }

  /*go to background if the user wants us to*/
  if (background == TRUE) {
    if(daemon(0,0) != 0) {
      fprintf(stderr,"Unable to detach from console\n");
      exit(1);
    }
    openlog("visca-daemon", 0, LOG_DAEMON);
  }

  mknod("/var/lock/visca-daemon.lock", S_IFREG, 0);
  
  if (background == TRUE) {
    syslog(LOG_INFO, "Visca Camera daemon started.\n");
  } else {
    fprintf(stderr, "Visca Camera daemon started.\n");
  } 
  
  /*Wait for a client to make connections*/
  /*forking is handled by sockhelp.c from the socket-faq*/
  int sock = get_connection(SOCK_STREAM, port, &listensock);
  connectsock = sock;
  if (background == TRUE) {
    syslog(LOG_INFO, "New connection established\n");
  } else {
    fprintf(stderr, "New connection established\n");
  } 

  /*Greet the user*/
  char buffer[1024];
  sock_puts(sock,"Welcome to the VISCA camera server\n");
  
  int connected = 1;
  int errorcode;
  int ret1, ret2, ret3;
  while (connected) {
    /* Read input */
    if (sock_gets(sock, buffer, 1024) < 0) {
      connected = 0;
    } else if (buffer[0]=='\0') {
      connected = 0;    
    } else {
      if (verbose == TRUE) {
        if (background == TRUE) {
          syslog(LOG_INFO, "Command received: %s\n", buffer);
	} else {
          fprintf(stderr, "Command received: %s\n", buffer);
	}
      }
      errorcode = VISCA_doCommand(buffer, &ret1, &ret2, &ret3, &interface, &camera);
      switch(errorcode) {
        case 10:
	  snprintf(buffer, 1023, "10 OK - no return value\n");
          break;
        case 11:
	  snprintf(buffer, 1023, "11 OK - one return value\nRET1: %i\n", ret1);
          break;    
        case 12:
	  snprintf(buffer, 1023, "12 OK - two return values\nRET1: %i\nRET2: %i\n", ret1, ret2);
          break;
        case 13:
	  snprintf(buffer, 1023, "13 OK - three return values\nRET1: %i\nRET2: %i\nRET3: %i\n", ret1, ret2, ret3);
          break;
        case 40:
	  snprintf(buffer, 1023, "40 ERROR - command not recognized\n");
          break;
        case 41:
	  snprintf(buffer, 1023, "41 ERROR - argument 1 not recognized\n");
          break;
        case 42:
	  snprintf(buffer, 1023, "42 ERROR - argument 2 not recognized\n");
          break;
        case 43:
	  snprintf(buffer, 1023, "43 ERROR - argument 3 not recognized\n");
          break;
        case 44:
	  snprintf(buffer, 1023, "44 ERROR - argument 4 not recognized\n");
          break;
        case 45:
	  snprintf(buffer, 1023, "45 ERROR - argument 5 not recognized\n");
          break;
        case 46:
	  snprintf(buffer, 1023, "46 ERROR - camera replied with an error\n");
          break;
        case 47:
	  snprintf(buffer, 1023, "47 ERROR - camera replied with an unknown return value\n");
          break;
        default:
	  snprintf(buffer, 1023, "unknown error code: %i\n", errorcode);
      }
      if (verbose == TRUE) {
        if (background == TRUE) {
          syslog(LOG_INFO, "Answer sent: %s", buffer);
	} else {
          fprintf(stderr, "Answer sent: %s", buffer);
	}
      }

      if (sock_puts(sock, buffer) < 0) {
        connected = 0;
      }
    }
  }
  if (background == TRUE) {
    syslog(LOG_INFO, "Connection closed\n");
  } else {
    fprintf(stderr, "Connection closed\n");
  }
  close(sock);
  return 0;
}