int main (void) { TreeNode *tree_root = NULL; TreeNode *found = NULL; char *orders[4] = { "no-order", "pre-order", "in-order", "post-order" }; char buf[KEYSIZE] = ""; int record_num = 0; int ch, count = 0; prompt ("Insert"); while (*gets(buf)) { StrLcpy (rec.key, buf, KEYSIZE); rec.id = ++record_num; if (!tree_insert (&tree_root, &rec, sizeof(rec), (CmpFunc)rec_cmp)) { printf ("\n\tTree Insertion Failure!\n"); return (1); } prompt ("Insert"); } prompt ("Delete"); gets (buf); rec.key[0] = '\0'; StrLcpy (rec.key, buf, KEYSIZE); while ((found = tree_find (tree_root, &rec, (CmpFunc)rec_cmp)) != NULL) { tree_print (found->info); tree_root = tree_delete (tree_root, found); count++; } printf ("\n\t%d String(s) Deleted\n", count); printf ("\n\tSelect Tree Traversal Type\n"); printf ("\n\t\t1) pre-order\n\t\t2) in-order\n\t\t3) post-order\n\n\t>"); ch = getch(); ch -= '0'; if (ch < PRE_ORDER || ch > POST_ORDER) ch = NO_ORDER; printf ("\n\t... Walking Tree %s ...\n\n", orders[ch]); t_order = ch; tree_trace (tree_root); tree_free (tree_root); return (0); }
/** * Traverse 'adapters_list' and select 1st device with an IPv4 * address. Assuming that device is a physical adapter we can use. */ static BOOL find_adapter (char *aname, size_t size) { #if defined(USE_DYN_PACKET) ARGSUSED (aname); ARGSUSED (size); return (TRUE); /**\todo Use IPhlpAPI function to return list of adapters */ #else const ADAPTER_INFO *ai; int i; for (ai = PacketGetAdInfo(); ai; ai = ai->Next) { for (i = 0; i < ai->NNetworkAddresses; i++) { const npf_if_addr *if_addr = ai->NetworkAddresses + i; const struct sockaddr_in *ip_addr = (const struct sockaddr_in*) &if_addr->IPAddress; if (ip_addr->sin_family == AF_INET) { StrLcpy (aname, ai->Name, size); return (TRUE); } } } return (FALSE); #endif }
static struct hostent *fill_hostent (const struct _hostent *h) { static struct hostent ret; static struct in_addr addr [MAX_ADDRESSES+1]; static char *list [MAX_ADDRESSES+1]; static char hostnam [MAX_HOSTLEN+1]; static char *aliases [MAX_HOST_ALIASES+1]; int i; if (!h->h_name) return (NULL); memset (&addr, 0, sizeof(addr)); memcpy (&aliases, h->h_aliases, sizeof(aliases)); for (i = 0; i < h->h_num_addr && i < MAX_ADDRESSES; i++) { addr[i].s_addr = h->h_address[i]; list[i] = (char*) &addr[i]; } list[i] = NULL; ret.h_addr_list = list; ret.h_name = StrLcpy (hostnam, h->h_name, sizeof(hostnam)); ret.h_aliases = aliases; ret.h_addrtype = AF_INET; ret.h_length = sizeof (addr[0].s_addr); h_errno = NETDB_SUCCESS; return (&ret); }
/** * Return the next (non-commented) line from the host-file. * Format is: * ip-address host-name [alias..] {\n | # ..} */ struct hostent * W32_CALL gethostent (void) { struct _hostent h; char *tok, *ip, *name, *alias; char buf [2*MAX_HOSTLEN]; int i; if (!netdb_init() || !hostFile) { h_errno = NO_RECOVERY; return (NULL); } while (1) { if (!fgets(buf,sizeof(buf),hostFile)) return (NULL); tok = strltrim (buf); if (*tok == '#' || *tok == ';' || *tok == '\n') continue; ip = strtok (tok, " \t"); name = strtok (NULL, " \t\n"); if (ip && name && isaddr(ip)) break; } if (hostClose) endhostent(); memset (&h, 0, sizeof(h)); if (!strcmp(ip,"0.0.0.0")) /* inet_addr() maps 0 -> INADDR_NONE */ h.h_address[0] = INADDR_ANY; else h.h_address[0] = inet_addr (ip); h.h_num_addr = 1; h.h_name = name; alias = strtok (NULL, " \t\n"); for (i = 0; alias && i < MAX_HOST_ALIASES; i++) { static char aliases [MAX_NETENT_ALIASES][MAX_HOSTLEN]; if (*alias == '#' || *alias == ';') break; h.h_aliases[i] = StrLcpy (aliases[i], alias, sizeof(aliases[i])); alias = strtok (NULL, " \t\n"); } return fill_hostent (&h); }
static __inline struct netent *fill_netent (const struct _netent *n) { static struct netent ret; static char name [MAX_NAMELEN]; static char *aliases [MAX_NETENT_ALIASES+1]; memcpy (&aliases, n->n_aliases, sizeof(aliases)); ret.n_name = StrLcpy (name, n->n_name, sizeof(name)); ret.n_aliases = aliases; ret.n_net = n->n_net; ret.n_addrtype = AF_INET; return (&ret); }
/* * Return the next (non-commented) line from the network-file * Format is: * name [=] net [alias..] {\n | # ..} * * e.g. * loopback 127 * arpanet 10 arpa */ struct netent * W32_CALL getnetent (void) { struct _netent n; char *name, *net, *alias; char buf [2*MAX_NAMELEN], *tok; int i; if (!netdb_init()) return (NULL); while (1) { if (!fgets(buf,sizeof(buf),networkFile)) return (NULL); tok = strltrim (buf); if (*tok == '#' || *tok == ';' || *tok == '\n') continue; name = strtok (tok, " \t"); net = strtok (NULL, "= \t\n"); if (name && net) break; } if (networkClose) endnetent(); memset (&n, 0, sizeof(n)); n.n_net = inet_network (net); n.n_name = name; alias = strtok (NULL, " \t\n"); for (i = 0; alias && i < MAX_NETENT_ALIASES; i++) { static char aliases [MAX_NETENT_ALIASES][MAX_NAMELEN]; if (*alias == '#' || *alias == ';') break; n.n_aliases[i] = StrLcpy (aliases[i], alias, sizeof(aliases[i])); alias = strtok (NULL, " \t\n"); } return fill_netent (&n); }
/** * BSD-style: \n * Set the host's domain name. * Set errno on failure and return -1. */ int W32_CALL setdomainname (const char *name, int len) { if (!name || len < 0 || len > SIZEOF(defaultdomain)-1) { SOCK_ERRNO (EINVAL); return (-1); } #if (DOSX) if (!valid_addr((DWORD)name, len)) { SOCK_ERRNO (EFAULT); return (-1); } #endif def_domain = StrLcpy (defaultdomain, name, len); return (0); }
/* * Set the name of remote/local file to load from TFTP server. * Format is "tftp.boot_file = remote [local]. * Note: `remote' name cannot contain spaces. */ char *tftp_set_boot_fname (const char *name, int len) { char *p, buf [MAX_PATHLEN]; len = min (len+1, SIZEOF(buf)); StrLcpy (buf, name, len); tftp_boot_remote_file = strdup (buf); tftp_boot_local_file = tftp_boot_remote_file; if (tftp_boot_local_file) { p = strchr (tftp_boot_local_file, ' '); if (p) { *p++ = '\0'; tftp_boot_local_file = p; } } return (tftp_boot_remote_file); }
/** * Initialise WinPcap and return our MAC address. */ int pkt_eth_init (mac_address *mac_addr) { struct { PACKET_OID_DATA oidData; char descr[512]; } oid; const ADAPTER *adapter = NULL; DWORD thread_id; BOOL is_up; if (_watt_is_win9x) /**< \todo Support Win-9x too */ { (*_printf) (_LANG("Win-NT or later reqired.\n")); _pkt_errno = PDERR_GEN_FAIL; return (WERR_ILL_DOSX); } if (!_watt_no_config || _watt_user_config_fn) parse_config_pass_1(); _pkt_inf = calloc (sizeof(*_pkt_inf), 1); if (!_pkt_inf) { (*_printf) (_LANG("Failed to allocate WinPcap DRIVER data.\n")); _pkt_errno = PDERR_GEN_FAIL; return (WERR_NO_MEM); } if (debug_on >= 2 && dump_fname[0]) dump_file = fopen_excl (ExpandVarStr(dump_fname), "w+t"); if (!PacketInitModule(TRUE, dump_file)) { (*_printf) (_LANG("Failed to initialise WinPcap.\n")); pkt_release(); _pkt_errno = PDERR_NO_DRIVER; return (WERR_PKT_ERROR); } if (!_pktdrvrname[0] && !find_adapter(_pktdrvrname,sizeof(_pktdrvrname))) { (*_printf) (_LANG("No WinPcap driver found.\n")); _pkt_errno = PDERR_NO_DRIVER; return (WERR_NO_DRIVER); } TCP_CONSOLE_MSG (2, ("device %s\n", _pktdrvrname)); adapter = PacketOpenAdapter (_pktdrvrname); if (!adapter) { if (debug_on > 0) (*_printf) (_LANG("PacketOpenAdapter (\"%s\") failed; %s\n"), _pktdrvrname, win_strerror(GetLastError())); pkt_release(); return (WERR_NO_DRIVER); } _pkt_inf->adapter = adapter; #if defined(USE_DYN_PACKET) _pkt_inf->adapter_info = NULL; #else _pkt_inf->adapter_info = PacketFindAdInfo (_pktdrvrname); #endif /* Query the NIC driver for the adapter description */ memset (&oid, 0, sizeof(oid)); oid.oidData.Oid = OID_GEN_VENDOR_DESCRIPTION; oid.oidData.Length = sizeof(oid.descr); if (PacketRequest (adapter, FALSE, &oid.oidData)) StrLcpy (_pktdrvr_descr, (char*)oid.oidData.Data, sizeof(_pktdrvr_descr)); else { (*_printf) (_LANG("PacketRequest() failed; %s\n"), win_strerror(GetLastError())); pkt_release(); return (WERR_PKT_ERROR); } if (!get_interface_type(&_pktdevclass)) { pkt_release(); return (WERR_PKT_ERROR); } if (get_connected_status(&is_up) && !is_up) (*_printf) (_LANG("Warning: the adapter %s is down\n"), _pktdrvrname); switch (_pktdevclass) { case PDCLASS_TOKEN: _pkt_ip_ofs = sizeof(tok_Header); break; case PDCLASS_ETHER: _pkt_ip_ofs = sizeof(eth_Header); break; case PDCLASS_FDDI: _pkt_ip_ofs = sizeof(fddi_Header); break; case PDCLASS_ARCNET: _pkt_ip_ofs = ARC_HDRLEN; break; default: pkt_release(); (*_printf) (_LANG("WinPcap-ERROR: Unsupported driver class %dh\n"), _pktdevclass); _pkt_errno = PDERR_NO_CLASS; return (WERR_PKT_ERROR); } if (!pkt_get_addr(mac_addr)) /* get our MAC address */ { pkt_release(); return (WERR_PKT_ERROR); } pktq_init (&_pkt_inf->pkt_queue, sizeof(_pkt_inf->rx_buf[0]), /* RX_SIZE */ DIM(_pkt_inf->rx_buf), /* RX_BUFS */ (char*)&_pkt_inf->rx_buf); _pkt_inf->npf_buf_size = RX_SIZE * pkt_num_rx_bufs; _pkt_inf->npf_buf = malloc (_pkt_inf->npf_buf_size); if (!_pkt_inf->npf_buf) { (*_printf) (_LANG("Failed to allocate %d byte Rx buffer.\n"), _pkt_inf->npf_buf_size); pkt_release(); _pkt_errno = PDERR_GEN_FAIL; return (WERR_NO_MEM); } PacketSetMode (adapter, PACKET_MODE_CAPT); PacketSetBuff (adapter, _pkt_inf->npf_buf_size); PacketSetMinToCopy (adapter, ETH_MIN); /* PacketReceivePacket() blocks until something is received */ PacketSetReadTimeout ((ADAPTER*)adapter, 0); /* Set Rx-mode forced via config. */ if (_pkt_forced_rxmode != -1) { _pkt_forced_rxmode &= 0xFFFF; /* clear bits not set via ARG_ATOX_W */ if (_pkt_forced_rxmode == 0 || /* check illegal bit-values */ (_pkt_forced_rxmode & 0x10) || (_pkt_forced_rxmode & 0x40) || (_pkt_forced_rxmode > 0x80)) { TCP_CONSOLE_MSG (0, ("Illegal Rx-mode (0x%02X) specified\n", _pkt_forced_rxmode)); _pkt_forced_rxmode = -1; } } if (pkt_get_rcv_mode()) _pkt_rxmode0 = _pkt_rxmode; if (_pkt_forced_rxmode != -1) pkt_set_rcv_mode (_pkt_forced_rxmode); else pkt_set_rcv_mode (RXMODE_DEFAULT); #if 1 _pkt_inf->recv_thread = CreateThread (NULL, 2048, pkt_recv_thread, NULL, 0, &thread_id); #else _pkt_inf->recv_thread = _beginthreadex (NULL, 2048, pkt_recv_thread, NULL, 0, &thread_id); #endif if (!_pkt_inf->recv_thread) { (*_printf) (_LANG("Failed to create receiver thread; %s\n"), win_strerror(GetLastError())); pkt_release(); _pkt_errno = PDERR_GEN_FAIL; return (WERR_PKT_ERROR); } if (thr_realtime) SetThreadPriority (_pkt_inf->recv_thread, THREAD_PRIORITY_TIME_CRITICAL); TCP_CONSOLE_MSG (2, ("capture thread-id %lu\n", thread_id)); #if defined(USE_DEBUG) if (debug_on >= 2) { (*_printf) ("link-details:\n"); show_link_details(); } #endif return (0); }
/* * Set the mode used for transfer */ static char *tftp_set_xfer_mode (const char *name) { return StrLcpy (tftp_xfer_mode, name, sizeof(tftp_xfer_mode)); }
/* * Set the name of TFTP server */ char *tftp_set_server (const char *name, int len) { len = min (len+1, SIZEOF(tftp_server_name)); return StrLcpy (tftp_server_name, name, len); }