int main() { netbios_ns *ns; netbios_ns_discover_callbacks callbacks; ns = netbios_ns_new(); callbacks.p_opaque = (void*)0x42; callbacks.pf_on_entry_added = on_entry_added; callbacks.pf_on_entry_removed = on_entry_removed; printf("Discovering...\nPress Enter to quit\n"); if (!netbios_ns_discover_start(ns, 4, // broadcast every 4 sec &callbacks)) { fprintf(stderr, "Error while discovering local network\n"); exit(42); } getchar(); netbios_ns_discover_stop(ns); return (0); }
int bdsm_SdOpen (vlc_object_t *p_this) { services_discovery_t *p_sd = (services_discovery_t *)p_this; services_discovery_sys_t *p_sys = calloc (1, sizeof (*p_sys)); netbios_ns_discover_callbacks callbacks; if( p_sys == NULL ) return VLC_ENOMEM; p_sd->p_sys = p_sys; p_sys->p_entry_item_list = vlc_array_new(); if ( p_sys->p_entry_item_list == NULL ) return VLC_ENOMEM; p_sys->p_ns = netbios_ns_new(); if( p_sys->p_ns == NULL ) goto error; callbacks.p_opaque = p_sd; callbacks.pf_on_entry_added = netbios_ns_discover_on_entry_added; callbacks.pf_on_entry_removed = netbios_ns_discover_on_entry_removed; if( netbios_ns_discover_start( p_sys->p_ns, BROADCAST_TIMEOUT, &callbacks) != 0 ) goto error; return VLC_SUCCESS; error: bdsm_SdClose( p_this ); return VLC_EGENERIC; }
int main(int ac, char **av) { netbios_ns *ns; struct in_addr addr; const char *name; ns = netbios_ns_new(); if (ac != 2) { fprintf(stderr, "%s usage: %s a.b.c.d\n", av[0], av[0]); fprintf(stderr, "Print the netbios name for this IP address\n"); exit(1); } inet_aton(av[1], &addr); if ((name = netbios_ns_inverse(ns, addr.s_addr)) == NULL) { fprintf(stderr, "Unable to perform inverse name resolution for %s\n", av[1]); exit(42); } printf("%s\n", name); netbios_ns_destroy(ns); return (0); }
int SdOpen (vlc_object_t *p_this) { services_discovery_t *p_sd = (services_discovery_t *)p_this; services_discovery_sys_t *p_sys = malloc (sizeof (*p_sys)); if( p_sys == NULL ) return VLC_ENOMEM; p_sd->p_sys = p_sys; /* Let's create a NETBIOS name service object */ p_sys->ns = netbios_ns_new(); if( p_sys->ns == NULL ) goto error; if( !netbios_ns_discover( p_sys->ns ) ) goto error; for( ssize_t i = 0; i < netbios_ns_entry_count( p_sys->ns ); i++ ) { netbios_ns_entry *p_entry = netbios_ns_entry_at( p_sys->ns, i ); if( p_entry->type == 0x20 ) { input_item_t *p_item; char *psz_mrl; if( asprintf(&psz_mrl, "smb://%s", p_entry->name) < 0 ) goto error; p_item = input_item_NewWithType( psz_mrl, p_entry->name, 0, NULL, 0, -1, ITEM_TYPE_NODE ); msg_Dbg( p_sd, "Adding item %s", psz_mrl ); services_discovery_AddItem( p_sd, p_item, NULL ); free( psz_mrl ); } } return VLC_SUCCESS; error: if( p_sys->ns != NULL ) netbios_ns_destroy( p_sys->ns ); free( p_sys ); p_sd->p_sys = NULL; return VLC_EGENERIC; }
/***************************************************************************** * Open: Initialize module's data structures and libdsm *****************************************************************************/ static int Open( vlc_object_t *p_this ) { stream_t *p_access = (stream_t*)p_this; access_sys_t *p_sys; smb_stat st; /* Init p_access */ p_sys = p_access->p_sys = (access_sys_t*)calloc( 1, sizeof( access_sys_t ) ); if( p_access->p_sys == NULL ) return VLC_ENOMEM; p_sys->p_ns = netbios_ns_new(); if( p_sys->p_ns == NULL ) goto error; p_sys->p_session = smb_session_new(); if( p_sys->p_session == NULL ) goto error; if( vlc_UrlParseFixup( &p_sys->url, p_access->psz_url ) != 0 ) goto error; if( get_address( p_access ) != VLC_SUCCESS ) goto error; msg_Dbg( p_access, "Session: Host name = %s, ip = %s", p_sys->netbios_name, inet_ntoa( p_sys->addr ) ); /* Now that we have the required data, let's establish a session */ if( smb_session_connect( p_sys->p_session, p_sys->netbios_name, p_sys->addr.s_addr, SMB_TRANSPORT_TCP ) != DSM_SUCCESS ) { msg_Err( p_access, "Unable to connect/negotiate SMB session"); goto error; } get_path( p_access ); if( login( p_access ) != VLC_SUCCESS ) { msg_Err( p_access, "Unable to open file with path %s (in share %s)", p_sys->psz_path, p_sys->psz_share ); goto error; } /* If there is no shares, browse them */ if( !p_sys->psz_share ) return BrowserInit( p_access ); assert(p_sys->i_fd > 0); msg_Dbg( p_access, "Path: Share name = %s, path = %s", p_sys->psz_share, p_sys->psz_path ); st = smb_stat_fd( p_sys->p_session, p_sys->i_fd ); if( smb_stat_get( st, SMB_STAT_ISDIR ) ) { smb_fclose( p_sys->p_session, p_sys->i_fd ); return BrowserInit( p_access ); } msg_Dbg( p_access, "Successfully opened smb://%s", p_access->psz_location ); ACCESS_SET_CALLBACKS( Read, NULL, Control, Seek ); return VLC_SUCCESS; error: Close( p_this ); return VLC_EGENERIC; }