Listing 4. Ttchmodd: ToolTalk Message Receiver

void ToolTalkCB (w, clientData, callData)
/*  widget id     */
Widget     w;
/*  data from application   */
xTpointer       clientData;
/*  data from widget class  */
XtPointer       callData;
{
Tt_message incoming;
Tt_status ttrc;
int ttmark, args;
char *filename;
char *mode;
char command[BUFSIZ];
XmString xmcmd;
ttmark = tt_mark();
incoming = tt_message_receive();
ToolTalkAbort("ToolTalkCB():
   tt_message_receive",
   tt_ptr_error(incoming));
if (incoming && (0 ==
   strcmp(tt_message_op(incoming), "Chmod")))
   {
   args = tt_message_args_count(incoming);
   ToolTalkAbort("ToolTalkCB():
      tt_message_args_count",
      tt_int_error(args));
   filename = tt_message_arg_val(incoming, 0);
   ToolTalkAbort("ToolTalkCB():
      tt_message_arg_val",
      tt_ptr_error(filename));
   mode = tt_message_arg_val(incoming, 1);
   ToolTalkAbort("ToolTalkCB():
      tt_message_arg_val",
      tt_ptr_error(mode));
   ttrc = tt_message_reply(incoming);
   ToolTalkAbort("ToolTalkCB():
      tt_message_destroy", ttrc);
   sprintf(command,
      "/bin/chmod %s %s\n",
      mode, filename);
   xmcmd = XmStringCreateLocalized(command);
   XmCommandSetValue(w, xmcmd);
   XmStringFree(xmcmd);
   }
else {
   printf("ToolTalkCB(): unknown message %s.\n",
      tt_message_op(incoming));
   }
ttrc = tt_message_destroy(incoming);
ToolTalkAbort("ToolTalkCB():
   tt_message_destroy", ttrc);
tt_release(ttmark);
}
ToolTalkAbort(char *procname, Tt_status errid)
{
if (tt_is_err(errid)) {
   fprintf(stderr,
      "%s returned ToolTalk error: %s\n",
      procname, tt_status_message(errid));
   exit(1);
   }
}