summaryrefslogtreecommitdiffstats
path: root/macloader/macloader.c
diff options
context:
space:
mode:
Diffstat (limited to 'macloader/macloader.c')
-rw-r--r--macloader/macloader.c194
1 files changed, 194 insertions, 0 deletions
diff --git a/macloader/macloader.c b/macloader/macloader.c
new file mode 100644
index 0000000..fc65bf3
--- /dev/null
+++ b/macloader/macloader.c
@@ -0,0 +1,194 @@
+/*
+ * Copyright (C) 2012, The CyanogenMod Project
+ * Daniel Hillenbrand <codeworkx@cyanogenmod.com>
+ * Marco Hillenbrand <marco.hillenbrand@googlemail.com>
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <cutils/log.h>
+
+#define LOG_TAG "macloader"
+#define LOG_NDEBUG 0
+
+#define MACADDR_PATH "/efs/wifi/.mac.info"
+#define CID_PATH "/data/.cid.info"
+
+enum Type {
+ NONE,
+ MURATA,
+ SEMCOSH,
+ SEMCOVE,
+ SEMCO3RD,
+ SEMCO,
+ WISOL
+};
+
+int main() {
+ FILE* file;
+ FILE* cidfile;
+ char* str;
+ char mac_addr_half[9];
+ int ret = -1;
+ int amode;
+ enum Type type = NONE;
+
+ /* open mac addr file */
+ file = fopen(MACADDR_PATH, "r");
+ if (file == 0) {
+ fprintf(stderr, "open(%s) failed\n", MACADDR_PATH);
+ ALOGE("Can't open %s\n", MACADDR_PATH);
+ return -1;
+ }
+
+ /* get and compare mac addr */
+ str = fgets(mac_addr_half, 9, file);
+ if (str == 0) {
+ fprintf(stderr, "fgets() from file %s failed\n", MACADDR_PATH);
+ ALOGE("Can't read from %s\n", MACADDR_PATH);
+ return -1;
+ }
+
+ /* murata
+ ref: http://hwaddress.com/?q=ACT */
+ if (strncasecmp(mac_addr_half, "00:0e:6d", 9) == 0 ||
+ strncasecmp(mac_addr_half, "00:13:e0", 9) == 0 ||
+ strncasecmp(mac_addr_half, "00:21:e8", 9) == 0 ||
+ strncasecmp(mac_addr_half, "00:26:e8", 9) == 0 ||
+ strncasecmp(mac_addr_half, "00:37:6d", 9) == 0 ||
+ strncasecmp(mac_addr_half, "00:60:57", 9) == 0 ||
+ strncasecmp(mac_addr_half, "04:46:65", 9) == 0 ||
+ strncasecmp(mac_addr_half, "10:5f:06", 9) == 0 ||
+ strncasecmp(mac_addr_half, "10:a5:d0", 9) == 0 ||
+ strncasecmp(mac_addr_half, "1c:99:4c", 9) == 0 ||
+ strncasecmp(mac_addr_half, "14:7d:c5", 9) == 0 ||
+ strncasecmp(mac_addr_half, "20:02:af", 9) == 0 ||
+ strncasecmp(mac_addr_half, "40:f3:08", 9) == 0 ||
+ strncasecmp(mac_addr_half, "44:a7:cf", 9) == 0 ||
+ strncasecmp(mac_addr_half, "5c:da:d4", 9) == 0 ||
+ strncasecmp(mac_addr_half, "5c:f8:a1", 9) == 0 ||
+ strncasecmp(mac_addr_half, "78:4b:87", 9) == 0 ||
+ strncasecmp(mac_addr_half, "60:21:c0", 9) == 0 ||
+ strncasecmp(mac_addr_half, "88:30:8a", 9) == 0 ||
+ strncasecmp(mac_addr_half, "f0:27:65", 9) == 0 ||
+ strncasecmp(mac_addr_half, "fc:c2:de", 9) == 0) {
+ type = MURATA;
+ }
+
+ /* semcosh */
+ if (strncasecmp(mac_addr_half, "34:23:ba", 9) == 0 ||
+ strncasecmp(mac_addr_half, "38:aa:3c", 9) == 0 ||
+ strncasecmp(mac_addr_half, "5c:0a:5b", 9) == 0 ||
+ strncasecmp(mac_addr_half, "88:32:9b", 9) == 0 ||
+ strncasecmp(mac_addr_half, "90:18:7c", 9) == 0 ||
+ strncasecmp(mac_addr_half, "cc:3a:61", 9) == 0) {
+ type = SEMCOSH;
+ }
+
+ /* semco3rd */
+ if (strncasecmp(mac_addr_half, "f4:09:d8", 9) == 0) {
+ type = SEMCO3RD;
+ }
+
+ /* semco */
+ if (strncasecmp(mac_addr_half, "c0:bd:d1", 9) == 0 ||
+ strncasecmp(mac_addr_half, "51:f6:6b", 9) == 0) {
+ type = SEMCO;
+ }
+
+ /* wisol */
+ if (strncasecmp(mac_addr_half, "48:5A:3F", 9) == 0) {
+ type = WISOL;
+ }
+
+ if (type != NONE) {
+ /* open cid file */
+ cidfile = fopen(CID_PATH, "w");
+ if(cidfile == 0) {
+ fprintf(stderr, "open(%s) failed\n", CID_PATH);
+ ALOGE("Can't open %s\n", CID_PATH);
+ return -1;
+ }
+
+ switch(type) {
+ case NONE:
+ return -1;
+ break;
+ case MURATA:
+ /* write murata to cid file */
+ ALOGI("Writing murata to %s\n", CID_PATH);
+ ret = fputs("murata", cidfile);
+ break;
+ case SEMCOSH:
+ /* write semcosh to cid file */
+ ALOGI("Writing semcosh to %s\n", CID_PATH);
+ ret = fputs("semcosh", cidfile);
+ break;
+ case SEMCOVE:
+ /* write semcove to cid file */
+ ALOGI("Writing semcove to %s\n", CID_PATH);
+ ret = fputs("semcove", cidfile);
+ break;
+ case SEMCO3RD:
+ ALOGI("Writing semco3rd to %s\n", CID_PATH);
+ ret = fputs("semco3rd", cidfile);
+ break;
+ case SEMCO:
+ /* write semco to cid file */
+ ALOGI("Writing semco to %s\n", CID_PATH);
+ ret = fputs("semco", cidfile);
+ break;
+ case WISOL:
+ ALOGI("Writing wisol to %s\n", CID_PATH);
+ ret = fputs("wisol", cidfile);
+ break;
+ }
+
+ if (ret != 0) {
+ fprintf(stderr, "fputs() to file %s failed\n", CID_PATH);
+ ALOGE("Can't write to %s\n", CID_PATH);
+ return -1;
+ }
+ fclose(cidfile);
+
+ /* set permissions on cid file */
+ ALOGD("Setting permissions on %s\n", CID_PATH);
+ amode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+ ret = chmod(CID_PATH, amode);
+
+ char* chown_cmd = (char*) malloc(strlen("chown system ") + strlen(CID_PATH) + 1);
+ char* chgrp_cmd = (char*) malloc(strlen("chgrp system ") + strlen(CID_PATH) + 1);
+ sprintf(chown_cmd, "chown system %s", CID_PATH);
+ sprintf(chgrp_cmd, "chgrp system %s", CID_PATH);
+ system(chown_cmd);
+ system(chgrp_cmd);
+
+ if (ret != 0) {
+ fprintf(stderr, "chmod() on file %s failed\n", CID_PATH);
+ ALOGE("Can't set permissions on %s\n", CID_PATH);
+ return ret;
+ }
+
+ } else {
+ /* delete cid file if no specific type */
+ ALOGD("Deleting file %s\n", CID_PATH);
+ remove(CID_PATH);
+ }
+ fclose(file);
+ return 0;
+}