Android demo c--mac/wifimac 烧写

一个demo 用于android mac wifi mac烧写

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <fcntl.h>

#define LOG_TAG "setmacaddr"
#include <utils/Log.h>

#include <cutils/properties.h>

#define PROPERTY_BT_BDADDR_PATH "ro.bt.bdaddr_path"

#define MAC_PATH "/data/wifimac.txt"
#define BTA_PATH "/data/btaddr.txt"
#define STATIC_MAC_PATH "/mnt/private/ULI/factory/mac.txt"
#define STATIC_BTA_PATH "/mnt/private/ULI/factory/btaddr.txt"

#define MAC_LEN 20

static int gen_randseed()
{
    int fd;
    int rc;
    unsigned int randseed;
    size_t len;
    struct timeval tval;

    len =  sizeof(randseed);
    fd = open("/dev/urandom", O_RDONLY);
    if (fd < 0)
    {
        ALOGD("%s: Open /dev/urandom fail\n", __FUNCTION__);
        return -1;
    }
    rc = read(fd, &randseed, len);
    close(fd);
    if(rc <0)
    {
        if (gettimeofday(&tval, (struct timezone *)0) > 0)
            randseed = (unsigned int) tval.tv_usec;
        else
            randseed = (unsigned int) time(NULL);

        ALOGD("open /dev/urandom fail, using system time for randseed\n");
    }
    return randseed;
}

/*
 * Get a Randon MAC addr, save to macaddr
 *
 */
static int get_randon_mac(char *macaddr)
{
    int randseed;
    int randvar1,randvar2;

    randseed = gen_randseed();
    if(randseed == -1)
        return -1;
    srand((unsigned int)randseed);

    randvar1 = rand();
    randvar2 = rand();
    ALOGD("%s:  randvar1 =0x%x, randvar2=0x%x",__FUNCTION__, randvar1,randvar2);

    //sprintf(macaddr, "00:e0:4c:%02x:%02x:%02x",
    //changed by tingle for 6 bytes random
    //Byte1,bit0,bit1 can't be 1.
    sprintf(macaddr, "%02x:%02x:%02x:%02x:%02x:%02x", \
            (unsigned char)((randvar2)&0xFC), \
            (unsigned char)((randvar2>>8)&0xFF), \
            (unsigned char)((randvar2>>16)&0xFF), \
            (unsigned char)((randvar1)&0xFF), \
            (unsigned char)((randvar1>>8)&0xFF), \
            (unsigned char)((randvar1>>16)&0xFF));

    ALOGD("generate a new MAC address: %s", macaddr);

    return 0;
}

/*
 * Generate randon MAC addr, save in file, backup in bakfile
 * if bakfile exist, use it
 * if bakfile not exist, generate a new randon addr
 */
static void generate_mac(char* file, char* bakfile)
{
    char macaddr[MAC_LEN];
    char cmd[128];

    ALOGD("%s: file= %s bakfile= %s",__FUNCTION__, file, bakfile);

    if (access(file, F_OK) == 0 && access(bakfile, F_OK) == 0) {
        ALOGD("both file and bakfile exist, it is ok.");
        return;
    } else if (access(bakfile, F_OK) == 0) {
        ALOGD("only bakfile exist, copy to file.");
        sprintf(cmd, "cp %s %s && chmod 644 %s", bakfile, file, file);
        ALOGD("cmd=%s", cmd);
        system(cmd);
        return;
    } else if (access(file, F_OK) == 0) {
        ALOGD("only file exist, copy to bakfile.");
        sprintf(cmd, "cp %s %s && chmod 644 %s", file, bakfile, bakfile);
        ALOGD("cmd=%s", cmd);
        system(cmd);
        return;
    }

    //or, should generate a new mac addr
    if(get_randon_mac(macaddr) != 0) {
        ALOGD("Generate a randon mac addr failed!!!");
        return;
    }
    //save mac addr to file
    sprintf(cmd, "echo %s > %s && chmod 644 %s", macaddr, file, file);
    ALOGD("cmd=%s", cmd);
    system(cmd);
    //backup to bakfile
    sprintf(cmd, "cp %s %s && chmod 644 %s", file, bakfile, bakfile);
    ALOGD("cmd=%s", cmd);
    system(cmd);
}

int main(int argc, char ** argv)
{
    char val[256];
    char cmd[128];

    if (access(STATIC_BTA_PATH, F_OK) != 0 && access(STATIC_MAC_PATH, F_OK) != 0) {
        sprintf(cmd, "mkdir -p /mnt/private/ULI/factory/");
        ALOGD("cmd=%s", cmd);
        system(cmd);
    }

    if(property_get(PROPERTY_BT_BDADDR_PATH, val, NULL)) {
        generate_mac(val, STATIC_BTA_PATH);
    } else {
        generate_mac(BTA_PATH, STATIC_BTA_PATH);
    }

    generate_mac(MAC_PATH, STATIC_MAC_PATH);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值