static long gettoken (token *t, char *p) { unsigned j; sbuff_reset(&t->s); j = 0; /* read a meta */ if (!p[j]) { t->m = EXIT; return j; } if (p[j] == '*') { t->m = WILD_MANY; } else if (p[j] == '?') { t->m = WILD_ONCE; } else { sbuff_push(&t->s, p[j]); t->m = EXACT; } j++; /* read a sub string */ while (p[j]) { if (p[j] == '*' || p[j] == '?') { if (t->s.len && sbuff_head(&t->s) == '\\') { sbuff_xchg(&t->s, p[j]); j += 1; } else { break; } } else { sbuff_push(&t->s, p[j++]); } } return j; }
static void reply(struct netdevice* dev, mac target, uint32_t ip, int broadcast) { sbuff * buf = raw_sbuff_alloc(sizeof(struct ethernet_frame) + sizeof(struct arp_packet)); add_ref(buf); sbuff_push(buf, sizeof(struct ethernet_frame)); struct arp_packet * arp = (struct arp_packet*)buf->head; arp->htype = ntos(1); arp->ptype = ntos(0x0800); arp->hlen = 6; arp->plen = 4; arp->operation = ntos(2); memcpy(arp->senderMac, dev->mac, 6); arp->senderIp = ntol(dev->ip); memcpy(arp->targetMac, target, 6); arp->targetIp = ntol(ip); ethernet_send(buf, 0x0806, broadcast ? BROADCAST_MAC : target, dev); release_ref(buf, sbuff_free); }