/* $Id: turbodog.c,v 1.9 2004/03/26 10:17:12 jmuelmen Exp $ */ #include #include #include #include #include #include #include #include static int _init = 0; static int _sock; static struct sockaddr_in _sn, _rn; static pthread_mutex_t _mut; #define TURBOSOCK_READ_PORT 14161 #define TURBOSOCK_WRITE_PORT 14162 #define BUFSIZE 1024 int turbodog_init () { #ifdef HAVE_TURBODAQ int length; char buf[BUFSIZE]; if (pthread_mutex_init(&_mut, NULL)) perror("Initializing turbodog mutex"); /* Create socket. */ _sock = socket(AF_INET, SOCK_DGRAM, 0); if (_sock < 0) { perror("opening datagram socket"); return 1; } /* bind the socket to the TURBOSOCK_WRITE_PORT (since this is the socket that pontifex will send to) */ _rn.sin_family = AF_INET; _rn.sin_addr.s_addr = INADDR_ANY; _rn.sin_port = htons(TURBOSOCK_WRITE_PORT); if (bind(_sock, (struct sockaddr *)&_rn, sizeof(_rn))) { perror("binding datagram socket"); return 1; } length = sizeof(_rn); if (getsockname(_sock, (struct sockaddr *)&_rn, &length)) { perror("getting socket name"); return 1; } printf("Socket has port %d... ", ntohs(_rn.sin_port)); if (ntohs(_rn.sin_port) != TURBOSOCK_WRITE_PORT) { printf("we're unhappy.\n"); return 1; } else printf("we're happy.\n"); /* now make a sockaddr_in to send to */ _sn.sin_addr.s_addr = inet_addr("127.0.0.1"); printf("Sending to host 0x%x\n", ntohl(_sn.sin_addr.s_addr)); _sn.sin_family = AF_INET; _sn.sin_port = htons(TURBOSOCK_READ_PORT); _init = 1; fflush(stdout); #endif return 0; } static int td_lock () { int ret = pthread_mutex_lock(&_mut); if (ret) perror("Locking turbodog mutex"); return ret; } static int td_unlock () { int ret = pthread_mutex_unlock(&_mut); if (ret) perror("Unlocking turbodog mutex"); return ret; } int turbodaq_send_primlist (char *buf) { #ifdef HAVE_TURBODAQ int length, ret; td_lock(); if ((length = sendto(_sock, buf, strlen(buf), 0, &_sn, sizeof(_sn))) < 0) perror("sending test datagram message"); else printf("Sent %d bytes\n", length); if ((length = recv(_sock, &ret, sizeof(ret), 0)) > 0) { printf("Read %d bytes: %d\n", length, ntohl(ret)); td_unlock(); return ntohl(ret); } perror("receiving datagram packet"); td_unlock(); return -1; #else return 0; #endif } int turbodaq_release () { return turbodaq_send_primlist("exit"); } int turbodaq_set_modid (char *buf) { FILE *f_pl; char path[1024]; char primname[1024]; if (conf_get("TURBODAQ_DIR", path, sizeof(path))) { fprintf(stderr, "Configuration table doesn't contain TURBODAQ_DIR\n"); return -1; } snprintf(primname, sizeof(primname), "%s/primlists/setmodid.primlist", path); if (!(f_pl = fopen(primname, "w"))) { perror("opening primlist file"); return -1; } fprintf(f_pl, "1\nSetModuleID\n%s", buf); fclose(f_pl); return turbodaq_send_primlist("primlists/setmodid.primlist"); }