📄 ldlconfig.c
字号:
printf("do_attach: Sending DL_ATTACH_REQ\n"); request.dl_primitive = DL_ATTACH_REQ; request.dl_ppa = ppa; ctlbuf.maxlen = ctlbuf.len = sizeof(request); ctlbuf.buf = (char *) &request; if (putmsg(fd, &ctlbuf, NULL, 0) < 0) { perror("do_attach: putmsg()"); return -1; } ctlbuf.maxlen = sizeof(reply); ctlbuf.len = 0; ctlbuf.buf = (char *) &reply; flags = RS_HIPRI; if (getmsg(fd, &ctlbuf, NULL, &flags) < 0) { perror("do_attach: getmsg()"); return -1; } if (output > 2) { printf("do_attach: Buffer dump:\n"); dumpbuf(ctlbuf); } if (ctlbuf.len < sizeof(dl_ulong)) { fprintf(stderr, "do_attach: Bad reply length %d\n", ctlbuf.len); return -1; } switch (reply.ack.dl_primitive) { case DL_ERROR_ACK: printf("do_attach: Got DL_ERROR_ACK\n"); if (ctlbuf.len < sizeof(dl_error_ack_t)) { fprintf(stderr, "do_attach: Bad DL_ERROR_ACK length %d\n", ctlbuf.len); return -1; } err_ack = (dl_error_ack_t *) & reply; printf("do_attach: error ack:\n"); printf("\tprimitive=%lu, errno=%lu, unix_errno=%lu\n", err_ack->dl_error_primitive, err_ack->dl_errno, err_ack->dl_unix_errno); return -1; case DL_OK_ACK: if (output > 2) printf("do_attach: Got DL_OK_ACK\n"); if (ctlbuf.len < sizeof(dl_ok_ack_t)) { fprintf(stderr, "do_attach: Bad DL_OK_ACK length %d\n", ctlbuf.len); return -1; } if (output > 1) { printf("do_attach: ok ack:\n"); printf("\tprimitive=%lu\n", reply.ack.dl_primitive); printf("\tcorrect_primitive=%lu\n", reply.ack.dl_correct_primitive); } break; default: fprintf(stderr, "do_attach: Unknown reply primitive=%lu\n", reply.ack.dl_primitive); return -1; } return 0;}int do_promiscon(int fd, unsigned long level){ dl_promiscon_req_t request; struct { dl_ok_ack_t ack; unsigned char extra[1024]; } reply; int flags; struct strbuf ctlbuf; dl_error_ack_t *err_ack; if (output > 2) printf("do_promiscon: Sending DL_PROMISCON_REQ\n"); request.dl_primitive = DL_PROMISCON_REQ; request.dl_level = level; ctlbuf.maxlen = ctlbuf.len = sizeof(request); ctlbuf.buf = (char *) &request; if (putmsg(fd, &ctlbuf, NULL, 0) < 0) { perror("do_promiscon: putmsg()"); return -1; } ctlbuf.maxlen = sizeof(reply); ctlbuf.len = 0; ctlbuf.buf = (char *) &reply; flags = RS_HIPRI; if (getmsg(fd, &ctlbuf, NULL, &flags) < 0) { perror("do_promiscon: getmsg()"); return -1; } if (output > 2) { printf("do_promiscon: Buffer dump:\n"); dumpbuf(ctlbuf); } if (ctlbuf.len < sizeof(dl_ulong)) { fprintf(stderr, "do_promiscon: Bad reply length %d\n", ctlbuf.len); return -1; } switch (reply.ack.dl_primitive) { case DL_ERROR_ACK: printf("do_promiscon: Got DL_ERROR_ACK\n"); if (ctlbuf.len < sizeof(dl_error_ack_t)) { fprintf(stderr, "do_promiscon: Bad DL_ERROR_ACK length %d\n", ctlbuf.len); return -1; } err_ack = (dl_error_ack_t *) & reply; printf("do_promiscon: error ack:\n"); printf("\tprimitive=%lu, errno=%lu, unix_errno=%lu\n", err_ack->dl_error_primitive, err_ack->dl_errno, err_ack->dl_unix_errno); return -1; case DL_OK_ACK: if (output > 2) printf("do_promiscon: Got DL_OK_ACK\n"); if (ctlbuf.len < sizeof(dl_ok_ack_t)) { fprintf(stderr, "do_promiscon: Bad DL_OK_ACK length %d\n", ctlbuf.len); return -1; } if (output > 1) { printf("do_promiscon: ok ack:\n"); printf("\tprimitive=%lu\n", reply.ack.dl_primitive); printf("\tcorrect_primitive=%lu\n", reply.ack.dl_correct_primitive); } if (reply.ack.dl_correct_primitive != request.dl_primitive) { fprintf(stderr, "do_promiscon: " "DL_OK_ACK acks wrong primitive\n"); return -1; } break; default: fprintf(stderr, "do_promiscon: Unknown reply primitive=%lu\n", reply.ack.dl_primitive); return -1; } return 0;}int do_bind(int fd, dl_ulong sap){ dl_bind_req_t request; struct { dl_bind_ack_t ack; unsigned char extra[1024]; } reply; int flags; struct strbuf ctlbuf; dl_error_ack_t *err_ack; if (output > 2) printf("do_bind(sap=0x%lx): Sending DL_BIND_REQ\n", sap); request.dl_primitive = DL_BIND_REQ; request.dl_sap = sap; request.dl_max_conind = 0; request.dl_service_mode = DL_CLDLS; request.dl_conn_mgmt = 0; request.dl_xidtest_flg = 0; ctlbuf.maxlen = ctlbuf.len = sizeof(request); ctlbuf.buf = (char *) &request; if (putmsg(fd, &ctlbuf, NULL, 0) < 0) { perror("do_bind: putmsg()"); return -1; } ctlbuf.maxlen = sizeof(reply); ctlbuf.len = 0; ctlbuf.buf = (char *) &reply; flags = RS_HIPRI; if (getmsg(fd, &ctlbuf, NULL, &flags) < 0) { perror("do_bind: getmsg()"); return -1; } if (output > 2) { printf("do_bind: Buffer dump:\n"); dumpbuf(ctlbuf); } if (ctlbuf.len < sizeof(dl_ulong)) { fprintf(stderr, "do_bind: Bad reply length %d\n", ctlbuf.len); return -1; } switch (reply.ack.dl_primitive) { case DL_ERROR_ACK: printf("do_bind: Got DL_ERROR_ACK\n"); if (ctlbuf.len < sizeof(dl_error_ack_t)) { fprintf(stderr, "do_bind: Bad DL_ERROR_ACK length %d\n", ctlbuf.len); return -1; } err_ack = (dl_error_ack_t *) & reply; printf("do_bind: error ack:\n"); printf("\tprimitive=%lu, errno=%lu, unix_errno=%lu\n", err_ack->dl_error_primitive, err_ack->dl_errno, err_ack->dl_unix_errno); return -1; case DL_BIND_ACK: if (output > 2) printf("do_bind: Got DL_BIND_ACK\n"); if (ctlbuf.len < sizeof(dl_bind_ack_t)) { fprintf(stderr, "do_bind: Bad DL_BIND_ACK length %d\n", ctlbuf.len); return -1; } if (output > 1) { printf("do_bind: bind ack:\n"); printf("\tprimitive=%lu\n", reply.ack.dl_primitive); printf("\tsap=%lu\n", reply.ack.dl_sap); printf("\taddr_length=%lu\n", reply.ack.dl_addr_length); printf("\taddr_offset=%lu\n", reply.ack.dl_addr_offset); printf("\tmax_conind=%lu\n", reply.ack.dl_max_conind); printf("\txidtest_flg=%lu\n", reply.ack.dl_xidtest_flg); dumpbytes("\tSAP", (char *) &reply.ack + reply.ack.dl_addr_offset, reply.ack.dl_addr_length); } break; default: fprintf(stderr, "do_bind: Unknown reply primitive=%lu\n", reply.ack.dl_primitive); return -1; } return 0;}void version(int argc, char *argv[]){ if (!output) return; fprintf(stdout, "\%1$s %2$s:\n\ Copyright (c) 2003-2004 OpenSS7 Corporation. All Rights Reserved.\n\ Copyright (c) 1999 David Grothe (dave@gcom.com)\n\ Copyright (c) 1998 Ole Husgaard (sparre@login.dknet.dk)\n\\n\ Distributed by OpenSS7 Corporation under GPL Version 2,\n\ included here by reference.\n\", argv[0], ident);}void usage(int argc, char *argv[]){ if (!output) return; fprintf(stderr, "\Usage:\n\ %1$s [options]\n\ %1$s {-h,--help}\n\ %1$s {-V,--version}\n\", argv[0]);}void help(int argc, char *argv[]){ if (!output) return; fprintf(stdout, "\Usage:\n\ %1$s [options]\n\ %1$s {-h,--help}\n\ %1$s {-V,--version}\n\Options:\n\ -a, --attach NAME\n\ The name to attach\n\ -b, --bind SAP\n\ The service access point identifier to bind\n\ -d, --filedes FILEDES\n\ The integer file descriptor number to use\n\ -f, --flag FLAG\n\ A flag indicating the approoach. FLAG can be one of:\n\ PENDANTIC_STANDARD or RAW. This option may be repeated.\n\ -F, --framing FRAMING\n\ The framing to use. FRAMING can be one of: EII 802.2 802.3\n\ SNAP RAWLLC\n\ -I, --info\n\ Display the DL_INFO_ACK.\n\ -p, --promisc HOW\n\ Enter promiscuous mode. HOW can be one of: PHYS SAP PROMISC_MULTI\n\ This option may be repeated.\n\ -v, --verbose [LEVEL]\n\ Increase verbosity or set to LEVEL [default: 1]\n\ This option may be repeated.\n\ -q, --quiet\n\ Suppress normal output (equivalent to --verbose=0)\n\ -h, --help, -?, --?\n\ Print this usage message and exits\n\ -V, --version\n\ Print the version and exits\n\", argv[0]);}void get_options(int argc, char *argv[]){ for (;;) { int c;#ifdef _GNU_SOURCE int option_index = 0; static struct option long_options[] = { {"attach", 1, 0, 'a'}, {"bind", 1, 0, 'b'}, {"filedes", 1, 0, 'd'}, {"flag", 1, 0, 'f'}, {"framing", 1, 0, 'F'}, {"info", 0, 0, 'I'}, {"promisc", 1, 0, 'p'}, {"quiet", 0, 0, 'q'}, {"verbose", 2, 0, 'v'}, {"help", 0, 0, 'h'}, {"version", 0, 0, 'V'}, {"?", 0, 0, 'h'}, }; c = getopt_long_only(argc, argv, "a:b:d:f:F:Ip:qv::hV?", long_options, &option_index);#else /* _GNU_SOURCE */ c = getopt(argc, argv, "a:b:d:f:F:Ip:qv::hV?");#endif /* _GNU_SOURCE */ if (c == -1) break; switch (c) { case 0: case 'a': /* -a, --attach NAME */ if_name = optarg; break; case 'b': /* -b, --bind SAP */ bind_sap = strtol(optarg, NULL, 0); bind_specified = 1; break; case 'd': /* -d, --filedes FD */ filed = strtol(optarg, NULL, 0); break; case 'f': /* -f, --flag FLAG */ if (nxt_flag_opt >= 32) { if (output) fprintf(stderr, "%s: Too many -f options\n", argv[0]); exit(2); } if (optarg) { if (strcmp(optarg, "PEDANTIC_STANDARD") == 0) { flag_opts[nxt_flag_opt++] = LDLFLAG_PEDANTIC_STANDARD; break; } if (strcmp(optarg, "RAW") == 0) { flag_opts[nxt_flag_opt++] = LDLFLAG_RAW; break; } } goto bad_option; case 'F': /* -F, --framing FRAMING */ if (optarg) { if (strcmp(optarg, "EII") == 0) { framing = LDL_FRAME_EII; break; } if (strcmp(optarg, "802.2") == 0) { framing = LDL_FRAME_802_2; break; } if (strcmp(optarg, "802.3") == 0) { framing = LDL_FRAME_802_3; break; } if (strcmp(optarg, "SNAP") == 0) { framing = LDL_FRAME_SNAP; break; } if (strcmp(optarg, "RAWLLC") == 0) { framing = LDL_FRAME_RAW_LLC; break; } } goto bad_option; case 'I': /* -I, --info */ print_info = 1; break; case 'p': /* -p, --promisc */ if (nxt_promisc_opt >= 32) { if (output) fprintf(stderr, "%s: Too many -p options\n", argv[0]); exit(2); } if (optarg) { if (strcmp(optarg, "PHYS") == 0) { promisc_opts[nxt_promisc_opt++] = DL_PROMISC_PHYS; break; } if (strcmp(optarg, "SAP") == 0) { promisc_opts[nxt_promisc_opt++] = DL_PROMISC_SAP; break; } if (strcmp(optarg, "PROMISC_MULTI") == 0) { promisc_opts[nxt_promisc_opt++] = DL_PROMISC_MULTI; break; } } goto bad_option; case 'q': /* -q, --quiet */ output = 0; break; case 'v': /* -v, --verbose LEVEL */ if (optarg == NULL) output++; else { int val; if ((val = strtol(optarg, NULL, 0)) < 0) goto bad_option; output = val; } break; case 'h': /* -h, --help, -? --? */ help(argc, argv); exit(0); case 'V': /* -V, --version */ version(argc, argv); exit(0); case '?': default: bad_option: optind--; bad_nonopt: if (optind < argc && output) { fprintf(stderr, "%s: illegal syntax -- ", argv[0]); for (; optind < argc; optind++) fprintf(stderr, "%s ", argv[optind]); fprintf(stderr, "\n"); } usage(argc, argv); exit(2); } } /* * don't ignore non-option arguments */ if (optind < argc) goto bad_nonopt;}int main(int argc, char *argv[]){ int fd; int i; unsigned long ppa; get_options(argc, argv); if (filed >= 0) fd = filed; else { fd = open("/dev/ldl", O_RDWR); if (fd < 0) { perror("/dev/ldl"); exit(1); } } ppa = do_findppa(fd, if_name); if (ppa == (unsigned long) -1) { fprintf(stderr, "Unable to find PPA for interface \"%s\".\n", if_name); exit(1); } if (do_attach(fd, ppa | framing) < 0) exit(1); for (i = 0; i < nxt_flag_opt; i++) { if (do_set_flags(fd, flag_opts[i]) < 0) exit(1); } for (i = 0; i < nxt_promisc_opt; i++) { if (do_promiscon(fd, promisc_opts[i]) < 0) exit(1); } if (bind_specified && do_bind(fd, bind_sap) < 0) exit(1); if (print_info) { if (output > 2) printf("INFO after ATTACH and BIND:\n"); if (do_info(fd) < 0) exit(1); } exit(0); /* everything is OK */ return (0);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -