0001-01-01 02:30:17 +02:30
/*
Samba Unix / Linux SMB client library
Version 3.0
Distributed SMB / CIFS Server Management Utility
Copyright ( C ) 2001 Steve French ( sfrench @ us . ibm . com )
Copyright ( C ) 2001 Jim McDonough ( jmcd @ us . ibm . com )
connect_to_ipc based on similar routine
Copyright ( C ) Andrew Tridgell 1994 - 1998
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
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/*****************************************************/
/* */
/* 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>
/***********************************************************************/
/* Beginning of internationalization section. Translatable constants */
/* should be kept in this area and referenced in the rest of the code. */
/* */
/* No functions, outside of Samba or LSB (Linux Standards Base) should */
/* be used (if possible). */
/***********************************************************************/
typedef struct _functable {
int func ;
char funcname [ 12 ] ;
} functable ;
/* functions available */
# define FILEF 1
# define SHAREF 2
# define SESSIONF 3
# define SERVERF 4
# define DOMAINF 5
# define PRINTQF 6
# define USERF 7
# define GROUPF 8
# define VALIDATEF 9
# define GROUPMEMBERF 10
0001-01-01 02:30:17 +02:30
# define ADMINF 11
# define SERVICEF 12
# define PASSWORDF 13
# define HELPF 14
0001-01-01 02:30:17 +02:30
const functable net_func [ ] = {
{ FILEF , " FILE " } ,
{ SHAREF , " SHARE " } ,
{ SESSIONF , " SESSION " } ,
{ SERVERF , " SERVER " } ,
{ DOMAINF , " DOMAIN " } ,
{ PRINTQF , " PRINTQ " } ,
{ USERF , " USER " } ,
{ GROUPF , " GROUP " } ,
{ VALIDATEF , " VALIDATE " } ,
{ GROUPMEMBERF , " GROUPMEMBER " } ,
0001-01-01 02:30:17 +02:30
{ ADMINF , " ADMIN " } ,
{ SERVICEF , " SERVICE " } ,
{ PASSWORDF , " PASSWORD " } ,
0001-01-01 02:30:17 +02:30
{ HELPF , " HELP " }
} ;
/* subfunctions available */
# define OTHER_SF 0
# define LIST_SF 1 /* enumerate */
# define ADD_SF 2 /* also used for create and start */
# define DELETE_SF 3 /* also used for close and stop */
# define INFO_SF 4 /* get information */
const functable net_subfunc [ ] = {
{ LIST_SF , " LIST " } ,
{ LIST_SF , " ENUMERATE " } ,
{ ADD_SF , " ADD " } ,
{ ADD_SF , " CREATE " } ,
{ DELETE_SF , " CLOSE " } ,
0001-01-01 02:30:17 +02:30
{ DELETE_SF , " DELETE " } ,
{ INFO_SF , " INFO " }
0001-01-01 02:30:17 +02:30
} ;
const char share_type [ ] [ 6 ] = {
" Disk " ,
" Print " ,
" Dev " ,
" IPC "
} ;
# define PASSWORD_PROMPT "Password: "
# define YES_STRING "Yes"
# define NO_STRING "No"
# define NET_USAGE \
" \n Usage: \n " \
" net domain \t to list domains \n " \
" net file \t to list open files on a server \n " \
" net group \t to list user groups \n " \
" net groupmember to list users in a group \n " \
0001-01-01 02:30:17 +02:30
" net password to change the password of a user \n " \
0001-01-01 02:30:17 +02:30
" net printq \t to list the print queues on a server \n " \
" net server \t to list servers in a domain \n " \
" net session \t to list clients with open sessions to a server \n " \
" net share \t to list shares exported by a server \n " \
" net user \t to list users \n " \
" net validate \t to check whether a user and the corresponding password are valid \n " \
" net help \n " \
" \n Type \" net help <option> \" to get more information on that option \n "
# define NET_FILE_USAGE \
" \n net file [misc. options] [targets] " \
" \n \t enumerates all open files on file server \n " \
" \n net file <username> [misc. options] [targets] " \
" \n \t enumerates all files opened by username on file server \n " \
" \n net file CLOSE <id> [misc. options] [targets] " \
" \n \t closes specified file on target server \n "
# define FILE_INFO_DISPLAY \
" File ID %d \n " \
" User name %s \n " \
" Locks 0x%-4.2x \n " \
" Path %s \n " \
" Permissions 0x%x \n "
# define FILE_ENUM_DISPLAY \
" \n Enumerating open files on remote server: \n \n " \
" \n \t FileId Opened by Perms Locks Path \n " \
" \t ------ --------- ----- ----- ---- \n "
# define NET_SHARE_USAGE \
" \n net share [misc. options] [targets] \n " \
" \t enumerates all exported resources (network shares) on target server \n " \
" \n net share ADD <name=serverpath> [misc. options] [targets] " \
" \n \t Add a share from a server (makes the export active) \n " \
" \n net share DELETE <sharename> [misc. options] [targets] \n " \
" \t or " \
" \n net share CLOSE <sharename> [misc. options] [targets] " \
" \n \t Deletes a share from a server (makes the export inactive) \n "
# define SHARE_ENUM_DISPLAY \
" \n Enumerating shared resources (exports) on remote server: \n \n " \
" \n Share name Type Description \n " \
" ---------- ---- ----------- \n "
# define NET_SESSION_USAGE \
" \n net session [misc. options] [targets] " \
" \n \t enumerates all active SMB/CIFS sessions on target server \n " \
" \n net session DELETE <client_name> [misc. options] [targets] \n " \
" \t or " \
" \n net session CLOSE <client_name> [misc. options] [targets] " \
" \n \t Deletes (closes) a session from specified client to server \n "
# define SESSION_ENUM_DISPLAY \
" Computer User name Client Type Opens Idle time \n \n " \
" ------------------------------------------------------------------------------ \n "
# define SESSION_DISPLAY_ONE \
" User name %-20.20s \n " \
" Computer %-20.20s \n " \
" Guest logon %-20.20s \n " \
" Client Type %-40.40s \n " \
" Sess time %2.2d:%2.2d:%2.2d \n " \
" Idle time %2.2d:%2.2d:%2.2d \n "
# define SESSION_DISPLAY_CONNS \
" Share name Type # Opens \n " \
" ------------------------------------------------------------------------------ \n "
# define NET_SERVER_USAGE \
" \n Usage: \n " \
" net server [domain] \t lists the servers in the specified domain or workgroup. \n " \
" If domain is not specified, it uses the current domain or workgroup as \n " \
" the default. \n "
# define SERVER_ENUM_DISPLAY "\nEnumerating servers in this domain or workgroup: \n\n" \
" \n \t Server name Server description \n " \
" \t ------------- ---------------------------- \n "
# define NET_DOMAIN_USAGE \
" \n Usage: \n " \
" net domain [misc. options] [target] \n \t lists the domains " \
" or workgroups visible on the current network \n "
# define DOMAIN_ENUM_DISPLAY \
" \n Enumerating domains: \n \n " \
" \n \t Domain name Server name of Browse Master \n " \
" \t ------------- ---------------------------- \n "
# define NET_PRINTQ_USAGE \
" \n Usage: \n " \
" net printq [misc. options] [targets] \n " \
" \t or \n " \
" net printq list [<queue_name>] [misc. options] [targets] \n " \
" \t lists the specified queue and jobs on the target server. \n " \
" \t If the queue name is not specified, all queues are listed. \n \n " \
" net printq delete [<queue name>] [misc. options] [targets] \n " \
" \t deletes the specified job number on the target server, or the \n " \
" \t printer queue if no job number is specified \n "
# define PRINTQ_ENUM_DISPLAY \
" Print queues at \\ \\ %s \n \n " \
" Name Job # Size Status \n \n " \
" ------------------------------------------------------------------ " \
" ------------- \n "
# define PRINTQ_DISPLAY_ONE "%-23.23s %5d jobs %-22.22s\n"
# define PRINTQ_PRINTER_ACTIVE "*Printer Active*"
# define PRINTQ_PRINTER_PAUSED "*Printer Paused*"
# define PRINTQ_PRINTER_ERROR "*Printer error*"
# define PRINTQ_PRINTER_DELPEND "*Delete Pending*"
# define PRINTQ_PRINTER_STATUNK "**UNKNOWN STATUS**"
# define PRINTQ_DISPLAY_JOB " %-23.23s %5d %9d %-22.22s\n"
# define PRINTQ_JOB_PRINTING "Printing"
# define PRINTQ_JOB_QUEUED "Waiting"
# define PRINTQ_JOB_PAUSED "Held in queue"
# define PRINTQ_JOB_SPOOLING "Spooling"
# define PRINTQ_QUEUE_WORD " Queue"
# define NET_USER_USAGE \
" \n net user [misc. options] [targets] \n \t Enumerate users \n " \
" \n net user DELETE <name> [misc. options] [targets] " \
" \n \t Delete specified user \n " \
0001-01-01 02:30:17 +02:30
" \n net user INFO <name> [misc. options] [targets] " \
" \n \t List the domain groups of the specified user \n " \
" \n net user ADD <name> [-F user flags] [misc. options] [targets] " \
0001-01-01 02:30:17 +02:30
" \n \t Add specified user \n "
# define USER_ENUM_DISPLAY \
" \n Enumerating shared resources (exports) on remote server: \n \n " \
" \n User name Description Home Directory Profile Directory \n " \
" --------- ----------- -------------- ----------------- \n "
# define NET_GROUP_USAGE \
" \n net group [misc. options] [targets] " \
" \n \t Enumerate user groups \n " \
" \n net group DELETE <name> [misc. options] [targets] " \
" \n \t Delete specified group \n " \
" \n net group ADD <name> [-C comment] [misc. options] [targets] " \
" \n \t Create specified group \n "
# define NET_GROUPMEMBER_USAGE \
" \n net groupmember LIST <group name> [misc. options] [targets] " \
" \n \t Enumerate users in a group \n " \
" \n net groupmember DELETE <group name> <user name> [misc. options] " \
" [targets] \n \t Delete sepcified user from specified group \n " \
" \n net groupmember ADD <group name> <user name> [misc. options] [targets] " \
" \n \t Add specified user to specified group \n "
0001-01-01 02:30:17 +02:30
# define NET_ADMIN_USAGE \
" \n net admin <remote command to execute> [cmd arguments [environment]] [misc_options] [targets] \n " \
" \t executes a remote command on an os/2 target server \n "
# define NET_PASSWORD_USAGE \
" \n net password <user> <old password> <new password> [misc_options] [targets] \n " \
" \t changes the password for the specified user on a remote server \n "
# define NET_SERVICE_USAGE \
" \n net service [misc. options] [targets] \n " \
" \t enumerates all running service daemons on target server \n " \
" \n net service ADD <name> [service startup arguments] [misc. options] [targets] " \
" \n \t Start named service on remote server \n " \
" \n net service DELETE <name> [misc. options] [targets] \n " \
" \n \t Stop named service on remote server \n "
0001-01-01 02:30:17 +02:30
# define NET_VALIDATE_USAGE \
" \n net validate <username> [password] \n " \
" \t Validate user and password to check whether they can access target server or domain \n "
# define TARGET_USAGE "\nValid targets: choose one (none defaults to using the %s)\n"
# define GLBL_LCL_MASTER "global browsemaster or local browse master if that is not found"
# define DOMAIN_MASTER "local domain browse master"
# define LOCAL_HOST "localhost"
# define MISC_OPT_USAGE "\nValid miscellaneous options are:\n"
# define SERVER_USAGE "\t-S or --server=<server>\t\tserver name\n"
# define IPADDRESS_USAGE "\t-I or --ipaddress=<ipaddr>\tip address of target server\n"
# define PORT_USAGE "\t-p or --port=<port number>\tconnection port on target server\n"
# define WORKGROUP_USAGE "\t-w or --workgroup=<wg>\t\ttarget workgroup or domain name\n"
# define COMMENT_USAGE "\t-C or --comment=<comment>\tdescriptive comment (for add only)\n"
# define MYWORKGROUP_USAGE "\t-W or --myworkgroup=<wg>\tclient workgroup\n"
# define DEBUG_USAGE "\t-d or --debug=<level>\t\tdebug level (1-9)\n"
# define MYNAME_USAGE "\t-n or --myname=<name>\t\tclient name\n"
# define USER_USAGE "\t-U or --user=<name>\t\tuser name\n"
# define CONF_USAGE "\t-s or --conf=<path>\t\tpathname of smb.conf file\n"
# define JOBID_USAGE "\t-j or --jobid=<job id>\t\tjob id\n"
# define MAXUSERS_USAGE "\t-M or --maxusers=<num>\t\tmax users allowed for share\n"
# define LONG_USAGE "\t-l or --long\t\t\tDisplay full information\n"
# define ERRMSG_NOCONN_TARGET_SRVR "\nUnable to connect to target server\n"
# define ERRMSG_NOCONN_BROWSE_MSTR "\nUnable to connect to browse master\n"
# define ERRMSG_NOT_IMPLEMENTED "\nNot implemented\n"
# define ERRMSG_FILEID_MISSING "\nMissing fileid of file to close\n\n"
# define ERRMSG_GROUPNAME_MISSING "\n\nGroup name not specified\n"
# define ERRMSG_USERNAME_MISSING "\n\nUser name not specified\n"
# define ERRMSG_SHARENAME_MISSING "\n\nShare name not specified\n"
# define ERRMSG_TARGET_WG_NOT_VALID "\nTarget workgroup option not valid "\
" except on net server command, ignored "
# define ERRMSG_INVALID_HELP_OPTION "\nInvalid help option\n"
# define ERRMSG_INVALID_OPTION "\nInvalid option %c (%d)\n"
# define ERRMSG_INVALID_IPADDRESS "\nInvalid ip address specified\n"
# define ERRMSG_SPURIOUS_PARM "\nInvalid paramater ignored: %s\n"
# define ERRMSG_BOTH_SERVER_IPADDRESS "\nTarget server and IP address both "\
" specified. Do not set both at the same time. The target IP address was used \n "
# define ERRMSG_INVALID_DOMAIN_ACTION "\nInvalid action for NET DOMAIN command"\
" ignored. Only listing domains permitted. \n "
/* Column headers */
# define COMMENT_STR "Comment "
# define USER_STR "User name "
# define GROUP_STR "Group name "
0001-01-01 02:30:17 +02:30
# define SERVICE_STR "Service name"
0001-01-01 02:30:17 +02:30
# define HOMED_STR "Home directory "
# define LOGONS_STR "Logon script "
/************************************************************************************/
/* end of internationalization section */
/************************************************************************************/
extern int optind , opterr , optopt ;
extern struct in_addr ipzero ;
struct cli_state * cli ;
static pstring global_requester_name ;
static pstring host ; /* target server */
static pstring password ;
static pstring global_user_name ;
static pstring global_workgroup ;
static int port = SMB_PORT ;
0001-01-01 02:30:17 +02:30
static int long_list_entries = 0 ;
0001-01-01 02:30:17 +02:30
static BOOL got_pass = False ;
static BOOL have_ip = False ;
struct in_addr dest_ip ;
int get_func ( const char * parm )
{
int i ;
for ( i = 0 ; i < = sizeof ( net_func ) ; i + + )
if ( StrnCaseCmp ( parm , net_func [ i ] . funcname , 10 ) = = 0 )
return net_func [ i ] . func ;
return 0 ;
}
int get_subfunc ( const char * parm )
{
int i ;
for ( i = 0 ; i < = sizeof ( net_subfunc ) ; i + + )
if ( StrnCaseCmp ( parm , net_subfunc [ i ] . funcname , 10 ) = = 0 )
return net_subfunc [ i ] . func ;
return 0 ;
}
/****************************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
struct cli_state * connect_to_ipc ( char * server )
{
struct cli_state * c ;
struct nmb_name called , calling ;
struct in_addr ip ;
char * server_n ;
fstring servicename ;
char * sharename ;
/* make a copy so we don't modify the global string 'service' */
safe_strcpy ( servicename , " IPC$ " , sizeof ( servicename ) - 1 ) ;
sharename = servicename ;
if ( * sharename = = ' \\ ' ) {
server = sharename + 2 ;
sharename = strchr ( server , ' \\ ' ) ;
if ( ! sharename ) return NULL ;
* sharename = 0 ;
sharename + + ;
}
if ( server = = NULL )
return NULL ; /* if ip addr specified, ascii version of ip address is used as host name */
server_n = server ;
ip = ipzero ;
make_nmb_name ( & calling , global_requester_name , 0x0 ) ;
make_nmb_name ( & called , server , 0x20 ) ;
again :
if ( have_ip )
ip = dest_ip ;
else ip = ipzero ;
DEBUG ( 3 , ( " Connecting to host=%s \\ share=%s \n \n " ,
server , " IPC$ " ) ) ;
/* have to open a new connection */
if ( ! ( c = cli_initialise ( NULL ) ) | | ( cli_set_port ( c , port ) = = 0 ) | |
! cli_connect ( c , server_n , & ip ) ) {
DEBUG ( 1 , ( " Connection to %s failed \n " , server_n ) ) ;
return NULL ;
}
c - > protocol = PROTOCOL_NT1 ;
if ( ! cli_session_request ( c , & calling , & called ) ) {
char * p ;
DEBUG ( 1 , ( " session request to %s failed (%s) \n " ,
called . name , cli_errstr ( c ) ) ) ;
cli_shutdown ( c ) ;
SAFE_FREE ( c ) ;
if ( ( p = strchr ( called . name , ' . ' ) ) ) {
* p = 0 ;
goto again ;
}
if ( strcmp ( called . name , " *SMBSERVER " ) ) {
make_nmb_name ( & called , " *SMBSERVER " , 0x20 ) ;
goto again ;
}
return NULL ;
}
DEBUG ( 4 , ( " session request ok \n " ) ) ;
if ( ! cli_negprot ( c ) ) {
DEBUG ( 1 , ( " protocol negotiation failed \n " ) ) ;
cli_shutdown ( c ) ;
SAFE_FREE ( c ) ;
return NULL ;
}
if ( ! got_pass ) {
char * pass = getpass ( PASSWORD_PROMPT ) ;
if ( pass ) {
pstrcpy ( password , pass ) ;
}
}
if ( ! cli_session_setup ( c , global_user_name ,
password , strlen ( password ) ,
password , strlen ( password ) ,
global_workgroup ) ) {
/* try again with a null username */
if ( ! cli_session_setup ( c , " " , " " , 0 , " " , 0 , global_workgroup ) ) {
DEBUG ( 1 , ( " session setup failed: %s \n " , cli_errstr ( c ) ) ) ;
cli_shutdown ( c ) ;
SAFE_FREE ( c ) ;
return NULL ;
}
DEBUG ( 3 , ( " Anonymous login successful \n " ) ) ;
}
DEBUG ( 4 , ( " session setup ok \n " ) ) ;
if ( ! cli_send_tconX ( c , sharename , " ????? " ,
password , strlen ( password ) + 1 ) ) {
DEBUG ( 1 , ( " tree connect failed: %s \n " , cli_errstr ( c ) ) ) ;
cli_shutdown ( c ) ;
SAFE_FREE ( c ) ;
return NULL ;
}
DEBUG ( 4 , ( " tconx ok \n " ) ) ;
return c ;
}
void usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
void file_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_FILE_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , LOCAL_HOST ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
/***************************************************************************
list info on an open file
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void file_fn ( const char * pPath , const char * pUser , uint16 perms , uint16 locks , uint32 id )
{
0001-01-01 02:30:17 +02:30
d_printf ( " \t %-7.1d %-20.20s 0x%-4.2x %-6.1d %s \n " ,
0001-01-01 02:30:17 +02:30
id , pUser , perms , locks , pPath ) ;
}
static void one_file_fn ( const char * pPath , const char * pUser , uint16 perms , uint16 locks , uint32 id )
{
0001-01-01 02:30:17 +02:30
d_printf ( FILE_INFO_DISPLAY , id , pUser , locks , pPath , perms ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_file ( int subfunct , const char * id )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 ) strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
if ( subfunct = = DELETE_SF ) { /* close open file on remote server */
if ( id = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_FILEID_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else
return cli_NetFileClose ( cli , atoi ( id ) ) ;
} else if ( subfunct = = LIST_SF ) {
0001-01-01 02:30:17 +02:30
d_printf ( FILE_ENUM_DISPLAY ) ; /* file list header */
0001-01-01 02:30:17 +02:30
return cli_NetFileEnum ( cli , NULL , NULL , file_fn ) ;
} else if ( ( subfunct = = OTHER_SF ) & & id ) {
return cli_NetFileGetInfo ( cli , atoi ( id ) , one_file_fn ) ;
} else file_usage ( ) ;
return - 1 ;
}
void share_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_SHARE_USAGE ) ; /* command syntax */
d_printf ( TARGET_USAGE , LOCAL_HOST ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( COMMENT_USAGE ) ;
d_printf ( MAXUSERS_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
void long_share_fn ( const char * share_name , uint32 type , const char * comment , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-12.12s %-8.8s %-50.50s \n " , share_name , share_type [ type ] , comment ) ;
0001-01-01 02:30:17 +02:30
}
void share_fn ( const char * share_name , uint32 type , const char * comment , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-12.12s \n " , share_name ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_share ( int subfunct , const char * sharename , const char * comment , int maxusers )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
if ( subfunct = = DELETE_SF ) {
if ( sharename = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_SHARENAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else
return cli_NetShareDelete ( cli , sharename ) ;
} else if ( subfunct = = LIST_SF ) {
if ( long_list_entries ) {
0001-01-01 02:30:17 +02:30
d_printf ( SHARE_ENUM_DISPLAY ) ;
0001-01-01 02:30:17 +02:30
return cli_RNetShareEnum ( cli , long_share_fn , NULL ) ;
} else {
return cli_RNetShareEnum ( cli , share_fn , NULL ) ;
}
} else if ( subfunct = = ADD_SF ) {
if ( sharename = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_SHARENAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else {
RAP_SHARE_INFO_2 sinfo ;
char * p ;
p = strchr ( sharename , ' = ' ) ;
strncpy ( sinfo . share_name , sharename , PTR_DIFF ( p , sharename ) ) ;
sinfo . reserved1 = ' \0 ' ;
sinfo . share_type = 0 ;
sinfo . comment = comment ;
sinfo . perms = 0 ;
sinfo . maximum_users = maxusers ;
sinfo . active_users = 0 ;
sinfo . path = p + 1 ;
0001-01-01 02:30:17 +02:30
memset ( sinfo . password , ' \0 ' , sizeof ( sinfo . password ) ) ;
0001-01-01 02:30:17 +02:30
sinfo . reserved2 = ' \0 ' ;
return cli_NetShareAdd ( cli , & sinfo ) ;
}
} else
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
void session_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_SESSION_USAGE ) ; /* command syntax */
d_printf ( TARGET_USAGE , LOCAL_HOST ) ; /* Target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ; /* Misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
void list_sessions_func ( char * wsname , char * username , uint16 conns ,
uint16 opens , uint16 users , uint32 sess_time ,
uint32 idle_time , uint32 user_flags , char * clitype )
{
int hrs = idle_time / 3600 ;
int min = ( idle_time / 60 ) % 60 ;
int sec = idle_time % 60 ;
0001-01-01 02:30:17 +02:30
d_printf ( " \\ \\ %-18.18s %-20.20s %-18.18s %5d %2.2d:%2.2d:%2.2d \n " ,
0001-01-01 02:30:17 +02:30
wsname , username , clitype , opens , hrs , min , sec ) ;
}
0001-01-01 02:30:17 +02:30
void display_session_func ( const char * wsname , const char * username , uint16 conns ,
0001-01-01 02:30:17 +02:30
uint16 opens , uint16 users , uint32 sess_time ,
0001-01-01 02:30:17 +02:30
uint32 idle_time , uint32 user_flags , const char * clitype )
0001-01-01 02:30:17 +02:30
{
int ihrs = idle_time / 3600 ;
int imin = ( idle_time / 60 ) % 60 ;
int isec = idle_time % 60 ;
int shrs = sess_time / 3600 ;
int smin = ( sess_time / 60 ) % 60 ;
int ssec = sess_time % 60 ;
0001-01-01 02:30:17 +02:30
d_printf ( SESSION_DISPLAY_ONE , username , wsname ,
0001-01-01 02:30:17 +02:30
( user_flags & 0x0 ) ? YES_STRING : NO_STRING , clitype ,
shrs , smin , ssec , ihrs , imin , isec ) ;
}
0001-01-01 02:30:17 +02:30
void display_conns_func ( uint16 conn_id , uint16 conn_type , uint16 opens , uint16 users , uint32 conn_time , const char * username , const char * netname )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-14.14s %-8.8s %5d \n " , netname , share_type [ conn_type ] , opens ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_session ( int subfunct , const char * sessname )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
int res ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
switch ( subfunct ) {
case LIST_SF :
if ( sessname ) {
res = cli_NetSessionGetInfo ( cli , sessname , display_session_func ) ;
if ( res > = 0 ) {
0001-01-01 02:30:17 +02:30
d_printf ( SESSION_DISPLAY_CONNS ) ;
0001-01-01 02:30:17 +02:30
return cli_NetConnectionEnum ( cli , sessname , display_conns_func ) ;
} else
return res ;
} else {
0001-01-01 02:30:17 +02:30
d_printf ( SESSION_ENUM_DISPLAY ) ;
0001-01-01 02:30:17 +02:30
return cli_NetSessionEnum ( cli , list_sessions_func ) ;
}
case DELETE_SF :
return cli_NetSessionDel ( cli , sessname ) ;
default :
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
session_usage ( ) ;
}
return - 1 ;
}
/****************************************************************************
list a server name
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void display_server_func ( const char * name , uint32 m , const char * comment , void * reserved )
{
0001-01-01 02:30:17 +02:30
d_printf ( " \t %-16.16s %s \n " , name , comment ) ;
0001-01-01 02:30:17 +02:30
}
void server_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_SERVER_USAGE ) ; /* command syntax */
d_printf ( TARGET_USAGE , DOMAIN_MASTER ) ; /* Target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ; /* Misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_server ( char * temp_workgroup , int subfunct )
0001-01-01 02:30:17 +02:30
{
/* try to find master browser for our domain - if we fail try to find pdc */
char our_workgroup [ 16 ] ;
struct in_addr brow_ips ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
/* find target server based on workgroup or domain */
if ( ( temp_workgroup = = 0 ) | | ( temp_workgroup [ 0 ] = = 0 ) )
temp_workgroup = lp_workgroup ( ) ; /* by default enum our local workgroup or domain */
safe_strcpy ( our_workgroup , temp_workgroup , 15 ) ;
if ( ! resolve_name ( our_workgroup , & brow_ips , 0x1D ) ) {
/* go looking for workgroups */
DEBUG ( 1 , ( " Unable to resolve master browser via name lookup \n " ) ) ;
return - 2 ;
} else {
have_ip = True ;
dest_ip = brow_ips ;
}
}
if ( host [ 0 ] = = 0 ) strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_BROWSE_MSTR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
0001-01-01 02:30:17 +02:30
d_printf ( SERVER_ENUM_DISPLAY ) ; /* header for list of servers */
0001-01-01 02:30:17 +02:30
return cli_NetServerEnum ( cli , cli - > server_domain , SV_TYPE_ALL , display_server_func , NULL ) ;
/* BB add mechanism to find PDC for our domain and send enum to it in this error case */
/* BB add server service (smb server daemon) start and stop */
}
void domain_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_DOMAIN_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , GLBL_LCL_MASTER ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
int net_domain ( void )
{
char * our_workgroup ;
struct in_addr msbrow_ip ;
our_workgroup = lp_workgroup ( ) ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( MSBROWSE , & msbrow_ip , 1 ) ) {
DEBUG ( 1 , ( " Unable to resolve global master browser via name lookup " ) ) ;
if ( ! resolve_name ( our_workgroup , & msbrow_ip , 0x1D ) ) {
DEBUG ( 1 , ( " Unable to resolve domain browser via name lookup \n " ) ) ;
return - 2 ;
} else {
have_ip = True ;
dest_ip = msbrow_ip ;
}
} else {
have_ip = True ;
dest_ip = msbrow_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_BROWSE_MSTR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
0001-01-01 02:30:17 +02:30
d_printf ( DOMAIN_ENUM_DISPLAY ) ; /* header for list of domains */
0001-01-01 02:30:17 +02:30
return cli_NetServerEnum ( cli , cli - > server_domain , SV_TYPE_DOMAIN_ENUM , display_server_func , NULL ) ;
}
void printq_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_PRINTQ_USAGE ) ;
d_printf ( TARGET_USAGE , LOCAL_HOST ) ;
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ;
d_printf ( PORT_USAGE ) ;
d_printf ( JOBID_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
void enum_queue ( const char * queuename , uint16 pri , uint16 start , uint16 until , const char * sep , const char * pproc , const char * dest , const char * qparms , const char * qcomment , uint16 status , uint16 jobcount ) {
0001-01-01 02:30:17 +02:30
pstring queuecol ;
pstring statcol ;
pstrcpy ( queuecol , queuename ) ;
pstrcat ( queuecol , PRINTQ_QUEUE_WORD ) ;
switch ( status ) {
case 0 :
pstrcpy ( statcol , PRINTQ_PRINTER_ACTIVE ) ;
break ;
case 1 :
pstrcpy ( statcol , PRINTQ_PRINTER_PAUSED ) ;
break ;
case 2 :
pstrcpy ( statcol , PRINTQ_PRINTER_ERROR ) ;
break ;
case 3 :
pstrcpy ( statcol , PRINTQ_PRINTER_DELPEND ) ;
break ;
default :
pstrcpy ( statcol , PRINTQ_PRINTER_STATUNK ) ;
}
0001-01-01 02:30:17 +02:30
d_printf ( PRINTQ_DISPLAY_ONE , queuecol , jobcount , statcol ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
void enum_jobs ( uint16 jobid , const char * ownername , const char * notifyname , const char * datatype , const char * jparms , uint16 pos , uint16 status , const char * jstatus , uint submitted , uint jobsize , const char * comment ) {
0001-01-01 02:30:17 +02:30
pstring statcol ;
switch ( status ) {
case 0 :
pstrcpy ( statcol , PRINTQ_JOB_QUEUED ) ;
break ;
case 1 :
pstrcpy ( statcol , PRINTQ_JOB_PAUSED ) ;
break ;
case 2 :
pstrcpy ( statcol , PRINTQ_JOB_SPOOLING ) ;
break ;
case 3 :
pstrcpy ( statcol , PRINTQ_JOB_PRINTING ) ;
break ;
default :
pstrcpy ( statcol , PRINTQ_PRINTER_STATUNK ) ;
}
0001-01-01 02:30:17 +02:30
d_printf ( PRINTQ_DISPLAY_JOB , ownername , jobid , jobsize , statcol ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_printq ( int subfunct , const char * printq , int jobid )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
switch ( subfunct ) {
case LIST_SF :
0001-01-01 02:30:17 +02:30
d_printf ( PRINTQ_ENUM_DISPLAY , host ) ;
0001-01-01 02:30:17 +02:30
if ( printq )
return cli_NetPrintQGetInfo ( cli , printq , enum_queue , enum_jobs ) ;
else
return cli_NetPrintQEnum ( cli , enum_queue , enum_jobs ) ;
case DELETE_SF :
return cli_printjob_del ( cli , jobid ) ;
default :
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
}
void user_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_USER_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , LOCAL_HOST ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( COMMENT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
d_printf ( LONG_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
void user_fn ( const char * user_name , const char * comment , const char * home_dir , const char * logon_script , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-21.21s \n " , user_name ) ;
0001-01-01 02:30:17 +02:30
}
void long_user_fn ( const char * user_name , const char * comment , const char * home_dir , const char * logon_script , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-21.21s %-47.47s %-35.35s %35.35s \n " , user_name , comment , home_dir , logon_script ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
void group_member_fn ( const char * user_name , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-21.21s \n " , user_name ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_user ( int subfunct , const char * username , const char * comment , int flags )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
if ( subfunct = = DELETE_SF ) {
if ( username = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_USERNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else
return cli_NetUserDelete ( cli , username ) ;
} else if ( subfunct = = LIST_SF ) {
if ( long_list_entries ) {
0001-01-01 02:30:17 +02:30
d_printf ( USER_ENUM_DISPLAY ) ;
0001-01-01 02:30:17 +02:30
return cli_RNetUserEnum ( cli , long_user_fn , NULL ) ;
}
else
0001-01-01 02:30:17 +02:30
return cli_RNetUserEnum ( cli , user_fn , NULL ) ;
0001-01-01 02:30:17 +02:30
} else if ( subfunct = = ADD_SF ) {
if ( username = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_USERNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else {
RAP_USER_INFO_1 userinfo ;
safe_strcpy ( userinfo . user_name , username , sizeof ( userinfo . user_name ) ) ;
if ( flags = = - 1 ) flags = 0x21 ;
userinfo . userflags = flags ;
userinfo . reserved1 = ' \0 ' ;
userinfo . comment = comment ;
userinfo . priv = 1 ;
userinfo . home_dir = NULL ;
userinfo . logon_script = NULL ;
return cli_NetUserAdd ( cli , & userinfo ) ;
}
0001-01-01 02:30:17 +02:30
} else if ( subfunct = = INFO_SF ) {
if ( username = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_USERNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else {
/* RAP_USER_INFO_1 userinfo;
cli_NetUserInfo ( cli , & userinfo ) ; */ /* BB need to add call to get user info level 3 or 4 */
return cli_NetUserGetGroups ( cli , username , group_member_fn , NULL ) ;
}
}
else
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
void group_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_GROUP_USAGE ) ; /* command syntax */
d_printf ( TARGET_USAGE , LOCAL_HOST ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( COMMENT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
d_printf ( CONF_USAGE ) ;
d_printf ( LONG_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
void long_group_fn ( const char * group_name , const char * comment , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-21.21s %-50.50s \n " , group_name , comment ) ;
0001-01-01 02:30:17 +02:30
}
void group_fn ( const char * group_name , const char * comment , void * state )
{
0001-01-01 02:30:17 +02:30
d_printf ( " %-21.21s \n " , group_name ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_group ( int subfunct , const char * groupname , const char * comment )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
if ( subfunct = = DELETE_SF ) {
if ( groupname = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_GROUPNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else
return cli_NetGroupDelete ( cli , groupname ) ;
} else if ( subfunct = = LIST_SF ) {
if ( long_list_entries ) {
0001-01-01 02:30:17 +02:30
d_printf ( " %-21.21s %-50.50s \n " , GROUP_STR , COMMENT_STR ) ;
d_printf ( " ----------------------------- \n " ) ;
0001-01-01 02:30:17 +02:30
return cli_RNetGroupEnum ( cli , long_group_fn , NULL ) ;
}
else
return cli_RNetGroupEnum ( cli , group_fn , NULL ) ;
} else if ( subfunct = = ADD_SF ) {
if ( groupname = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_GROUPNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
} else {
RAP_GROUP_INFO_1 grinfo ;
/* BB check for length 21 or smaller explicitly ? BB */
safe_strcpy ( grinfo . group_name , groupname , sizeof ( grinfo . group_name ) ) ;
grinfo . reserved1 = ' \0 ' ;
grinfo . comment = comment ;
return cli_NetGroupAdd ( cli , & grinfo ) ;
}
} else
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
void groupmember_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_GROUPMEMBER_USAGE ) ; /* command syntax */
d_printf ( TARGET_USAGE , LOCAL_HOST ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_groupmember ( int subfunct , const char * groupname , const char * username )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
if ( groupname = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_GROUPNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
if ( subfunct = = LIST_SF )
return cli_NetGroupGetUsers ( cli , groupname , group_member_fn , NULL ) ;
if ( username = = NULL ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_USERNAME_MISSING ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
if ( subfunct = = DELETE_SF )
return cli_NetGroupDelUser ( cli , groupname , username ) ;
else if ( subfunct = = ADD_SF )
return cli_NetGroupAddUser ( cli , groupname , username ) ;
else
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
void validate_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_VALIDATE_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , GLBL_LCL_MASTER ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
int net_validate ( char * username )
{
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return 0 ;
}
0001-01-01 02:30:17 +02:30
void service_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_SERVICE_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , GLBL_LCL_MASTER ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_service ( int subfunct , const char * servicename , const char * srvc_args )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
if ( subfunct = = LIST_SF ) {
if ( long_list_entries ) {
0001-01-01 02:30:17 +02:30
d_printf ( " %-15.15s %-50.50s \n " , SERVICE_STR , COMMENT_STR ) ;
d_printf ( " ----------------------------- \n " ) ;
0001-01-01 02:30:17 +02:30
return cli_RNetServiceEnum ( cli , long_group_fn , NULL ) ;
}
else
return cli_RNetServiceEnum ( cli , group_fn , NULL ) ;
} else
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return - 1 ;
}
0001-01-01 02:30:17 +02:30
int net_password ( const char * username , const char * old_password , const char * new_password )
0001-01-01 02:30:17 +02:30
{
struct in_addr target_ip ;
if ( ( have_ip = = 0 ) & & ( host [ 0 ] = = 0 ) ) {
if ( ! resolve_name ( " localhost " , & target_ip , 0x20 ) ) {
DEBUG ( 1 , ( " No remote server specified, unable to resolve connection to localhost via name lookup " ) ) ;
return - 1 ;
} else {
have_ip = True ;
dest_ip = target_ip ;
}
}
if ( host [ 0 ] = = 0 )
strncpy ( host , inet_ntoa ( dest_ip ) , 16 ) ;
cli = connect_to_ipc ( host ) ;
if ( ! cli ) {
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOCONN_TARGET_SRVR ) ;
0001-01-01 02:30:17 +02:30
return - 2 ;
}
/* BB Add check for password lengths? */
return cli_oem_change_password ( cli , username , new_password , old_password ) ;
}
void password_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_PASSWORD_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , GLBL_LCL_MASTER ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
void admin_usage ( void )
{
0001-01-01 02:30:17 +02:30
d_printf ( NET_ADMIN_USAGE ) ; /* command syntax */
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( TARGET_USAGE , GLBL_LCL_MASTER ) ; /* target options */
d_printf ( SERVER_USAGE ) ;
d_printf ( IPADDRESS_USAGE ) ;
d_printf ( WORKGROUP_USAGE ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
d_printf ( MISC_OPT_USAGE ) ; /* misc options */
d_printf ( PORT_USAGE ) ;
d_printf ( MYWORKGROUP_USAGE ) ;
d_printf ( DEBUG_USAGE ) ;
d_printf ( MYNAME_USAGE ) ;
d_printf ( USER_USAGE ) ;
d_printf ( CONF_USAGE ) ;
0001-01-01 02:30:17 +02:30
}
0001-01-01 02:30:17 +02:30
int net_admin ( const char * command , const char * cmd_args , const char * environment )
0001-01-01 02:30:17 +02:30
{
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_NOT_IMPLEMENTED ) ;
0001-01-01 02:30:17 +02:30
return 0 ;
}
0001-01-01 02:30:17 +02:30
/****************************************************************************
main program
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int main ( int argc , char * argv [ ] )
{
int opt , i ;
char * p ;
int rc = 0 ;
int func = 0 ;
int subfunc = LIST_SF ;
int argc_new = 0 ;
0001-01-01 02:30:17 +02:30
const char * * argv_new ;
0001-01-01 02:30:17 +02:30
poptContext pc ;
static char * servicesf = CONFIGFILE ;
static char * target_workgroup = NULL ;
static char * comment = " " ;
static char * user_name = NULL ;
static char * my_workgroup = NULL ;
static char * requester_name = NULL ;
static char * dest_host = NULL ;
static int maxusers = - 1 ;
static int flagsarg = - 1 ;
static int jobid = 0 ;
static int debuglevel ;
static struct poptOption long_options [ ] = {
{ " help " , ' h ' , POPT_ARG_NONE , 0 , ' h ' } ,
{ " workgroup " , ' w ' , POPT_ARG_STRING , & target_workgroup } ,
{ " myworkgroup " , ' W ' , POPT_ARG_STRING , & my_workgroup } ,
{ " user " , ' U ' , POPT_ARG_STRING , & user_name , ' U ' } ,
{ " ipaddress " , ' I ' , POPT_ARG_STRING , 0 , ' I ' } ,
{ " port " , ' p ' , POPT_ARG_INT , & port } ,
{ " myname " , ' n ' , POPT_ARG_STRING , & requester_name } ,
{ " conf " , ' s ' , POPT_ARG_STRING , & servicesf } ,
{ " debug " , ' d ' , POPT_ARG_INT , & debuglevel , ' d ' } ,
{ " server " , ' S ' , POPT_ARG_STRING , & dest_host } ,
{ " comment " , ' C ' , POPT_ARG_STRING , & comment } ,
{ " maxusers " , ' M ' , POPT_ARG_INT , & maxusers } ,
{ " flags " , ' F ' , POPT_ARG_INT , & flagsarg } ,
{ " jobid " , ' j ' , POPT_ARG_INT , & jobid } ,
{ " long " , ' l ' , POPT_ARG_NONE , & long_list_entries } ,
{ 0 , 0 , 0 , 0 }
} ;
0001-01-01 02:30:17 +02:30
got_pass = 0 ;
dest_ip = ipzero ;
0001-01-01 02:30:17 +02:30
host [ 0 ] = 0 ;
0001-01-01 02:30:17 +02:30
dbf = x_stdout ;
0001-01-01 02:30:17 +02:30
pc = poptGetContext ( NULL , argc , ( const char * * ) argv , long_options ,
POPT_CONTEXT_KEEP_FIRST ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
while ( ( opt = poptGetNextOpt ( pc ) ) ! = - 1 ) {
switch ( opt ) {
case ' h ' :
usage ( ) ;
exit ( 0 ) ;
break ;
case ' d ' :
DEBUGLEVEL = debuglevel ;
break ;
case ' I ' :
dest_ip = * interpret_addr2 ( poptGetOptArg ( pc ) ) ;
if ( zero_ip ( dest_ip ) )
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_INVALID_IPADDRESS ) ;
0001-01-01 02:30:17 +02:30
else
have_ip = True ;
break ;
case ' U ' :
p = strchr ( user_name , ' % ' ) ;
pstrcpy ( global_user_name , user_name ) ;
if ( p ) {
* p = 0 ;
pstrcpy ( password , p + 1 ) ;
got_pass = 1 ;
}
break ;
default :
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_INVALID_OPTION , ( char ) opt , opt ) ;
0001-01-01 02:30:17 +02:30
usage ( ) ;
0001-01-01 02:30:17 +02:30
}
}
0001-01-01 02:30:17 +02:30
lp_load ( servicesf , True , False , False ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
argv_new = ( const char * * ) poptGetArgs ( pc ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
argc_new = argc ;
0001-01-01 02:30:17 +02:30
for ( i = 0 ; i < argc ; i + + ) {
if ( argv_new [ i ] = = NULL ) {
argc_new = i ;
break ;
}
}
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
if ( argc_new < 2 ) {
usage ( ) ;
return - 1 ;
}
func = get_func ( argv_new [ 1 ] ) ;
if ( func = = 0 )
return - 1 ;
if ( argc_new < 3 ) {
if ( func = = VALIDATEF ) {
validate_usage ( ) ;
return - 1 ;
}
if ( func = = HELPF ) {
usage ( ) ;
return 0 ;
}
}
if ( func = = HELPF ) {
0001-01-01 02:30:17 +02:30
switch ( get_func ( argv_new [ 2 ] ) ) {
0001-01-01 02:30:17 +02:30
case FILEF :
0001-01-01 02:30:17 +02:30
file_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case SHAREF :
0001-01-01 02:30:17 +02:30
share_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case SESSIONF :
0001-01-01 02:30:17 +02:30
session_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case SERVERF :
0001-01-01 02:30:17 +02:30
server_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case DOMAINF :
0001-01-01 02:30:17 +02:30
domain_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case PRINTQF :
0001-01-01 02:30:17 +02:30
printq_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case USERF :
0001-01-01 02:30:17 +02:30
user_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case GROUPF :
0001-01-01 02:30:17 +02:30
group_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case VALIDATEF :
0001-01-01 02:30:17 +02:30
validate_usage ( ) ;
break ;
case SERVICEF :
service_usage ( ) ;
break ;
case ADMINF :
admin_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case GROUPMEMBERF :
0001-01-01 02:30:17 +02:30
groupmember_usage ( ) ;
break ;
case PASSWORDF :
password_usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
case HELPF :
0001-01-01 02:30:17 +02:30
usage ( ) ;
break ;
0001-01-01 02:30:17 +02:30
default :
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_INVALID_HELP_OPTION ) ;
0001-01-01 02:30:17 +02:30
usage ( ) ;
0001-01-01 02:30:17 +02:30
}
return 0 ;
}
if ( argc_new > 2 ) {
/* parse next parm (argument 2) - i.e. sub function */
subfunc = get_subfunc ( argv_new [ 2 ] ) ;
}
if ( func = = 0 ) return - 1 ;
0001-01-01 02:30:17 +02:30
if ( requester_name )
pstrcpy ( global_requester_name , requester_name ) ;
else
get_myname ( global_requester_name ) ;
0001-01-01 02:30:17 +02:30
0001-01-01 02:30:17 +02:30
if ( user_name )
pstrcpy ( global_user_name , user_name ) ;
else if ( getenv ( " LOGNAME " ) )
0001-01-01 02:30:17 +02:30
pstrcpy ( global_user_name , getenv ( " LOGNAME " ) ) ;
0001-01-01 02:30:17 +02:30
fstrcpy ( global_workgroup , my_workgroup ? my_workgroup : lp_workgroup ( ) ) ;
if ( dest_host )
pstrcpy ( host , dest_host ) ;
0001-01-01 02:30:17 +02:30
if ( ( have_ip ) & & ( host [ 0 ] ) )
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_BOTH_SERVER_IPADDRESS ) ;
0001-01-01 02:30:17 +02:30
while ( ! got_pass ) { /* BB if nulluser operation. why bother to ask for pword BB */
p = getpass ( PASSWORD_PROMPT ) ;
if ( p ) {
pstrcpy ( password , p ) ;
got_pass = 1 ;
}
}
load_interfaces ( ) ;
switch ( func ) {
case FILEF :
if ( argc_new < = 3 ) {
0001-01-01 02:30:17 +02:30
if ( subfunc = = OTHER_SF )
rc = net_file ( subfunc , argv_new [ 2 ] ) ;
else
rc = net_file ( subfunc , NULL ) ;
0001-01-01 02:30:17 +02:30
} else
0001-01-01 02:30:17 +02:30
rc = net_file ( subfunc , argv_new [ 3 ] ) ;
0001-01-01 02:30:17 +02:30
break ;
case SHAREF :
if ( argc_new = = 2 )
0001-01-01 02:30:17 +02:30
rc = net_share ( subfunc , NULL , NULL , 0 ) ;
0001-01-01 02:30:17 +02:30
else
0001-01-01 02:30:17 +02:30
rc = net_share ( subfunc , argv_new [ 3 ] , comment , maxusers ) ;
0001-01-01 02:30:17 +02:30
break ;
case SESSIONF :
if ( argc_new < = 3 )
0001-01-01 02:30:17 +02:30
rc = net_session ( subfunc , NULL ) ;
0001-01-01 02:30:17 +02:30
else
0001-01-01 02:30:17 +02:30
rc = net_session ( subfunc , argv_new [ 3 ] ) ;
0001-01-01 02:30:17 +02:30
break ;
case SERVERF :
0001-01-01 02:30:17 +02:30
rc = net_server ( target_workgroup , subfunc ) ;
0001-01-01 02:30:17 +02:30
break ;
case DOMAINF :
if ( subfunc ! = LIST_SF )
0001-01-01 02:30:17 +02:30
d_printf ( ERRMSG_INVALID_DOMAIN_ACTION ) ;
0001-01-01 02:30:17 +02:30
rc = net_domain ( ) ;
break ;
case USERF :
if ( argc_new = = 2 )
0001-01-01 02:30:17 +02:30
rc = net_user ( subfunc , NULL , NULL , - 1 ) ;
0001-01-01 02:30:17 +02:30
else if ( argc_new = = 3 )
0001-01-01 02:30:17 +02:30
rc = net_user ( subfunc , NULL , NULL , - 1 ) ;
0001-01-01 02:30:17 +02:30
else if ( argc_new > 3 )
0001-01-01 02:30:17 +02:30
rc = net_user ( subfunc , argv_new [ 3 ] , comment , flagsarg ) ;
0001-01-01 02:30:17 +02:30
break ;
case GROUPF :
if ( argc_new = = 2 )
0001-01-01 02:30:17 +02:30
rc = net_group ( subfunc , NULL , NULL ) ;
0001-01-01 02:30:17 +02:30
else if ( argc_new = = 3 )
0001-01-01 02:30:17 +02:30
rc = net_group ( subfunc , NULL , NULL ) ;
0001-01-01 02:30:17 +02:30
else if ( argc_new > 3 )
0001-01-01 02:30:17 +02:30
rc = net_group ( subfunc , argv_new [ 3 ] , comment ) ;
0001-01-01 02:30:17 +02:30
break ;
case GROUPMEMBERF :
if ( argc_new = = 4 )
0001-01-01 02:30:17 +02:30
rc = net_groupmember ( subfunc , argv_new [ 3 ] , NULL ) ;
0001-01-01 02:30:17 +02:30
else if ( argc_new = = 5 )
0001-01-01 02:30:17 +02:30
rc = net_groupmember ( subfunc , argv_new [ 3 ] , argv_new [ 4 ] ) ;
0001-01-01 02:30:17 +02:30
else {
0001-01-01 02:30:17 +02:30
groupmember_usage ( ) ;
rc = - 1 ;
0001-01-01 02:30:17 +02:30
}
break ;
case VALIDATEF :
0001-01-01 02:30:17 +02:30
rc = net_validate ( global_user_name ) ;
0001-01-01 02:30:17 +02:30
break ;
0001-01-01 02:30:17 +02:30
case SERVICEF :
rc = net_service ( subfunc , argv_new [ 3 ] , argv_new [ 4 ] ) ;
break ;
case ADMINF :
if ( argc_new < 3 )
{
admin_usage ( ) ;
rc = - 1 ;
}
else if ( argc_new = = 3 ) {
rc = net_admin ( argv_new [ 2 ] , NULL , NULL ) ;
} else if ( argc_new = = 4 ) {
rc = net_admin ( argv_new [ 2 ] , argv_new [ 3 ] , NULL ) ;
} else {
rc = net_admin ( argv_new [ 2 ] , argv_new [ 3 ] , argv_new [ 4 ] ) ;
}
break ;
case PASSWORDF :
if ( argc_new ! = 5 )
{
password_usage ( ) ;
rc = - 1 ;
} else {
rc = net_password ( argv_new [ 2 ] , argv_new [ 3 ] , argv_new [ 4 ] ) ;
}
break ;
0001-01-01 02:30:17 +02:30
case PRINTQF :
if ( argc_new < = 3 )
0001-01-01 02:30:17 +02:30
rc = net_printq ( subfunc , NULL , jobid ) ;
0001-01-01 02:30:17 +02:30
else
0001-01-01 02:30:17 +02:30
rc = net_printq ( subfunc , argv_new [ 3 ] , jobid ) ;
0001-01-01 02:30:17 +02:30
break ;
default :
usage ( ) ;
return - 1 ;
}
DEBUG ( 1 , ( " return code = %d \n " , rc ) ) ;
return rc ;
}