2003-08-13 01:53:07 +00:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
Copyright ( C ) 2001 Steve French ( sfrench @ us . ibm . com )
Copyright ( C ) 2001 Jim McDonough ( jmcd @ us . ibm . com )
Copyright ( C ) 2001 Andrew Tridgell ( tridge @ samba . org )
Copyright ( C ) 2001 Andrew Bartlett ( abartlet @ samba . org )
2004-08-18 09:33:54 +00:00
Copyright ( C ) 2004 Stefan Metzmacher ( metze @ samba . org )
Largely rewritten by metze in August 2004
2003-08-13 01:53:07 +00:00
Originally written by Steve and Jim . Largely rewritten by tridge in
November 2001.
Reworked again by abartlet in December 2001
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation ; either version 2 of the License , or
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
along with this program ; if not , write to the Free Software
2004-08-18 09:33:54 +00:00
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
2003-08-13 01:53:07 +00:00
/*****************************************************/
/* */
/* Distributed SMB/CIFS Server Management Utility */
/* */
/* The intent was to make the syntax similar */
/* to the NET utility (first developed in DOS */
/* with additional interesting & useful functions */
/* added in later SMB server network operating */
/* systems). */
/* */
/*****************************************************/
# include "includes.h"
/*
run a function from a function table . If not found then
call the specified usage function
*/
2004-08-18 09:33:54 +00:00
int net_run_function ( struct net_context * ctx ,
int argc , const char * * argv ,
const struct net_functable * functable ,
2004-08-18 12:47:08 +00:00
int ( * usage_fn ) ( struct net_context * ctx , int argc , const char * * argv ) )
2003-08-13 01:53:07 +00:00
{
int i ;
2004-08-18 12:47:08 +00:00
2003-08-13 01:53:07 +00:00
if ( argc < 1 ) {
2004-08-18 09:33:54 +00:00
d_printf ( " Usage: \n " ) ;
2004-08-18 12:47:08 +00:00
return usage_fn ( ctx , argc , argv ) ;
2003-08-13 01:53:07 +00:00
}
2004-08-18 12:47:08 +00:00
2004-08-18 09:33:54 +00:00
for ( i = 0 ; functable [ i ] . name ; i + + ) {
if ( StrCaseCmp ( argv [ 0 ] , functable [ i ] . name ) = = 0 )
return functable [ i ] . fn ( ctx , argc - 1 , argv + 1 ) ;
2003-08-13 01:53:07 +00:00
}
2004-08-18 12:47:08 +00:00
2003-08-13 01:53:07 +00:00
d_printf ( " No command: %s \n " , argv [ 0 ] ) ;
2004-08-18 12:47:08 +00:00
return usage_fn ( ctx , argc , argv ) ;
2003-08-13 01:53:07 +00:00
}
/*
2004-08-18 12:47:08 +00:00
run a usage function from a function table . If not found then fail
*/
int net_run_usage ( struct net_context * ctx ,
int argc , const char * * argv ,
const struct net_functable * functable )
{
int i ;
if ( argc < 1 ) {
d_printf ( " net_run_usage: TODO (argc < 1) \n " ) ;
return 1 ;
}
for ( i = 0 ; functable [ i ] . name ; i + + ) {
if ( StrCaseCmp ( argv [ 0 ] , functable [ i ] . name ) = = 0 )
if ( functable [ i ] . usage ) {
return functable [ i ] . usage ( ctx , argc - 1 , argv + 1 ) ;
}
}
d_printf ( " No usage for command: %s \n " , argv [ 0 ] ) ;
return 1 ;
}
/*
run a usage function from a function table . If not found then fail
2004-08-18 09:33:54 +00:00
*/
int net_run_help ( struct net_context * ctx ,
int argc , const char * * argv ,
const struct net_functable * functable )
2003-08-13 01:53:07 +00:00
{
2004-08-18 09:33:54 +00:00
int i ;
2004-08-18 12:47:08 +00:00
2004-08-18 09:33:54 +00:00
if ( argc < 1 ) {
d_printf ( " net_run_help: TODO (argc < 1) \n " ) ;
2003-08-13 01:53:07 +00:00
return 1 ;
}
2004-08-18 12:47:08 +00:00
2004-08-18 09:33:54 +00:00
for ( i = 0 ; functable [ i ] . name ; i + + ) {
if ( StrCaseCmp ( argv [ 0 ] , functable [ i ] . name ) = = 0 )
if ( functable [ i ] . help ) {
return functable [ i ] . help ( ctx , argc - 1 , argv + 1 ) ;
}
2003-08-13 01:53:07 +00:00
}
2004-08-18 12:47:08 +00:00
2004-08-18 09:33:54 +00:00
d_printf ( " No help for command: %s \n " , argv [ 0 ] ) ;
2004-08-18 12:47:08 +00:00
2004-08-18 09:33:54 +00:00
return 1 ;
2003-08-13 01:53:07 +00:00
}
2004-08-18 12:47:08 +00:00
static int net_help ( struct net_context * ctx , int argc , const char * * argv )
2003-08-13 01:53:07 +00:00
{
2004-08-18 12:47:08 +00:00
d_printf ( " net_help: TODO \n " ) ;
return 0 ;
2003-08-13 01:53:07 +00:00
}
2004-08-18 12:47:08 +00:00
static int net_help_usage ( struct net_context * ctx , int argc , const char * * argv )
{
d_printf ( " net_help_usage: TODO \n " ) ;
return 0 ;
}
2003-08-13 01:53:07 +00:00
/* main function table */
2004-08-18 12:47:08 +00:00
static const struct net_functable const net_functable [ ] = {
{ " password " , net_password , net_password_usage , net_password_help } ,
2003-08-13 01:53:07 +00:00
2004-08-18 12:47:08 +00:00
{ " help " , net_help , net_help_usage , net_help } ,
2003-08-13 01:53:07 +00:00
{ NULL , NULL }
} ;
2004-08-18 12:47:08 +00:00
static int net_usage ( struct net_context * ctx , int argc , const char * * argv )
2004-08-18 09:33:54 +00:00
{
2004-08-18 12:47:08 +00:00
return net_run_usage ( ctx , argc , argv , net_functable ) ;
2004-08-18 09:33:54 +00:00
}
2003-08-13 01:53:07 +00:00
/****************************************************************************
main program
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2004-08-18 09:33:54 +00:00
static int binary_net ( int argc , const char * * argv )
2003-08-13 01:53:07 +00:00
{
int opt , i ;
2004-08-18 09:33:54 +00:00
int rc ;
int argc_new ;
const char * * argv_new ;
2004-08-18 12:47:08 +00:00
TALLOC_CTX * mem_ctx ;
struct net_context * ctx ;
2004-08-19 12:36:05 +00:00
const char * domain ;
2003-08-13 01:53:07 +00:00
poptContext pc ;
2004-08-18 13:00:28 +00:00
struct poptOption long_options [ ] = {
2004-08-19 12:24:58 +00:00
POPT_AUTOHELP
POPT_COMMON_SAMBA
POPT_COMMON_CONNECTION
POPT_COMMON_CREDENTIALS
POPT_COMMON_VERSION
POPT_TABLEEND
2004-08-18 13:00:28 +00:00
} ;
2004-08-18 09:33:54 +00:00
setup_logging ( " net " , DEBUG_STDOUT ) ;
# ifdef HAVE_SETBUFFER
setbuffer ( stdout , NULL , 0 ) ;
# endif
2004-08-19 12:24:58 +00:00
pc = poptGetContext ( " net " , argc , ( const char * * ) argv , long_options ,
POPT_CONTEXT_KEEP_FIRST ) ;
2004-08-18 09:33:54 +00:00
2003-08-13 01:53:07 +00:00
while ( ( opt = poptGetNextOpt ( pc ) ) ! = - 1 ) {
switch ( opt ) {
default :
2004-08-18 09:33:54 +00:00
d_printf ( " Invalid option %s: %s \n " ,
2003-08-13 01:53:07 +00:00
poptBadOption ( pc , 0 ) , poptStrerror ( opt ) ) ;
2004-08-18 12:47:08 +00:00
net_help ( ctx , argc , argv ) ;
2003-08-13 01:53:07 +00:00
exit ( 1 ) ;
}
}
2004-08-18 09:33:54 +00:00
lp_load ( dyn_CONFIGFILE , True , False , False ) ;
load_interfaces ( ) ;
2003-08-13 01:53:07 +00:00
argv_new = ( const char * * ) poptGetArgs ( pc ) ;
argc_new = argc ;
for ( i = 0 ; i < argc ; i + + ) {
if ( argv_new [ i ] = = NULL ) {
argc_new = i ;
break ;
}
}
2004-08-18 09:33:54 +00:00
if ( argc_new < 2 ) {
d_printf ( " Usage: TODO \n " ) ;
return 1 ;
2003-08-13 01:53:07 +00:00
}
2004-08-19 12:36:05 +00:00
if ( cmdline_auth_info . domain [ 0 ] ) {
domain = cmdline_auth_info . domain ;
} else {
domain = lp_workgroup ( ) ;
}
mem_ctx = talloc_init ( " net_context " ) ;
ctx = talloc_p ( mem_ctx , struct net_context ) ;
if ( ! ctx ) {
d_printf ( " talloc_init(net_context) failed \n " ) ;
exit ( 1 ) ;
}
ZERO_STRUCTP ( ctx ) ;
ctx - > mem_ctx = mem_ctx ;
ctx - > user . account_name = talloc_strdup ( ctx - > mem_ctx , cmdline_auth_info . username ) ;
ctx - > user . domain_name = talloc_strdup ( ctx - > mem_ctx , domain ) ;
ctx - > user . password = talloc_strdup ( ctx - > mem_ctx , cmdline_auth_info . password ) ;
2004-08-18 12:47:08 +00:00
rc = net_run_function ( ctx , argc_new - 1 , argv_new + 1 , net_functable , net_usage ) ;
2003-08-13 01:53:07 +00:00
2004-08-18 09:33:54 +00:00
if ( rc ! = 0 ) {
DEBUG ( 0 , ( " return code = %d \n " , rc ) ) ;
2003-08-13 01:53:07 +00:00
}
2004-08-18 12:47:08 +00:00
talloc_destroy ( mem_ctx ) ;
2003-08-13 01:53:07 +00:00
return rc ;
}
2004-08-18 09:33:54 +00:00
int main ( int argc , const char * * argv )
{
return binary_net ( argc , argv ) ;
}