//-------------------------------------------------------------------------- // printf style debugging output //-------------------------------------------------------------------------- void FDebugBreak (const char *format, ...) { char string[kDebugPrintfBufferSize]; va_list marker; va_start (marker, format); vsnprintf (string, kDebugPrintfBufferSize, format, marker); printDebugString (string); if (neverDebugger) return; if (AmIBeingDebugged ()) { // do not crash if no debugger present // If there is an assertion handler defined then let this override the UI // and tell us whether we want to break into the debugger bool breakIntoDebugger = true; if (gAssertionHandler && gAssertionHandler (string) == false) { breakIntoDebugger = false; } if (breakIntoDebugger) { #if WINDOWS __debugbreak (); // intrinsic version of DebugBreak() #elif __ppc64__ || __ppc__ || __arm__ kill (getpid (), SIGINT); #elif __i386__ || __x86_64__ { __asm__ volatile ("int3"); } #endif } } }
//-------------------------------------------------------------------------- // printf style debugging output //-------------------------------------------------------------------------- void FDebugPrint (const char *format, ...) { char string[kDebugPrintfBufferSize]; va_list marker; va_start (marker, format); vsnprintf (string, kDebugPrintfBufferSize, format, marker); printDebugString (string); }
int main(int argc, char *argv[]) { fd_set rset; struct timeval timeout; char c[BUFFER_SIZE]; int csize; int mode; int x; int y; int args = 0; int tmp; int result; int blockerror = 0; char argSerial[] = "-serial"; char argPort[] = "-port"; char argStrip[] = "-strip"; char argBaud[] = "-baud"; char argDebug[] = "-debug"; char argInDebug[] = "-indebug"; char argOutDebug[] = "-outdebug"; char argNonblock[] = "-nonblock"; char argAux[] = "-aux"; int SOCKET_PORT = 0; int BAUD = 0; int STRIP = 0; int NONBLOCK = 0; int AUX_PORT = 0; char SERIAL[100]; for (x=1; x<argc; x++) { if (!strcmp(argSerial,argv[x])) { strcpy(SERIAL,argv[x+1]); x++; args++; } else if (!strcmp(argPort,argv[x])) { SOCKET_PORT = atoi(argv[x+1]); x++; args++; } else if (!strcmp(argBaud,argv[x])) { BAUD = parseBaudRates(argv[x+1]); if (!BAUD) return 1; x++; args++; } else if (!strcmp(argAux, argv[x])) { AUX_PORT = atoi(argv[x+1]); x++; } else if (!strcmp(argStrip,argv[x])) STRIP = 1; else if (!strcmp(argInDebug,argv[x])) INDEBUG = 1; else if (!strcmp(argOutDebug,argv[x])) OUTDEBUG = 1; else if (!strcmp(argDebug,argv[x])) INDEBUG = OUTDEBUG = 1; else if (!strcmp(argNonblock,argv[x])) NONBLOCK = 1; else { printf("ERROR!: Unknown argument %s\n", argv[x]); return 1; } } if (args < 3) { printf("--------------------------------------------------------------\n"); printf("------------------ GMU SerialDaemon ------------------------\n"); printf("--------------------------------------------------------------\n"); printf("Usage:\n"); printf("\tserialdaemon\n"); printf("\t\t-serial [serialPort]\n"); printf("\t\t-port [TCP/IP Port]\n"); printf("\t\t-aux [auxiliary TCP/IP Port]\n"); printf("\t\t-baud [baudRate]\n"); printf("\t\t\t500000 (available on Linux only)\n"); printf("\t\t\t460800 (available on Linux only)\n"); printf("\t\t\t230400\n"); printf("\t\t\t115200\n"); printf("\t\t\t57600\n"); printf("\t\t\t38400\n"); printf("\t\t\t19200\n"); printf("\t\t\t9600\n"); printf("\t\t-strip\n"); printf("\t\t-indebug\n"); printf("\t\t-outdebug\n"); printf("\t\t-debug\n"); printf("\t\t-nonblock\n"); printf("\n"); printf("Notes:\n"); printf("1) If you have declared an auxiliary port, your client program\n"); printf(" must connect to the primary TCP/IP port, THEN the auxiliary\n"); printf(" port, and both must be connected before any traffic is sent\n"); printf("2) Baud rates 460800 and 500000 are not available on OS/X\n"); return(1); } if (INDEBUG || OUTDEBUG) printf ("DEBUG: debug mode on!\n"); sockfd_pre = makeSocket(SOCKET_PORT); if (sockfd_pre <= 0) { printf("ERROR: couldn't make TCP/IP socket!\n"); closeAll(); return; } if (AUX_PORT != 0) { auxfd_pre = makeSocket(AUX_PORT); if (auxfd_pre <= 0) { printf("ERROR: couldn't make TCP/IP socket!\n"); closeAll(); return; } } serialfd = makeSerialPortFd(SERIAL, BAUD); if (serialfd <= 0) { printf("ERROR: couldn't open serial port!\n"); closeAll(); return; } if (argc <= 1) mode = 0; else mode = atoi(argv[1]); printf("Listening for data connections on port: %i\n",SOCKET_PORT); if (AUX_PORT != 0) { printf("Listening for aux connections on port: %i\n",AUX_PORT); } while(1) { /* Wait for connection on data socket */ sockfd = waitOnSocket(sockfd_pre); if (INDEBUG || OUTDEBUG) printf("DEBUG: New data socket opened.\n"); if (sockfd < 0) { closeAll(); return; } /* Set data socket to non-blocking */ if (NONBLOCK) { if (fcntl(sockfd, F_SETFL, O_NONBLOCK) != 0) { printf("ERROR: couldn't make TCP/IP socket non-blocking!\n"); closeAll(); return; } } /* Wait for connection on AUX socket (if specified) */ if (auxfd_pre != NOTHING) { auxfd = waitOnSocket(auxfd_pre); if (INDEBUG || OUTDEBUG) printf("DEBUG: New aux socket opened.\n"); if (auxfd < 0) { closeAll(); return; } } /* Must have a serial file descriptor (else, why are we running?) */ if (serialfd < 0) { closeAll(); return; } FD_ZERO(&rset); /* Main Loop */ while(1) { /* Add connections to set */ FD_SET(sockfd,&rset); if (auxfd!=NOTHING) FD_SET(auxfd,&rset); FD_SET(serialfd,&rset); /* Select on connection */ select(max(max(sockfd,auxfd),serialfd)+1,&rset,NULL,NULL,NULL); /* There's stuff to read on AUX */ if (FD_ISSET(auxfd,&rset)) { if ((csize = readline(auxfd, c, BUFFER_SIZE)) >= 1) { c[csize] = '\0'; // after length, so no problem char cmd = c[0]; if (c[1] != ' ') printf("ERROR!: Malformed AUX command; ignoring\n"); char* data = &c[2]; switch (cmd) { case 'B': if (INDEBUG) { printf("DEBUG: AUX baud change\n"); } auxShiftBaud(data); break; default: printf("ERROR!: Unknown AUX command; ignoring\n"); break; } } else break; /* Failed */ } /* There's stuff to read on SOCKET */ if (FD_ISSET(sockfd,&rset)) { if ((csize= read(sockfd, c, BUFFER_SIZE)) >= 1) { y = csize; if (STRIP==1) { for(x = 0, y = 0 ; x < csize; x++, y++) { if (c[x] == '\n') { // get rid of it y--; if (OUTDEBUG) printf ("DEBUG: **STRIPPED**\n"); } else c[y] = c[x]; } } if (OUTDEBUG) { c[y] = '\0'; // after length, so no problem printf("DEBUG: serial <=="); printDebugString(c, y); } result = write(serialfd, c, y); if (OUTDEBUG) { printf("DEBUG: wrote %d/%d\n", result, y); } } else break; /* Failed */ } /* There's stuff to read on SERIAL */ if (FD_ISSET(serialfd,&rset)) { if ((csize = read(serialfd, c, BUFFER_SIZE)) >= 1) { if (STRIP==1) { for(x = 0 ; x < csize; x++) { if (c[x] == '\r' ) { // get rid of it c[x] = '\n'; if (OUTDEBUG) printf ("DEBUG: **STRIPPED**\n"); } else c[y] = c[x]; } } if (INDEBUG) { c[csize] = '\0'; // after length, so no problem printf("DEBUG: serial ==>"); printDebugString(c, csize); } result = write(sockfd, c, csize); if (result == EWOULDBLOCK) { if (!blockerror) { blockerror = 1; printf("ERROR: dropping bytes writing to socket\n"); } } else if (INDEBUG) { printf("DEBUG: read %d/%d\n", result, csize); } } else break; /* Failed */ } } /* Restart connection-wait loop */ printf("Restarting\n"); close(sockfd); /* clean up */ } }