void register_name(struct subnet_record *subrec, const char *name, int type, uint16 nb_flags, register_name_success_function success_fn, register_name_fail_function fail_fn, struct userdata_struct *userdata) { struct nmb_name nmbname; nstring nname; errno = 0; push_ascii_nstring(nname, name); if (errno == E2BIG) { unstring tname; pull_ascii_nstring(tname, sizeof(tname), nname); DEBUG(0,("register_name: NetBIOS name %s is too long. Truncating to %s\n", name, tname)); make_nmb_name(&nmbname, tname, type); } else { make_nmb_name(&nmbname, name, type); } /* Always set the NB_ACTIVE flag on the name we are registering. Doesn't make sense without it. */ nb_flags |= NB_ACTIVE; if (subrec == unicast_subnet) { /* we now always do multi-homed registration if we are registering to a WINS server. This copes much better with complex WINS setups */ multihomed_register_name(&nmbname, nb_flags, success_fn, fail_fn); return; } if (queue_register_name(subrec, register_name_response, register_name_timeout_response, success_fn, fail_fn, userdata, &nmbname, nb_flags) == NULL) { DEBUG(0,("register_name: Failed to send packet trying to register name %s\n", nmb_namestr(&nmbname))); } }
void register_name(struct subnet_record *subrec, const char *name, int type, uint16_t nb_flags, register_name_success_function success_fn, register_name_fail_function fail_fn, struct userdata_struct *userdata) { struct nmb_name nmbname; nstring nname; size_t converted_size; errno = 0; converted_size = push_ascii_nstring(nname, name); if (converted_size != (size_t)-1) { /* Success. */ make_nmb_name(&nmbname, name, type); } else if (errno == E2BIG) { /* * Name converted to CH_DOS is too large. * try to truncate. */ char *converted_str_dos = NULL; char *converted_str_unix = NULL; bool ok; converted_size = 0; ok = convert_string_talloc(talloc_tos(), CH_UNIX, CH_DOS, name, strlen(name)+1, &converted_str_dos, &converted_size); if (!ok) { DEBUG(0,("register_name: NetBIOS name %s cannot be " "converted. Failing to register name.\n", name)); return; } /* * As it's now CH_DOS codepage * we truncate by writing '\0' at * MAX_NETBIOSNAME_LEN-1 and then * convert back to CH_UNIX which we * need for the make_nmb_name() call. */ if (converted_size >= MAX_NETBIOSNAME_LEN) { converted_str_dos[MAX_NETBIOSNAME_LEN-1] = '\0'; } ok = convert_string_talloc(talloc_tos(), CH_DOS, CH_UNIX, converted_str_dos, strlen(converted_str_dos)+1, &converted_str_unix, &converted_size); if (!ok) { DEBUG(0,("register_name: NetBIOS name %s cannot be " "converted back to CH_UNIX. " "Failing to register name.\n", converted_str_dos)); TALLOC_FREE(converted_str_dos); return; } make_nmb_name(&nmbname, converted_str_unix, type); TALLOC_FREE(converted_str_dos); TALLOC_FREE(converted_str_unix); } else { /* * Generic conversion error. Fail to register. */ DEBUG(0,("register_name: NetBIOS name %s cannot be " "converted (%s). Failing to register name.\n", name, strerror(errno))); return; } /* Always set the NB_ACTIVE flag on the name we are registering. Doesn't make sense without it. */ nb_flags |= NB_ACTIVE; if (subrec == unicast_subnet) { /* we now always do multi-homed registration if we are registering to a WINS server. This copes much better with complex WINS setups */ multihomed_register_name(&nmbname, nb_flags, success_fn, fail_fn); return; } if (queue_register_name(subrec, register_name_response, register_name_timeout_response, success_fn, fail_fn, userdata, &nmbname, nb_flags) == NULL) { DEBUG(0,("register_name: Failed to send packet trying to register name %s\n", nmb_namestr(&nmbname))); } }