⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ldlconfig.c

📁 7号信令功能代码,为开源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	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 + -