int remove_user(dev_info_t *pdev, macadr_t *user) { int i; i = find_user(pdev, user); clean_user(&pdev->users[i]); return 0; }
static NEINT32 user_leave_map(NEUINT16 sessionid, ne_usermsgbuf_t *msg , ne_handle listener) { NEUINT32 id; ne_assert(NE_USERMSG_MAXID(msg) == MAXID_SERVER_SERVER); ne_assert(NE_USERMSG_MINID(msg) == MSG_USER_LEAVE_MAP); id = NE_USERMSG_PARAM(msg); clean_user(id); return (0); }
int cmd_handle(int UNUSED(sd), char *line) { int argc, func; char *argv[10]; dev_info_t *pdev; argc = make_argv(line, ARRAY_SIZE(argv), argv); if (argc <= 0) return ERROR; DBG_OUT("argc is %d", argc); func = get_cmdid(argv[0]); if (func < 0) { printf("unknown command: %s\r\n", argv[0]); return ERROR; } switch (func) { case SERV_REQ_KICKCLI: case SERV_REQ_REBOOT: case SERV_REQ_FACTORY: { PMIFI_PACKET p; int i, datalen, packetlen; u8 sum; i = 0; datalen = 0; packetlen = sizeof(MIFI_PACKET ) + datalen; p = (PMIFI_PACKET)malloc(packetlen + 1); if (argc == 2) { devid_t devid; hex2bin((u8 *)argv[1], (u8 *)&devid, sizeof(devid_t)); i = find_device_by_id(&devid); if (i < 0) { printf("cannot find device: %s\r\n", argv[1]); break; } } pdev = get_device(i); build_packet_header(p, pdev, func); p->datalen = htons(datalen); sum = get_checksum((u8 *)p, packetlen); *(((u8 *)p) + packetlen) = sum; push_data(pdev->sd, (u8 *)p, packetlen + 1); free(p); } break; case SERV_REQ_UPGRADE: { PMIFI_PACKET p; char *url = "http://url.cn/QyCLQu"; int i, url_len, datalen, packetlen; u8 sum; i = 0; url_len = strlen(url); datalen = url_len + 2; packetlen = sizeof(MIFI_PACKET ) + datalen; p = (PMIFI_PACKET)malloc(packetlen + 1); pdev = get_device(i); build_packet_header(p, pdev, func); p->datalen = htons(datalen); p->data[0] = ((u8*)&url_len)[1]; p->data[1] = ((u8*)&url_len)[0]; memcpy(p->data + 2, url, datalen); sum = get_checksum((u8 *)p, packetlen); *(((u8 *)p) + packetlen) = sum; push_data(pdev->sd, (u8 *)p, packetlen + 1); free(p); } break; case SERV_REQ_KICKUSR: { PMIFI_PACKET p; int i, datalen, packetlen; u8 sum; i = 0; datalen = sizeof(macadr_t); packetlen = sizeof(MIFI_PACKET ) + datalen; p = (PMIFI_PACKET)malloc(packetlen + 1); if (argc == 3) { devid_t devid; hex2bin((u8 *)argv[2], (u8 *)&devid, sizeof(devid_t)); i = find_device_by_id(&devid); if (i < 0) { printf("cannot find device: %s\r\n", argv[2]); break; } } pdev = get_device(i); build_packet_header(p, pdev, func); p->datalen = htons(datalen); if (argc == 1) { i = find_first_valid_user(pdev); } else { macadr_t user; hex2bin((u8 *)argv[1], (u8 *)&user, sizeof(macadr_t)); i = find_user(pdev, &user); if (i < 0) { printf("cannot find user: %s\r\n", argv[1]); break; } } memcpy(p->data, pdev->users[i], datalen); clean_user(&pdev->users[i]); // should be clean after got the response from client sum = get_checksum((u8 *)p, packetlen); *(((u8 *)p) + packetlen) = sum; push_data(pdev->sd, (u8 *)p, packetlen + 1); free(p); } break; case MIFI_CMD_LDEV: { int i = 0; devid_t freedev = {0}; for (i = 0; i < ARRAY_SIZE(dev_map); i++) { if (dev_map[i].valid && (memcmp(&dev_map[i].devid, &freedev, sizeof(devid_t)) != 0)) { printf("DevID: "); dump_data((u8 *)&dev_map[i].devid, sizeof(devid_t), 0); printf("IMSI: "); dump_data((u8 *)&dev_map[i].imsi, sizeof(imsi_t), 0); printf("\r\n"); } } } break; case MIFI_CMD_LUSER: { int i = 0; macadr_t freeuser = {0}; if (argc == 2) { devid_t devid; hex2bin((u8 *)argv[1], (u8 *)&devid, sizeof(devid_t)); i = find_device_by_id(&devid); if (i < 0) { printf("cannot find device: %s\r\n", argv[1]); break; } } pdev = get_device(i); for (i = 0; i < ARRAY_SIZE(pdev->users); i++) { if (memcmp(&pdev->users[i], &freeuser, sizeof(macadr_t)) != 0) { dump_data((u8 *)&pdev->users[i], sizeof(macadr_t), 0); } } } break; default: DBG_OUT("func isn't impletement: %d", func); return ERROR; } return 0; }