File: iwmulticall.c

package info (click to toggle)
wireless-tools 30~pre9-12
  • links: PTS
  • area: main
  • in suites: stretch
  • size: 1,632 kB
  • ctags: 4,575
  • sloc: ansic: 13,804; sh: 209; makefile: 154
file content (143 lines) | stat: -rw-r--r-- 4,138 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*
 *	Wireless Tools
 *
 *		Jean II - HPL 04
 *
 * Main code for "iwmulticall". This is a wrapper for the multicall version
 * of the wireless tools.
 * You need to link this code against "-lm".
 * Thanks to Ned Ludd <solar@gentoo.org> for the inspiration...
 *
 * This file is released under the GPL license.
 *     Copyright (c) 1997-2004 Jean Tourrilhes <jt@hpl.hp.com>
 */

/***************************** INCLUDES *****************************/

#include <libgen.h>	/* Basename */

/**************************** PROTOTYPES ****************************/

/* Prototypes of the main of each tool */
extern int
	main_iwconfig(int	argc,
		      char **	argv);
extern int
	main_iwlist(int	argc,
		    char **	argv);
extern int
	main_iwspy(int	argc,
		   char **	argv);
extern int
	main_iwpriv(int	argc,
		    char **	argv);
extern int
	main_iwgetid(int	argc,
		     char **	argv);

/************************** MULTICALL HACK **************************/
/*
 * The idea for multicall is to put all the tools and the library in
 * the same binary. This way, you can save the overhead of the library,
 * of each tool, can better optimise the code and throw away the stuff
 * you don't need from the library.
 * This almost divide the size of the tools by two (without stripping).
 * On the down side, you no longer have the libiw for other tools to
 * use, but for the target systems (embedded), this doesn't matter
 * much, as they just need to configure the card...
 * Note that splitting the lib and the multicall tools would not
 * make sense, as most gains are found in the inclusion of the lib...
 *
 * Our strategy is to include directly the *.c, rather than compile
 * them separatly. This allow to simplify compilation and hide the
 * multicall tweaks from the other tools.
 * Yeah, this leads to a bit a preprocessor abuse...
 * Jean II
 */

/* We need the library */
#include "iwlib.c"

/* Get iwconfig in there. Mandatory. */
#define main(args...) main_iwconfig(args)
#define iw_usage(args...) iwconfig_usage(args)
#define find_command(args...) iwconfig_find_command(args)
#include "iwconfig.c"
#undef find_command
#undef iw_usage
#undef main

/* Get iwlist in there. Scanning support is pretty sweet. */
#define main(args...) main_iwlist(args)
#define iw_usage(args...) iwlist_usage(args)
#define find_command(args...) iwlist_find_command(args)
#include "iwlist.c"
#undef find_command
#undef iw_usage
#undef main

#ifndef WE_ESSENTIAL
/* Get iwspy in there, it's not that big. */
#define main(args...) main_iwspy(args)
#include "iwspy.c"
#undef main
#endif	/* WE_ESSENTIAL */

/* Get iwpriv in there. Mandatory for HostAP and some other drivers. */
#define main(args...) main_iwpriv(args)
#define iw_usage(args...) iwpriv_usage(args)
#include "iwpriv.c"
#undef iw_usage
#undef main

/* Do we really need iwgetid ? Well, it's not like it's a big one */
#define main(args...) main_iwgetid(args)
#define iw_usage(args...) iwgetid_usage(args)
#include "iwgetid.c"
#undef iw_usage
#undef main

/* iwevent is useless for most people, don't grab it ? */

/* ifrename is big and useless for those systems */


/******************************* MAIN ********************************/

/*------------------------------------------------------------------*/
/*
 * The main !
 */
int
main(int	argc,
     char **	argv)
{
  char *	call_name = basename(argv[0]);	/* Strip path */

  /* This is a testing hack */
  if(!strcmp(call_name, "iwmulticall") && (argc > 0))
    {
      argv++;
      argc--;
      call_name = basename(argv[0]);
    }

  /* Just check the name under which we were called... */

  if(!strcmp(call_name, "iwconfig"))
    return(main_iwconfig(argc, argv));
  if(!strcmp(call_name, "iwlist"))
    return(main_iwlist(argc, argv));
#ifndef WE_ESSENTIAL
  if(!strcmp(call_name, "iwspy"))
    return(main_iwspy(argc, argv));
#endif	/* WE_ESSENTIAL */
  if(!strcmp(call_name, "iwpriv"))
    return(main_iwpriv(argc, argv));
  if(!strcmp(call_name, "iwgetid"))
    return(main_iwgetid(argc, argv));

  /* Uh oh... Not supposed to come here. */
  printf("iwmulticall : you are not supposed to call me this way...\n");
  return(0);
}