int main(int argc, char **argv) { int help_flag = 0; int aahelp_flag = 0; int justoutput_flag = 0; int loadavg_flag = 0; int ipc_flag = 0; int port_num = DEFPORT; int max_iterations = 0; int delay = 0; int normal_load; int socket_fd = -1; float randomizestyletime = 0; float randomizesitetime = 0; char *endptr; setlocale(LC_ALL, ""); bindtextdomain("aajm", LOCALEDIR); textdomain("aajm"); char options[] = "aljhip:n:d:m:t:s:T:S:"; static struct option long_options[] = { {"help", no_argument, &help_flag, 1}, {"aahelp", no_argument, &aahelp_flag, 1}, {"justoutput", no_argument, &justoutput_flag, 1}, {"ipc", no_argument, &ipc_flag, 1}, {"loadavg", no_argument, &loadavg_flag, 1}, {"maxiterations", required_argument, 0, 'm'}, {"port", required_argument, 0, 'p'}, {"normalload", required_argument, 0, 'n'}, {"delay", required_argument, 0, 'd'}, {"siteswap", required_argument, 0, 's'}, {"style", required_argument, 0, 't'}, {"rstyle", required_argument, 0, 'S'}, {"rsiteswap", required_argument, 0, 'T'}, {0,0,0,0} }; normal_load = (int)(DEFLOAD * 100); char optch; int option_index = 0; //jmlib = new JMLib(errorCB); jmlib = JMLib::alloc(); jmlib->setPatternDefault(); jmlib->setStyleDefault(); jmlib->startJuggle(); aa_parseoptions(NULL, NULL, &argc, argv); while( (optch = getopt_long(argc,argv,options, long_options,&option_index)) != -1) switch(optch) { case 's': jmlib->setPattern("Something",optarg, HR_DEF, DR_DEF); break; case 't': jmlib->setStyle(optarg); break; case 'S': randomizesitetime = strtod(optarg, &endptr); if (endptr==optarg || *endptr != 0) { randomizesitetime = DEFRANDOMSITETIME; } break; case 'T': randomizestyletime = strtod(optarg, &endptr); if (endptr==optarg || *endptr != 0) { randomizestyletime = DEFRANDOMSTYLETIME; } break; case 'h': help_flag=1; break; case 'a': aahelp_flag=1; break; case 'j': justoutput_flag=1; break; case 'm': max_iterations = atoi(optarg); break; case 'd': delay = atoi(optarg); break; case 'l': loadavg_flag=1; break; case 'n': normal_load = (int)(100*atof(optarg)); break; case 'i': ipc_flag=1; break; case 'p': port_num=atoi(optarg); break; } if(aahelp_flag || help_flag) { printf(gettext("AAJM, An ASCII Art Juggling program\n")); printf(gettext("Usage: %s [OPTIONS]\n"),argv[0]); } if(help_flag) { printf(gettext("Jugglemaster Options:\n")); printf(gettext(" -s, --siteswap=XX show siteswap XX (3)\n")); printf(gettext(" -t, --style=XX use style XX (\"Normal\")\n")); printf(gettext(" -S, --rsiteswap=XX Randomize siteswap every XX seconds (%f)\n"), DEFRANDOMSITETIME); printf(gettext(" -T, --rstyle=XX Randomize style every XX seconds (%f)\n"), DEFRANDOMSTYLETIME); printf(gettext(" -d, --delay=XX delay XX ms between frames (%i)\n"), (int)DEFSPEED/1000); printf(gettext(" -m, --maxiterations=XX do at most XX iterations\n")); printf(gettext(" -j, --justoutput only output [don't init kb or mouse]\n")); printf(gettext(" -i, --ipc enable IPC\n")); printf(gettext(" -p, --port=XX use port XX for IPC (%i)\n"),DEFPORT); printf(gettext(" -l, --loadavg change speed based on load average\n")); printf(gettext(" -n, --normalload=XX a normal load average for your machine (%2.2f)\n"),DEFLOAD); printf(gettext(" -h, --help get help [this screen]\n")); printf(gettext(" -a, --aahelp get help on AA options\n\n")); } if(aahelp_flag) { printf(gettext("AALib Options:\n%s\n\n"),aa_help); } if(aahelp_flag || help_flag) { return 0; } context = aa_autoinit(&aa_defparams); if (context == NULL) { printf(gettext("Failed to initialize aalib\n")); exit(1); } if(!justoutput_flag) { aa_autoinitkbd(context, 0); aa_hidecursor(context); } params = aa_getrenderparams(); jmlib->setWindowSize(aa_imgwidth(context),aa_imgheight(context)); jmlib->startJuggle(); aa_resizehandler(context, resizehandler); if(loadavg_flag) { /* If we're doing that thing where we care, then this can go down to as-low-as-possible priority */ nice(19); } if(ipc_flag) { socket_fd = startlistening(port_num); } main_loop(max_iterations,delay,loadavg_flag,normal_load, socket_fd, randomizestyletime, randomizesitetime); if(socket_fd > 0) { stoplistening(socket_fd); } aa_close(context); delete jmlib; return 1; }
/* * ------------------------------------------------------------ */ int main(int argc, char **argv) { /* In general, suffix "l" is low channel, "h" is high channel, "g" * is gdb channel, "c" is control channel and "o" is output channel. */ struct sockaddr_in from; int infd = 0, outfd; unsigned short portl, porth, portg, portc, porto; int on = 1, c; char *outname, *outservice; int fromlen; int lish, lisg, lisc; #if 0 FILE *newerr; #endif /* 0 */ prog_name = argv[0]; if (isatty(infd)) usage(); /* Here, then not just a simple idiot. */ signal(SIGPIPE, SIG_IGN); openlog(prog_name, LOG_PID, LOG_DAEMON); fromlen = sizeof(from); if (getsockname(infd, &from, &fromlen) < 0) fault("getsockname: %s", strerror(errno)); if ((fromlen != sizeof(from)) || (from.sin_family != AF_INET)) fault("not an inet socket (family=%d)\n", from.sin_family); portl = ntohs(from.sin_port); porth = portl+1; portg = porth+1; portc = portg+1; fromlen = sizeof(from); if (getpeername(infd, &from, &fromlen) < 0) fault("getpeername: %s", strerror(errno)); if ((fromlen != sizeof(from)) || (from.sin_family != AF_INET)) fault("not an inet socket (family=%d)\n", from.sin_family); syslog(LOG_INFO, "on port %u peer is %s:%u\n", portl, inet_ntoa(from.sin_addr), ntohs(from.sin_port)); if (setsockopt(infd, SOL_SOCKET, SO_KEEPALIVE, &on, sizeof (on)) < 0) syslog(LOG_WARNING, "setsockopt (SO_KEEPALIVE): %m"); /* from here on, we map stderr to output on the connection so we can * report errors to the remote user. */ #if 0 if (!(newerr = fdopen(infd, "w"))) syslog(LOG_WARNING, "fdopen: %m"); else *stderr = *newerr; #endif while((c = getopt(argc, argv, "d8h:g:c:")) != EOF) { switch(c) { case 'd': debug++; break; case 'h': /* high bit port */ if (getservice(optarg, &porth) < 0) fault("getservice failed (high port '%s')\n", optarg); break; case 'g': /* gdb port */ if (getservice(optarg, &portg) < 0) fault("getservice failed (gdb port '%s')\n", optarg); break; case 'c': /* control port */ if (getservice(optarg, &portc) < 0) fault("getservice failed (control port '%s')\n", optarg); break; case '8': /* 8-bit clean; no high port */ porth=0; break; default: fault("bad argument list!\n"); } } if (argc != optind + 1) fault("unparsed arguments (%d!=%d)\n", argc, optind+1); outname = argv[optind]; if (!(outservice = strchr(outname, ':'))) fault("output arg '%s' doesn't contain ':'\n", outname); *outservice++ = 0; if (getservice(outservice, &porto) < 0) fault("getservice failed (output port '%s')\n", outservice); /* Time to start the sockets */ if (porth) { lish = startlistening(porth); } else { lish = -1; } lisg = startlistening(portg); lisc = startlistening(portc); outfd = connect_host(outname, porto); doit(infd, outfd, lish, lisg, lisc); syslog(LOG_INFO, "terminating normally\n"); fclose(stderr); closelog(); exit(0); }