2008-05-08 13:23:38 +04:00
/*
Samba Unix / Linux SMB client library
Distributed SMB / CIFS Server Management Utility
2002-09-11 18:07:21 +04:00
Copyright ( C ) Rafal Szczesniak 2002
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
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2002-09-11 18:07:21 +04:00
( at your option ) any later version .
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
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 .
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
You should have received a copy of the GNU General Public License
2008-05-10 01:22:12 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
*/
2002-09-11 18:07:21 +04:00
# include "includes.h"
# include "net.h"
/**
* @ file net_cache . c
* @ brief This is part of the net tool which is basically command
* line wrapper for gencache . c functions ( mainly for testing )
*
* */
/*
* These routines are used via gencache_iterate ( ) to display the cache ' s contents
* ( print_cache_entry ) and to flush it ( delete_cache_entry ) .
* Both of them are defined by first arg of gencache_iterate ( ) routine .
*/
2003-01-04 11:48:15 +03:00
static void print_cache_entry ( const char * keystr , const char * datastr ,
const time_t timeout , void * dptr )
2002-09-11 18:07:21 +04:00
{
2006-06-15 01:36:49 +04:00
char * timeout_str ;
2006-06-16 01:03:40 +04:00
char * alloc_str = NULL ;
2003-01-04 11:48:15 +03:00
time_t now_t = time ( NULL ) ;
struct tm timeout_tm , * now_tm ;
/* localtime returns statically allocated pointer, so timeout_tm
has to be copied somewhere else */
2006-06-15 01:36:49 +04:00
now_tm = localtime ( & timeout ) ;
if ( ! now_tm ) {
return ;
}
memcpy ( & timeout_tm , now_tm , sizeof ( struct tm ) ) ;
2003-01-04 11:48:15 +03:00
now_tm = localtime ( & now_t ) ;
2006-06-15 01:36:49 +04:00
if ( ! now_tm ) {
return ;
}
2003-01-04 11:48:15 +03:00
/* form up timeout string depending whether it's today's date or not */
if ( timeout_tm . tm_year ! = now_tm - > tm_year | |
2006-06-15 01:36:49 +04:00
timeout_tm . tm_mon ! = now_tm - > tm_mon | |
timeout_tm . tm_mday ! = now_tm - > tm_mday ) {
2008-05-08 13:23:38 +04:00
2006-06-15 01:36:49 +04:00
timeout_str = asctime ( & timeout_tm ) ;
if ( ! timeout_str ) {
return ;
2008-05-08 13:23:38 +04:00
}
2006-06-15 01:36:49 +04:00
timeout_str [ strlen ( timeout_str ) - 1 ] = ' \0 ' ; /* remove tailing CR */
} else {
2006-06-16 01:03:40 +04:00
asprintf ( & alloc_str , " %.2d:%.2d:%.2d " , timeout_tm . tm_hour ,
2003-01-04 11:48:15 +03:00
timeout_tm . tm_min , timeout_tm . tm_sec ) ;
2006-06-16 01:03:40 +04:00
if ( ! alloc_str ) {
return ;
}
timeout_str = alloc_str ;
2006-06-15 01:36:49 +04:00
}
2008-05-08 13:23:38 +04:00
2003-01-04 11:48:15 +03:00
d_printf ( " Key: %s \t Timeout: %s \t Value: %s %s \n " , keystr ,
timeout_str , datastr , timeout > now_t ? " " : " (expired) " ) ;
2006-06-16 01:03:40 +04:00
SAFE_FREE ( alloc_str ) ;
2002-09-11 18:07:21 +04:00
}
2003-01-04 11:48:15 +03:00
static void delete_cache_entry ( const char * keystr , const char * datastr ,
const time_t timeout , void * dptr )
2002-09-11 18:07:21 +04:00
{
if ( ! gencache_del ( keystr ) )
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Couldn't delete entry! key = %s \n " , keystr ) ;
2002-09-11 18:07:21 +04:00
}
/**
* Parse text representation of timeout value
*
* @ param timeout_str string containing text representation of the timeout
* @ return numeric timeout of time_t type
* */
static time_t parse_timeout ( const char * timeout_str )
{
char sign = ' \0 ' , * number = NULL , unit = ' \0 ' ;
int len , number_begin , number_end ;
time_t timeout ;
/* sign detection */
if ( timeout_str [ 0 ] = = ' ! ' | | timeout_str [ 0 ] = = ' + ' ) {
sign = timeout_str [ 0 ] ;
number_begin = 1 ;
} else {
number_begin = 0 ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
/* unit detection */
len = strlen ( timeout_str ) ;
switch ( timeout_str [ len - 1 ] ) {
case ' s ' :
case ' m ' :
case ' h ' :
case ' d ' :
case ' w ' : unit = timeout_str [ len - 1 ] ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
/* number detection */
len = ( sign ) ? strlen ( & timeout_str [ number_begin ] ) : len ;
number_end = ( unit ) ? len - 1 : len ;
2004-12-07 21:25:53 +03:00
number = SMB_STRNDUP ( & timeout_str [ number_begin ] , number_end ) ;
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
/* calculate actual timeout value */
timeout = ( time_t ) atoi ( number ) ;
switch ( unit ) {
case ' m ' : timeout * = 60 ; break ;
case ' h ' : timeout * = 60 * 60 ; break ;
case ' d ' : timeout * = 60 * 60 * 24 ; break ;
case ' w ' : timeout * = 60 * 60 * 24 * 7 ; break ; /* that's fair enough, I think :) */
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
switch ( sign ) {
case ' ! ' : timeout = time ( NULL ) - timeout ; break ;
case ' + ' :
default : timeout + = time ( NULL ) ; break ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
if ( number ) SAFE_FREE ( number ) ;
2008-05-08 13:23:38 +04:00
return timeout ;
2002-09-11 18:07:21 +04:00
}
/**
2003-01-04 11:48:15 +03:00
* Add an entry to the cache . If it does exist , then set it .
2008-05-08 13:23:38 +04:00
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv key , value and timeout are passed in command line
* @ return 0 on success , otherwise failure
* */
2008-05-10 01:22:12 +04:00
static int net_cache_add ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
const char * keystr , * datastr , * timeout_str ;
time_t timeout ;
2008-05-08 13:23:38 +04:00
2008-05-19 17:40:50 +04:00
if ( argc < 3 | | c - > display_usage ) {
2002-09-11 18:07:21 +04:00
d_printf ( " \n Usage: net cache add <key string> <data string> <timeout> \n " ) ;
return - 1 ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
keystr = argv [ 0 ] ;
datastr = argv [ 1 ] ;
timeout_str = argv [ 2 ] ;
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
/* parse timeout given in command line */
timeout = parse_timeout ( timeout_str ) ;
if ( ! timeout ) {
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Invalid timeout argument. \n " ) ;
2002-09-11 18:07:21 +04:00
return - 1 ;
}
2008-05-08 13:23:38 +04:00
2003-01-04 11:48:15 +03:00
if ( gencache_set ( keystr , datastr , timeout ) ) {
2002-09-11 18:07:21 +04:00
d_printf ( " New cache entry stored successfully. \n " ) ;
gencache_shutdown ( ) ;
return 0 ;
2003-01-04 11:48:15 +03:00
}
2008-05-08 13:23:38 +04:00
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Entry couldn't be added. Perhaps there's already such a key. \n " ) ;
2002-09-11 18:07:21 +04:00
gencache_shutdown ( ) ;
return - 1 ;
}
/**
* Delete an entry in the cache
2008-05-08 13:23:38 +04:00
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv key to delete an entry of
* @ return 0 on success , otherwise failure
* */
2008-05-10 01:22:12 +04:00
static int net_cache_del ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
const char * keystr = argv [ 0 ] ;
2008-05-08 13:23:38 +04:00
2008-05-19 17:40:50 +04:00
if ( argc < 1 | | c - > display_usage ) {
2003-07-29 06:34:18 +04:00
d_printf ( " \n Usage: net cache del <key string> \n " ) ;
2002-09-11 18:07:21 +04:00
return - 1 ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
if ( gencache_del ( keystr ) ) {
d_printf ( " Entry deleted. \n " ) ;
return 0 ;
2003-01-04 11:48:15 +03:00
}
2002-09-11 18:07:21 +04:00
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Couldn't delete specified entry \n " ) ;
2002-09-11 18:07:21 +04:00
return - 1 ;
}
/**
* Get and display an entry from the cache
2008-05-08 13:23:38 +04:00
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv key to search an entry of
* @ return 0 on success , otherwise failure
* */
2008-05-10 01:22:12 +04:00
static int net_cache_get ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
const char * keystr = argv [ 0 ] ;
char * valuestr ;
time_t timeout ;
2008-05-19 17:40:50 +04:00
if ( argc < 1 | | c - > display_usage ) {
2002-09-11 18:07:21 +04:00
d_printf ( " \n Usage: net cache get <key> \n " ) ;
return - 1 ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
if ( gencache_get ( keystr , & valuestr , & timeout ) ) {
2003-01-04 11:48:15 +03:00
print_cache_entry ( keystr , valuestr , timeout , NULL ) ;
2002-09-11 18:07:21 +04:00
return 0 ;
2003-01-04 11:48:15 +03:00
}
2002-09-11 18:07:21 +04:00
2006-01-18 00:22:00 +03:00
d_fprintf ( stderr , " Failed to find entry \n " ) ;
2002-09-11 18:07:21 +04:00
return - 1 ;
}
/**
* Search an entry / entries in the cache
2008-05-08 13:23:38 +04:00
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv key pattern to match the entries to
* @ return 0 on success , otherwise failure
* */
2008-05-10 01:22:12 +04:00
static int net_cache_search ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
const char * pattern ;
2008-05-08 13:23:38 +04:00
2008-05-19 17:40:50 +04:00
if ( argc < 1 | | c - > display_usage ) {
2002-09-11 18:07:21 +04:00
d_printf ( " Usage: net cache search <pattern> \n " ) ;
return - 1 ;
}
2008-05-08 13:23:38 +04:00
2002-09-11 18:07:21 +04:00
pattern = argv [ 0 ] ;
2003-01-04 11:48:15 +03:00
gencache_iterate ( print_cache_entry , NULL , pattern ) ;
2002-09-11 18:07:21 +04:00
return 0 ;
}
/**
* List the contents of the cache
2008-05-08 13:23:38 +04:00
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv ignored in this functionailty
* @ return always returns 0
* */
2008-05-10 01:22:12 +04:00
static int net_cache_list ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
const char * pattern = " * " ;
2008-05-19 17:40:50 +04:00
if ( c - > display_usage ) {
d_printf ( " Usage: \n "
" net cache list \n "
" List all cache entries. \n " ) ;
return 0 ;
}
2003-01-04 11:48:15 +03:00
gencache_iterate ( print_cache_entry , NULL , pattern ) ;
2002-09-11 18:07:21 +04:00
gencache_shutdown ( ) ;
return 0 ;
}
/**
* Flush the whole cache
2008-05-08 13:23:38 +04:00
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv ignored in this functionality
* @ return always returns 0
* */
2008-05-10 01:22:12 +04:00
static int net_cache_flush ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
const char * pattern = " * " ;
2008-05-19 17:40:50 +04:00
if ( c - > display_usage ) {
d_printf ( " Usage: \n "
" net cache flush \n "
" Delete all cache entries. \n " ) ;
return 0 ;
}
2003-01-04 11:48:15 +03:00
gencache_iterate ( delete_cache_entry , NULL , pattern ) ;
2002-09-11 18:07:21 +04:00
gencache_shutdown ( ) ;
return 0 ;
}
/**
* Entry point to ' net cache ' subfunctionality
*
2008-05-10 01:22:12 +04:00
* @ param c A net_context structure
2002-09-11 18:07:21 +04:00
* @ param argv arguments passed to further called functions
* @ return whatever further functions return
* */
2008-05-10 01:22:12 +04:00
int net_cache ( struct net_context * c , int argc , const char * * argv )
2002-09-11 18:07:21 +04:00
{
2008-05-19 17:40:50 +04:00
struct functable3 func [ ] = {
{
" add " ,
net_cache_add ,
NET_TRANSPORT_LOCAL ,
" Add new cache entry " ,
" net cache add <key string> <data string> <timeout> \n "
" Add new cache entry. \n "
" key string \t Key string to add cache data under. \n "
" data string \t Data to store under given key. \n "
" timeout \t Timeout for cache data. "
} ,
{
" del " ,
net_cache_del ,
NET_TRANSPORT_LOCAL ,
" Delete existing cache entry by key " ,
" net cache del <key string> \n "
" Delete existing cache entry by key. \n "
" key string \t Key string to delete. "
} ,
{
" get " ,
net_cache_get ,
NET_TRANSPORT_LOCAL ,
" Get cache entry by key " ,
" net cache get <key string> \n "
" Get cache entry by key. \n "
" key string \t Key string to look up cache entry for. "
} ,
{
" search " ,
net_cache_search ,
NET_TRANSPORT_LOCAL ,
" Search entry by pattern " ,
" net cache search <pattern> \n "
" Search entry by pattern. \n "
" pattern \t Pattern to search for in cache. "
} ,
{
" list " ,
net_cache_list ,
NET_TRANSPORT_LOCAL ,
" List all cache entries " ,
" net cache list \n "
" List all cache entries "
} ,
{
" flush " ,
net_cache_flush ,
NET_TRANSPORT_LOCAL ,
" Delete all cache entries " ,
" net cache flush \n "
" Delete all cache entries "
} ,
{ NULL , NULL , 0 , NULL , NULL }
2002-09-11 18:07:21 +04:00
} ;
2008-05-19 17:40:50 +04:00
return net_run_function3 ( c , argc , argv , " net cache " , func ) ;
2002-09-11 18:07:21 +04:00
}