--- /dev/null
+/*
+ * Wireless Tools
+ *
+ * Jean II - HPL 03
+ *
+ * Main code for "iwredir". This is a hack to match multiple version
+ * of the tools with multiple kernels on the same system...
+ *
+ * This file is released under the GPL license.
+ * Copyright (c) 2003 Jean Tourrilhes <jt@hpl.hp.com>
+ */
+
+/***************************** INCLUDES *****************************/
+
+#include "iwlib.h" /* Header */
+
+/*********************** VERSION SUBROUTINES ***********************/
+
+/*------------------------------------------------------------------*/
+/*
+ * Extract WE version number from /proc/net/wireless
+ * If we have WE-16 and later, the WE version is available at the
+ * end of the header line of the file.
+ * For version prior to that, we can only detect the change from
+ * v11 to v12, so we do an approximate job. Fortunately, v12 to v15
+ * are highly binary compatible (on the struct level).
+ */
+static int
+iw_get_kernel_we_version(void)
+{
+ char buff[1024];
+ FILE * fh;
+ char * p;
+ int v;
+
+ /* Check if /proc/net/wireless is available */
+ fh = fopen(PROC_NET_WIRELESS, "r");
+
+ if(fh == NULL)
+ {
+ fprintf(stderr, "Cannot read " PROC_NET_WIRELESS "\n");
+ return(-1);
+ }
+
+ /* Read the first line of buffer */
+ fgets(buff, sizeof(buff), fh);
+
+ if(strstr(buff, "| WE") == NULL)
+ {
+ /* Prior to WE16, so explicit version not present */
+
+ /* Black magic */
+ if(strstr(buff, "| Missed") == NULL)
+ v = 11;
+ else
+ v = 15;
+ fclose(fh);
+ return(v);
+ }
+
+ /* Read the second line of buffer */
+ fgets(buff, sizeof(buff), fh);
+
+ /* Get to the last separator, to get the version */
+ p = strrchr(buff, '|');
+ if((p == NULL) || (sscanf(p + 1, "%d", &v) != 1))
+ {
+ fprintf(stderr, "Cannot parse " PROC_NET_WIRELESS "\n");
+ fclose(fh);
+ return(-1);
+ }
+
+ fclose(fh);
+ return(v);
+}
+
+/******************************* MAIN ********************************/
+
+/*------------------------------------------------------------------*/
+/*
+ * The main !
+ */
+int
+main(int argc,
+ char ** argv)
+{
+ int version = 0;
+ int goterr = 0;
+ char file[512];
+ int flen;
+
+ /* Get current version */
+ version = iw_get_kernel_we_version();
+ if(version <= 0)
+ version = 15; /* We can only read only WE16 and higher */
+
+ /* Special case for Wireless Extension Version... */
+ /* This is mostly used in the Makefile, we use an "unlikely" option
+ * to maximise transparency to the tool we masquerade - Jean II */
+ if((argc > 1) && !strcmp(argv[1], "-wev"))
+ {
+ printf("%d\n", version);
+ return(version);
+ }
+
+ /* Mangle the command name */
+ flen = strlen(argv[0]);
+ if((flen + 3) >= 512)
+ {
+ fprintf(stderr, "Command name too long [%s]\n", argv[0]);
+ return(-1);
+ }
+ memcpy(file, argv[0], flen + 1);
+ sprintf(file + flen, "%d", version);
+
+ /* Execute (won't return) */
+ goterr = execvp(file, argv);
+
+ /* In case of error */
+ fprintf(stderr, "Can't execute command %s: %s\n", file, strerror(errno));
+ return(goterr);
+}
+
+