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); }
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); }
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; }