void ipx_send_broadcast_packet_data( ubyte * data, int datasize ) { int i, j; ubyte broadcast[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; ubyte local_address[6]; // Set to all networks besides mine for (i=0; i<Ipx_num_networks; i++ ) { if ( memcmp( &Ipx_networks[i], &ipx_network, 4 ) ) { ipx_get_local_target( (ubyte *)&Ipx_networks[i], broadcast, local_address ); ipx_send_packet_data( data, datasize, (ubyte *)&Ipx_networks[i], broadcast, local_address ); } else { ipx_send_packet_data( data, datasize, (ubyte *)&Ipx_networks[i], broadcast, broadcast ); } } //OLDipx_send_packet_data( data, datasize, (ubyte *)&ipx_network, broadcast, broadcast ); // Send directly to all users not on my network or in the network list. for (i=0; i<Ipx_num_users; i++ ) { if ( memcmp( Ipx_users[i].network, &ipx_network, 4 ) ) { for (j=0; j<Ipx_num_networks; j++ ) { if (!memcmp( Ipx_users[i].network, &Ipx_networks[j], 4 )) goto SkipUser; } ipx_send_packet_data( data, datasize, Ipx_users[i].network, Ipx_users[i].node, Ipx_users[i].address ); SkipUser: j = 0; } } }
void ipx_read_user_file(char * filename) { FILE * fp; user_address tmp; char temp_line[132], *p1; int n, ln=0; if (!filename) return; Ipx_num_users = 0; fp = fopen( filename, "rt" ); if ( !fp ) return; printf( "Broadcast Users:\n" ); while (fgets(temp_line, 132, fp)) { ulong net; char *np; ln++; p1 = strchr(temp_line,'\n'); if (p1) *p1 = '\0'; p1 = strchr(temp_line,';'); if (p1) *p1 = '\0'; if (strlen(temp_line) == 0) continue; //skip blank lines //n = sscanf( temp_line, "%2x%2x%2x%2x/%2x%2x%2x%2x%2x%2x", &tmp.network[0], &tmp.network[1], &tmp.network[2], &tmp.network[3], &tmp.node[0], &tmp.node[1], &tmp.node[2],&tmp.node[3], &tmp.node[4], &tmp.node[5] ); //if ( n != 10 ) continue; np = strchr(temp_line,'/'); if (!np) Error("Invalid entry <%s> on line %d of IPX User file <%s>",temp_line,ln,filename); else np++; n = sscanf( temp_line, "%x", &net); if (n != 1) Error("Invalid entry <%s> on line %d of IPX User file <%s>",temp_line,ln,filename); else { tmp.network[3] = (net & 0xff); net >>= 8; tmp.network[2] = (net & 0xff); net >>= 8; tmp.network[1] = (net & 0xff); net >>= 8; tmp.network[0] = (net & 0xff); } n = sscanf( np, "%2x%2x%2x%2x%2x%2x", &tmp.node[0], &tmp.node[1], &tmp.node[2],&tmp.node[3], &tmp.node[4], &tmp.node[5] ); if (n != 6) Error("Invalid entry <%s> on line %d of IPX User file <%s>\n" " Node address must be 6 bytes (12 digits)",temp_line,ln,filename); if ( Ipx_num_users < MAX_USERS ) { ubyte * ipx_real_buffer = (ubyte *)&tmp; ipx_get_local_target( tmp.network, tmp.node, tmp.address ); Ipx_users[Ipx_num_users++] = tmp; printf( "%02X%02X%02X%02X/", ipx_real_buffer[0],ipx_real_buffer[1],ipx_real_buffer[2],ipx_real_buffer[3] ); printf( "%02X%02X%02X%02X%02X%02X\n", ipx_real_buffer[4],ipx_real_buffer[5],ipx_real_buffer[6],ipx_real_buffer[7],ipx_real_buffer[8],ipx_real_buffer[9] ); } else { printf( "Too many addresses in %s! (Limit of %d)\n", filename, MAX_USERS ); fclose(fp); return; } } fclose(fp); }
// Sends a non-localized packet... needs 4 byte server, 6 byte address void ipx_send_internetwork_packet_data( ubyte * data, int datasize, ubyte * server, ubyte *address ) { ubyte local_address[6]; if ( (*(uint *)server) != 0 ) { ipx_get_local_target( server, address, local_address ); ipx_send_packet_data( data, datasize, server, address, local_address ); } else { // Old method, no server info. ipx_send_packet_data( data, datasize, server, address, address ); } }
void ipx_read_user_file(char * filename) { FILE * fp; user_address tmp; char temp_line[132], *p1; int n, ln=0; if (!filename) return; Ipx_num_users = 0; fp = fopen( filename, "rt" ); if ( !fp ) return; printf( "Broadcast Users:\n" ); while (fgets(temp_line, 132, fp)) { ln++; p1 = strchr(temp_line,'\n'); if (p1) *p1 = '\0'; p1 = strchr(temp_line,';'); if (p1) *p1 = '\0'; n = sscanf( temp_line, "%2x%2x%2x%2x/%2x%2x%2x%2x%2x%2x", &tmp.network[0], &tmp.network[1], &tmp.network[2], &tmp.network[3], &tmp.node[0], &tmp.node[1], &tmp.node[2],&tmp.node[3], &tmp.node[4], &tmp.node[5] ); if ( n != 10 ) continue; if ( Ipx_num_users < MAX_USERS ) { ubyte * ipx_real_buffer = (ubyte *)&tmp; ipx_get_local_target( tmp.network, tmp.node, tmp.address ); Ipx_users[Ipx_num_users++] = tmp; printf( "%02X%02X%02X%02X/", ipx_real_buffer[0],ipx_real_buffer[1],ipx_real_buffer[2],ipx_real_buffer[3] ); printf( "%02X%02X%02X%02X%02X%02X\n", ipx_real_buffer[4],ipx_real_buffer[5],ipx_real_buffer[6],ipx_real_buffer[7],ipx_real_buffer[8],ipx_real_buffer[9] ); } else { printf( "Too many addresses in %s! (Limit of %d)\n", filename, MAX_USERS ); fclose(fp); return; } } fclose(fp); }