2001-05-29 07:34:01 +00:00
/*
Unix SMB / Netbios implementation .
Version 3.0
Samba utility functions
Copyright ( C ) Simo Sorce 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
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
# include "includes.h"
2001-06-11 22:06:11 +00:00
static void print_grent_list ( struct sys_grent * glist )
{
DEBUG ( 100 , ( " print_grent_list: %x \n " , glist ) ) ;
while ( glist ) {
DEBUG ( 100 , ( " glist: %x " , glist ) ) ;
if ( glist - > gr_name )
DEBUG ( 100 , ( " : gr_name = (%x) %s " , glist - > gr_name , glist - > gr_name ) ) ;
if ( glist - > gr_passwd )
DEBUG ( 100 , ( " : gr_passwd = (%x) %s " , glist - > gr_passwd , glist - > gr_passwd ) ) ;
if ( glist - > gr_mem ) {
int i ;
for ( i = 0 ; glist - > gr_mem [ i ] ; i + + )
DEBUG ( 100 , ( " : gr_mem[%d] = (%x) %s " , i , glist - > gr_mem [ i ] , glist - > gr_mem [ i ] ) ) ;
}
DEBUG ( 100 , ( " : gr_next = %x \n " , glist - > next ) ) ;
glist = glist - > next ;
}
DEBUG ( 100 , ( " FINISHED ! \n \n " ) ) ;
}
2001-05-29 07:34:01 +00:00
/****************************************************************
Returns a single linked list of group entries .
Use grent_free ( ) to free it after use .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-05-31 14:41:53 +00:00
2001-05-29 07:34:01 +00:00
struct sys_grent * getgrent_list ( void )
{
struct sys_grent * glist ;
struct sys_grent * gent ;
struct group * grp ;
gent = ( struct sys_grent * ) malloc ( sizeof ( struct sys_grent ) ) ;
if ( gent = = NULL ) {
DEBUG ( 0 , ( " Out of memory in getgrent_list! \n " ) ) ;
return NULL ;
}
2001-06-11 22:06:11 +00:00
memset ( gent , ' \0 ' , sizeof ( struct sys_grent ) ) ;
2001-05-29 07:34:01 +00:00
glist = gent ;
setgrent ( ) ;
grp = getgrent ( ) ;
2001-06-11 22:06:11 +00:00
if ( grp = = NULL ) {
endgrent ( ) ;
free ( glist ) ;
return NULL ;
}
2001-05-31 14:41:53 +00:00
while ( grp ! = NULL ) {
2001-05-29 07:34:01 +00:00
int i , num ;
2001-05-31 14:41:53 +00:00
if ( grp - > gr_name ) {
if ( ( gent - > gr_name = strdup ( grp - > gr_name ) ) = = NULL )
goto err ;
}
if ( grp - > gr_passwd ) {
if ( ( gent - > gr_passwd = strdup ( grp - > gr_passwd ) ) = = NULL )
goto err ;
}
2001-05-29 07:34:01 +00:00
gent - > gr_gid = grp - > gr_gid ;
/* number of strings in gr_mem */
2001-05-31 14:41:53 +00:00
for ( num = 0 ; grp - > gr_mem [ num ] ; num + + )
;
2001-05-29 07:34:01 +00:00
/* alloc space for gr_mem string pointers */
2001-06-11 22:06:11 +00:00
if ( ( gent - > gr_mem = ( char * * ) malloc ( ( num + 1 ) * sizeof ( char * ) ) ) = = NULL )
2001-05-31 14:41:53 +00:00
goto err ;
2001-06-11 22:06:11 +00:00
memset ( gent - > gr_mem , ' \0 ' , ( num + 1 ) * sizeof ( char * ) ) ;
2001-05-31 14:41:53 +00:00
for ( i = 0 ; i < num ; i + + ) {
if ( ( gent - > gr_mem [ i ] = strdup ( grp - > gr_mem [ i ] ) ) = = NULL )
goto err ;
2001-05-29 07:34:01 +00:00
}
gent - > gr_mem [ num ] = NULL ;
grp = getgrent ( ) ;
2001-05-31 14:41:53 +00:00
if ( grp ) {
2001-05-29 07:34:01 +00:00
gent - > next = ( struct sys_grent * ) malloc ( sizeof ( struct sys_grent ) ) ;
2001-05-31 14:41:53 +00:00
if ( gent - > next = = NULL )
goto err ;
2001-05-29 07:34:01 +00:00
gent = gent - > next ;
2001-06-11 22:06:11 +00:00
memset ( gent , ' \0 ' , sizeof ( struct sys_grent ) ) ;
2001-05-29 07:34:01 +00:00
}
}
endgrent ( ) ;
2001-06-11 22:06:11 +00:00
print_grent_list ( glist ) ;
DEBUG ( 100 , ( " getgrent_list returned %x \n " , glist ) ) ;
2001-05-29 07:34:01 +00:00
return glist ;
2001-05-31 14:41:53 +00:00
err :
endgrent ( ) ;
DEBUG ( 0 , ( " Out of memory in getgrent_list! \n " ) ) ;
grent_free ( glist ) ;
return NULL ;
2001-05-29 07:34:01 +00:00
}
/****************************************************************
Free the single linked list of group entries made by
getgrent_list ( )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-05-31 14:41:53 +00:00
2001-05-29 07:34:01 +00:00
void grent_free ( struct sys_grent * glist )
{
2001-06-11 22:06:11 +00:00
DEBUG ( 100 , ( " getgrent_free %x \n " , glist ) ) ;
2001-05-31 14:41:53 +00:00
while ( glist ) {
2001-06-11 22:06:11 +00:00
struct sys_grent * prev ;
2001-05-29 07:34:01 +00:00
2001-06-11 22:06:11 +00:00
print_grent_list ( glist ) ;
2001-05-31 14:41:53 +00:00
if ( glist - > gr_name )
free ( glist - > gr_name ) ;
if ( glist - > gr_passwd )
free ( glist - > gr_passwd ) ;
if ( glist - > gr_mem ) {
2001-06-11 22:06:11 +00:00
int i ;
for ( i = 0 ; glist - > gr_mem [ i ] ; i + + )
free ( glist - > gr_mem [ i ] ) ;
2001-05-29 07:34:01 +00:00
free ( glist - > gr_mem ) ;
}
2001-06-11 22:06:11 +00:00
prev = glist ;
glist = glist - > next ;
free ( prev ) ;
2001-05-29 07:34:01 +00:00
}
}
/****************************************************************
Returns a single linked list of passwd entries .
Use pwent_free ( ) to free it after use .
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-05-31 14:41:53 +00:00
2001-05-29 07:34:01 +00:00
struct sys_pwent * getpwent_list ( void )
{
struct sys_pwent * plist ;
struct sys_pwent * pent ;
struct passwd * pwd ;
pent = ( struct sys_pwent * ) malloc ( sizeof ( struct sys_pwent ) ) ;
if ( pent = = NULL ) {
DEBUG ( 0 , ( " Out of memory in getpwent_list! \n " ) ) ;
return NULL ;
}
plist = pent ;
setpwent ( ) ;
pwd = getpwent ( ) ;
2001-05-31 14:41:53 +00:00
while ( pwd ! = NULL ) {
memset ( pent , ' \0 ' , sizeof ( struct sys_pwent ) ) ;
if ( pwd - > pw_name ) {
if ( ( pent - > pw_name = strdup ( pwd - > pw_name ) ) = = NULL )
goto err ;
}
if ( pwd - > pw_passwd ) {
if ( ( pent - > pw_passwd = strdup ( pwd - > pw_passwd ) ) = = NULL )
goto err ;
}
2001-05-29 07:34:01 +00:00
pent - > pw_uid = pwd - > pw_uid ;
pent - > pw_gid = pwd - > pw_gid ;
2001-05-31 14:41:53 +00:00
if ( pwd - > pw_gecos ) {
if ( ( pent - > pw_name = strdup ( pwd - > pw_gecos ) ) = = NULL )
goto err ;
}
if ( pwd - > pw_dir ) {
if ( ( pent - > pw_name = strdup ( pwd - > pw_dir ) ) = = NULL )
goto err ;
}
if ( pwd - > pw_shell ) {
if ( ( pent - > pw_name = strdup ( pwd - > pw_shell ) ) = = NULL )
goto err ;
}
2001-05-29 07:34:01 +00:00
pwd = getpwent ( ) ;
2001-05-31 14:41:53 +00:00
if ( pwd ) {
2001-05-29 07:34:01 +00:00
pent - > next = ( struct sys_pwent * ) malloc ( sizeof ( struct sys_pwent ) ) ;
2001-05-31 14:41:53 +00:00
if ( pent - > next = = NULL )
goto err ;
2001-05-29 07:34:01 +00:00
pent = pent - > next ;
}
}
endpwent ( ) ;
return plist ;
2001-05-31 14:41:53 +00:00
err :
endpwent ( ) ;
DEBUG ( 0 , ( " Out of memory in getpwent_list! \n " ) ) ;
pwent_free ( plist ) ;
return NULL ;
2001-05-29 07:34:01 +00:00
}
/****************************************************************
Free the single linked list of passwd entries made by
getpwent_list ( )
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2001-05-31 14:41:53 +00:00
2001-05-29 07:34:01 +00:00
void pwent_free ( struct sys_pwent * plist )
{
2001-05-31 14:41:53 +00:00
while ( plist ) {
2001-06-11 22:06:11 +00:00
struct sys_pwent * prev ;
2001-05-29 07:34:01 +00:00
2001-05-31 14:41:53 +00:00
if ( plist - > pw_name )
free ( plist - > pw_name ) ;
if ( plist - > pw_passwd )
free ( plist - > pw_passwd ) ;
if ( plist - > pw_gecos )
free ( plist - > pw_gecos ) ;
if ( plist - > pw_dir )
free ( plist - > pw_dir ) ;
if ( plist - > pw_shell )
free ( plist - > pw_shell ) ;
2001-05-29 07:34:01 +00:00
2001-06-11 22:06:11 +00:00
prev = plist ;
plist = plist - > next ;
free ( prev ) ;
2001-05-29 07:34:01 +00:00
}
}