예제 #1
0
파일: trascan.c 프로젝트: bazil/tra
void
threadmain(int argc, char **argv)
{
	int i;
	Path *p;

	fmtinstall('H', encodefmt);
	fmtinstall('P', pathfmt);
	fmtinstall('R', rpcfmt);
	fmtinstall('$', statfmt);
	fmtinstall('V', vtimefmt);

	ARGBEGIN{
	case 'D':
		debug |= dbglevel(EARGF(usage()));
		break;
	case 'V':
		traversion();
	default:
		usage();
	}ARGEND

	if(argc < 1)
		usage();

	startclient();
	repl = dialreplica(argv[0]);

	argc--;
	argv++;
	fprint(2, "scan...");
	if(argc == 0){
		fprint(2, "%P...", nil);
		if(rpcstat(repl, nil) == nil)
			sysfatal("rpcstat: %s", rpcerror());
	}else{
		for(i=0; i<argc; i++){
			p = strtopath(argv[i]);
			fprint(2, "%P...", p);
			if(rpcstat(repl, p) == nil)
				sysfatal("rpcstat: %s", rpcerror());
		}
	}
	fprint(2, "hangup...");
	rpchangup(repl);
	fprint(2, "close...");
	replclose(repl);
	fprint(2, "exit\n");
	threadexitsall(nil);
}
예제 #2
0
void
chord::dispatch (ptr<asrv> s, svccb *sbp)
{
  if (!sbp) {
    s->setcb (NULL);
    return;
  }
  (*nrcv)++;
  
  dorpc_arg *arg = sbp->Xtmpl getarg<dorpc_arg> ();

  switch (sbp->proc ()) {
  case TRANSPORTPROC_NULL:
    sbp->reply (NULL);
    break;
  case TRANSPORTPROC_DORPC:
    {
      chordID v = make_chordID (arg->dest);
      vnode *vnodep = vnodes[v];
      if (!vnodep) {
	trace << "unknown vnode " << v << " for procedure "
	      << sbp->proc ()
	      << " (" << arg->progno << "." << arg->procno << ").\n";
	sbp->replyref (rpcstat (DORPC_UNKNOWNNODE));
	return;
      }
      
      //find the program
      const rpc_program *prog = get_program (arg->progno);
      if (!prog) {
	sbp->replyref (rpcstat (DORPC_NOHANDLER));
	return;
      }
      
      //unmarshall the args
      char *arg_base = (char *)(arg->args.base ());
      int arg_len = arg->args.size ();
      
      xdrmem x (arg_base, arg_len, XDR_DECODE);
      xdrproc_t proc = prog->tbl[arg->procno].xdr_arg;
      assert (proc);
      
      void *unmarshalled_args = prog->tbl[arg->procno].alloc_arg ();
      if (!proc (x.xdrp (), unmarshalled_args)) {
	warn << "dispatch: error unmarshalling arguments: "
	     << arg->progno << "." << arg->procno 
	     << " from " << v <<"\n";
        xdr_delete (prog->tbl[arg->procno].xdr_arg, unmarshalled_args);
	sbp->replyref (rpcstat (DORPC_MARSHALLERR));
	return;
      }

      //call the handler
      user_args *ua = New user_args (sbp, unmarshalled_args, 
				     prog, arg->procno, arg->send_time);
      vnodep->fill_user_args (ua);
      if (!vnodep->progHandled (arg->progno)) {
	trace << "dispatch to vnode " << v << " doesn't handle "
	      << arg->progno << "." << arg->procno << "\n";
	ua->replyref (chordstat (CHORD_NOHANDLER));
      } else {	      
	cbdispatch_t dispatch = vnodep->getHandler(arg->progno);
	(dispatch)(ua);
      }  
      
    }
    break;
  default:
    warn << "Transport procedure " << sbp->proc () << " not handled\n";
  }
}