5 #include <X11/StringDefs.h>
6 #include <X11/Xaw/Text.h>
8 #include <moira_site.h>
10 extern void AriRegisterAthena();
12 typedef struct _ClusterResources {
16 static XrmOptionDescRec options[] = {
17 {"-server", "*moiraServer", XrmoptionSepArg, NULL},
20 #define Offset(field) (XtOffset(ClusterResources *, field))
22 static XtResource my_resources[] = {
23 {"moiraServer", XtCString, XtRString, sizeof(String),
24 Offset(server), XtRImmediate, "" },
29 void getClusters(), getMachines(), localErrorHandler(), mr_x_input();
31 XtActionsRec actions[] = {
32 { "getClusters", getClusters },
33 { "getMachines", getMachines },
37 ClusterResources resources;
40 char *clusters[256], *machines[100];
41 int nclusters = 0, nmachines = 0;
52 if ((program_name = rindex(argv[0], '/')) == NULL)
53 program_name = argv[0];
56 program_name = strsave(program_name);
59 * Intialize Toolkit creating the application shell, and get
60 * application resources.
62 appShell = XtInitialize("cluster", "Cluster",
63 options, XtNumber(options),
65 app = XtWidgetToApplicationContext(appShell);
66 XtAppSetErrorHandler(app, localErrorHandler);
67 dpy = XtDisplay(appShell);
68 XtAppAddActions(app, actions, XtNumber(actions));
69 XtGetApplicationResources(appShell, (caddr_t) &resources,
70 my_resources, XtNumber(my_resources),
72 WcRegisterCallback(app, "getClusters", getClusters, NULL);
73 /* Register all Athena widget classes */
74 AriRegisterAthena(app);
76 status = mr_connect(resources.server);
78 com_err(program_name, status, " connecting to server");
82 status = mr_motd(&motd);
84 com_err(program_name, status, " connecting to server");
88 fprintf(stderr, "The Moira server is currently unavailable:\n%s\n",
94 status = mr_auth("cluster");
95 if (status == MR_USER_AUTH) {
97 com_err(program_name, status, "\nPress [RETURN] to continue");
100 com_err(program_name, status, "; authorization failed - may need to run kinit");
104 /* Create widget tree below toplevel shell using Xrm database */
105 WcWidgetCreation(appShell);
107 * Realize the widget tree, finish up initializing,
108 * and enter the main application loop
110 XtRealizeWidget(appShell);
111 mr_set_alternate_input(ConnectionNumber(dpy), mr_x_input);
116 int collect(argc, argv, sq)
119 struct save_queue *sq;
121 sq_save_args(argc, argv, sq);
129 struct save_queue *sq;
133 XtSetArg(args[0], XtNstring, &clu);
134 XtGetValues(WcFullNameToWidget(appShell, "*clufilter"), args, 1);
135 status = MoiraQuery("get_cluster", 1, &clu, collect, sq);
137 com_err(program_name, status, " while fetching clusters");
138 while (sq_get_data(sq, &argv)) {
139 /* add_to_widget("*clusterlist", argv[0]); */
140 clusters[nclusters++] = argv[0];
142 XawListChange(WcFullNameToWidget(appShell, "*clusterlist"),
143 clusters, nclusters, 0, False);
150 /* Called from within the toolkit */
151 void localErrorHandler(s)
154 fprintf(stderr, "Moira X error: %s\n", s);
163 XtAppNextEvent(_XtDefaultAppContext(), &event);
164 XtDispatchEvent(&event);
168 int MoiraQuery(query, argc, argv, callback, data)
177 /* MakeWatchCursor(toplevel); */
178 status = mr_query(query, argc, argv, callback, data);
179 if (status != MR_ABORTED && status != MR_NOT_CONNECTED) {
180 /* MakeNormalCursor(toplevel); */
183 status = mr_connect(resources.server);
185 com_err(program_name, status, " while re-connecting to server %s",
187 /* MakeNormalCursor(toplevel); */
190 status = mr_auth("mmoira");
192 com_err(program_name, status, " while re-authenticating to server %s",
195 /* MakeNormalCursor(toplevel); */
198 status = mr_query(query, argc, argv, callback, data);
199 /* MakeNormalCursor(toplevel); */
210 XawTextPosition size;
215 sprintf(buf, "%s\n", s);
216 w = WcFullNameToWidget(appShell, wn);
218 com_err(program_name, 0, " unable to find widget \"%s\"", wn);
220 tb.length = strlen(s);
223 XtSetArg(args[0], XtNlength, &size);
224 XtGetValues(w, args, 1);
225 ret = XawTextReplace(w, size, size, &tb);
226 if (ret != XawEditDone)
227 fprintf(stderr, "Text Edit failed: %d\n", ret);