static void rpc_detail_call(int flags, int xid, int rpcvers, int prog, int vers, int proc, char *data, int len) { char *nameof_flavor(); char *nameof_prog(); (void) sprintf(get_line(pos, getxdr_pos()), "RPC version = %d", rpcvers); (void) sprintf(get_line(pos, getxdr_pos()), "Program = %d (%s), version = %d, procedure = %d", prog, nameof_prog(prog), vers, proc); print_creds(xid); print_verif(CALL); show_trailer(); protoprint(flags, CALL, xid, prog, vers, proc, data, len); }
static void print_message(struct debug_hdr_t *req) { struct in_addr in_addr; struct bproc_message_hdr_t *hdr; hdr = bproc_debug_msg(req); printf(" %d.%03d:%4d: ", (int)req->time.tv_sec, (int)req->time.tv_usec / 1000, hdr->size); if (req->tofrom == BPROC_DEBUG_OTHER) { switch (hdr->req) { case 1000:{ struct bproc_debug_1000_msg_t *msg; msg = bproc_debug_msg(req); printf("Process move %d %d -> %d", msg->pid, msg->last, msg->node); } break; default: printf(" ???? "); } } else { /* Routing */ printf("%8p %s %4d %c%5d->%c%5d\t", hdr->id, msg_dst_names[req->tofrom], req->node, (hdr->fromtype == BPROC_ROUTE_REAL) ? 'R' : (hdr->fromtype == BPROC_ROUTE_NODE) ? 'N' : (hdr->fromtype == BPROC_ROUTE_GHOST) ? 'G' : '?', hdr->from, (hdr->totype == BPROC_ROUTE_REAL) ? 'R' : (hdr->totype == BPROC_ROUTE_NODE) ? 'N' : (hdr->totype == BPROC_ROUTE_GHOST) ? 'G' : '?', hdr->to); printf("%-13s %c %4ld\t", desc_lookup(descs, BPROC_REQUEST(hdr->req)), BPROC_ISRESPONSE(hdr->req) ? 'R' : ' ', hdr->result); /* Misc message details */ switch (hdr->req) { case BPROC_VERSION:{ struct bproc_version_msg_t *msg; msg = bproc_debug_msg(req); printf("%s-%u-%d %Ld", msg->vers.version_string, (int)msg->vers.magic, (int)msg->vers.arch, (long long)msg->cookie); } break; case BPROC_NODE_CONF:{ struct bproc_conf_msg_t *msg; msg = bproc_debug_msg(req); printf("time=%ld.%06ld ping=%d masters=%d@%d", msg->time_sec, msg->time_usec, msg->ping_timeout, msg->masters_size, msg->masters); } break; case BPROC_NODE_PING:{ struct bproc_ping_msg_t *msg; msg = bproc_debug_msg(req); printf("time=%ld.%06ld", msg->time_sec, msg->time_usec); } break; case BPROC_RUN:{ struct bproc_move_msg_t *msg; msg = bproc_debug_msg(req); in_addr.s_addr = msg->addr; printf ("pid=%d ppid=%d addr=%s:%d chld=%d o/ppid=%d/%d", msg->pid, msg->ppid, inet_ntoa(in_addr), (int)ntohs(msg->port), msg->children, msg->ppid, msg->oppid); if (verbose_moves) { printf(" exit signal = %d\n", msg->exit_signal); printf("\n"); printf(" call_creds (@%d)\n", msg->call_creds); print_creds(hdr, msg->call_creds); printf(" proc_creds (@%d)\n", msg->proc_creds); print_creds(hdr, msg->proc_creds); } } break; case BPROC_EXEC:{ #if 0 in_addr.s_addr = req->req.bpr_move_addr; printf("addr=%s:%d chld=%d o/ppid=%d/%d", inet_ntoa(in_addr), (int)ntohs(req->req.bpr_move_port), req->req.bpr_move_children, req->req.bpr_move_ppid, req->req.bpr_move_oppid); #endif } break; case BPROC_RESPONSE(BPROC_RUN):{ struct bproc_move_msg_t *msg; msg = bproc_debug_msg(req); /* Move responses can be small... */ if (msg->hdr.size >= sizeof(*msg)) { in_addr.s_addr = msg->addr; printf("addr=%s:%d", inet_ntoa(in_addr), (int)ntohs(msg->port)); if (verbose_moves) { printf("\n"); printf (" call_creds (@%d)\n", msg->call_creds); print_creds(hdr, msg->call_creds); printf (" proc_creds (@%d)\n", msg->proc_creds); print_creds(hdr, msg->proc_creds); } } } break; case BPROC_SYS_FORK:{ struct bproc_rsyscall_msg_t *msg; msg = bproc_debug_msg(req); printf("flags=0x%lx", msg->arg[0]); } break; case BPROC_RESPONSE(BPROC_SYS_FORK):{ struct bproc_fork_resp_t *msg; msg = bproc_debug_msg(req); printf("oppid=%d ppid=%d", msg->oppid, msg->ppid); } break; case BPROC_SYS_WAIT:{ struct bproc_rsyscall_msg_t *msg; msg = bproc_debug_msg(req); printf("pid=%ld options=0x%lx", msg->arg[0], msg->arg[1]); } break; case BPROC_PTRACE:{ struct bproc_ptrace_msg_t *msg = bproc_debug_msg(req); printf("%-8.8s pid=%d addr=0x%lx data=0x%lx", desc_lookup(descs_ptrace, msg->request), msg->hdr.to, msg->addr, msg->data.data[0]); if (msg->request == PTRACE_ATTACH) { printf(" uid=%d gid=%d ce=0x%x", msg->uid, msg->gid, msg->cap_effective); } } break; case BPROC_RESPONSE(BPROC_PTRACE):{ struct bproc_ptrace_msg_t *msg = bproc_debug_msg(req); printf("%-8.8s", desc_lookup(descs_ptrace, msg->request)); if (msg->request == PTRACE_ATTACH) { printf(" nlchild_adj=%d", msg->data.data ? 1 : 0); } if (msg->request == PTRACE_PEEKDATA || msg->request == PTRACE_PEEKTEXT) { int i; printf(" addr=0x%0*lx bytes=%d", (int)sizeof(long) * 2, msg->addr, msg->bytes); /* ah fun. Cast depends on architecture type. I really love gcc */ for (i = 0; i < msg->bytes / sizeof(int); i++) printf(" %0*lx", (int)sizeof(int) * 2, ((long unsigned int *) msg->data.data)[i]); } } break; case BPROC_REPARENT:{ struct bproc_reparent_msg_t *msg = bproc_debug_msg(req); printf("ptrace=0x%x new_parent=%d", msg->ptrace, msg->new_parent); } break; case BPROC_FWD_SIG:{ struct bproc_signal_msg_t *sig = bproc_debug_msg(req); printf("sig = %d kill: pid=%d uid=%d", sig->info.si_signo, sig->info._sifields._kill._pid, sig->info._sifields._kill._uid); } break; case BPROC_SYS_SETPGID:{ struct bproc_rsyscall_msg_t *msg = bproc_debug_msg(req); printf("pid=%ld pgid=%ld", msg->arg[0], msg->arg[1]); } break; case BPROC_SYS_GETPGID:{ struct bproc_rsyscall_msg_t *msg = bproc_debug_msg(req); printf("pid=%ld", msg->arg[0]); } break; case BPROC_PGRP_CHANGE:{ struct bproc_pgrp_msg_t *msg = bproc_debug_msg(req); printf("pgid=%d", msg->pgid); } break; case BPROC_SYS_KILL:{ struct bproc_signal_msg_t *msg = bproc_debug_msg(req); printf("pid=%d sig=%d", msg->pid, msg->info.si_signo); } break; case BPROC_STOP: case BPROC_CONT: case BPROC_RESPONSE(BPROC_GET_STATUS):{ struct bproc_status_msg_t *msg = bproc_debug_msg(req); printf("state=%d exit_code=0x%x (vm=%ld %ld)", msg->state, msg->exit_code, msg->vm.statm.size, msg->vm.status.total_vm); } break; } } printf("\n"); fflush(stdout); }