00001 #include <stdio.h>
00002 #include "machdefs.h"
00003 #include "util.h"
00004 #include "tsp.h"
00005
00006 static int receive_dominos (CC_SFILE * s),
00007 parseargs (int ac,
00008 char **av);
00009
00010 static void usage (char *f);
00011
00012 static int graphid = 1;
00013 static int sendgraph = 0;
00014 static int stopboss = 0;
00015 static int getdominos = 0;
00016 static char *hostname = (char *) NULL;
00017
00018 int main (int ac,
00019 char **av)
00020 {
00021 CC_SFILE *s = (CC_SFILE *) NULL;
00022 int rval = 0;
00023
00024 rval = parseargs (ac, av);
00025 if (rval)
00026 return 0;
00027
00028 CCutil_printlabel ();
00029
00030 s = CCutil_snet_open (hostname, CCtsp_DOMINO_PORT);
00031 if (!s)
00032 {
00033 fprintf (stderr, "CCutil_snet_open failed\n");
00034 rval = 1;
00035 goto CLEANUP;
00036 }
00037
00038 if (stopboss)
00039 {
00040 printf ("stop the boss\n");
00041 fflush (stdout);
00042 rval = CCutil_swrite_char (s, CCtsp_DOMINO_EXIT);
00043 CCcheck_rval (rval, "CCutil_swrite_char failed (EXIT)");
00044 }
00045 else if (sendgraph)
00046 {
00047 printf ("Send graph id = %d\n", graphid);
00048 fflush (stdout);
00049 rval = CCutil_swrite_char (s, CCtsp_DOMINO_GRAPH);
00050 CCcheck_rval (rval, "CCutil_swrite_char failed (GRAPH)");
00051 rval = CCutil_swrite_int (s, graphid);
00052 CCcheck_rval (rval, "CCutil_swrite_int failed");
00053 rval = CCutil_swrite_int (s, 2 * graphid);
00054 CCcheck_rval (rval, "CCutil_swrite_int failed");
00055 rval = CCutil_swrite_int (s, 3 * graphid);
00056 CCcheck_rval (rval, "CCutil_swrite_int failed");
00057 }
00058 else if (getdominos)
00059 {
00060 printf ("get the domino list\n");
00061 fflush (stdout);
00062 rval = CCutil_swrite_char (s, CCtsp_DOMINO_SEND);
00063 CCcheck_rval (rval, "CCutil_swrite_char failed (SEND)");
00064 rval = receive_dominos (s);
00065 CCcheck_rval (rval, "receive_dominos failed");
00066 }
00067 else
00068 {
00069 printf ("Nothing to do.\n");
00070 fflush (stdout);
00071 }
00072
00073 CLEANUP:
00074
00075 if (s)
00076 CCutil_sclose (s);
00077 return rval;
00078 }
00079
00080 static int parseargs (int ac,
00081 char **av)
00082 {
00083 int c;
00084 int boptind = 1;
00085 char *boptarg = (char *) NULL;
00086
00087 while ((c = CCutil_bix_getopt (ac, av, "xg:d", &boptind, &boptarg)) != EOF)
00088 {
00089 switch (c)
00090 {
00091 case 'x':
00092 stopboss = 1;
00093 break;
00094 case 'g':
00095 sendgraph = 1;
00096 graphid = atoi (boptarg);
00097 break;
00098 case 'd':
00099 getdominos = 1;
00100 break;
00101 default:
00102 usage (av[0]);
00103 return 1;
00104 }
00105 }
00106
00107 if (boptind >= ac)
00108 {
00109 usage (av[0]);
00110 return 1;
00111 }
00112 hostname = av[boptind++];
00113 if (boptind != ac)
00114 {
00115 usage (av[0]);
00116 return 1;
00117 }
00118
00119 return 0;
00120 }
00121
00122 static int receive_dominos (CC_SFILE * s)
00123 {
00124 int rval = 0;
00125 int i,
00126 count;
00127 int *list = (int *) NULL;
00128
00129 rval = CCutil_sread_int (s, &count);
00130 CCcheck_rval (rval, "CCutil_sread_int failed (count)");
00131
00132 list = CC_SAFE_MALLOC (count, int);
00133 CCcheck_NULL (list, "out memory for list");
00134
00135 for (i = 0; i < count; i++)
00136 {
00137 rval = CCutil_sread_int (s, &list[i]);
00138 CCcheck_rval (rval, "CCutil_sread_int failed (list)");
00139 }
00140
00141 printf ("Dom List: %d\n", count);
00142 for (i = 0; i < count; i++)
00143 {
00144 printf ("%d ", list[i]);
00145 }
00146 printf ("\n");
00147 fflush (stdout);
00148
00149 CLEANUP:
00150
00151 CC_IFFREE (list, int);
00152 return rval;
00153 }
00154
00155 static void usage (char *f)
00156 {
00157 fprintf (stderr, "Usage: %s [-see below-] hostname\n", f);
00158 fprintf (stderr, " -d tells the boss to send dominos\n");
00159 fprintf (stderr, " -g # sends graph is id #\n");
00160 fprintf (stderr, " -x tells the boss to exit\n");
00161 }