2004-02-24 06:29:32 +03:00
/*
* klibc_fixups . c - very simple implementation of stuff missing in klibc
*
* Copyright ( C ) 2003 Greg Kroah - Hartman < greg @ kroah . com >
* Copyright ( C ) 2004 Kay Sievers < kay @ vrfy . org >
*
* 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 version 2 of the License .
*
* 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 .
*
*/
2003-10-23 10:48:55 +04:00
# ifdef __KLIBC__
# include <stdlib.h>
2004-02-24 06:29:32 +03:00
# include <stdio.h>
2003-10-23 10:48:55 +04:00
# include <string.h>
# include <ctype.h>
2004-03-02 09:42:30 +03:00
# include <fcntl.h>
2003-11-24 07:44:41 +03:00
# include <sys/types.h>
2004-02-24 06:29:32 +03:00
2004-03-23 09:22:20 +03:00
# include "udev.h"
2003-11-24 07:44:41 +03:00
# include "klibc_fixups.h"
2004-02-24 06:29:32 +03:00
# include "logging.h"
# define PW_FILE " / etc / passwd"
# define GR_FILE " / etc / group"
2004-03-02 09:42:30 +03:00
# define UTMP_FILE " / var / run / utmp"
2004-02-24 06:29:32 +03:00
/* return the id of a passwd style line, selected by the users name */
static unsigned long get_id_by_name ( const char * uname , const char * dbfile )
{
unsigned long id = - 1 ;
2004-03-23 09:22:20 +03:00
char line [ 255 ] ;
char * buf ;
size_t bufsize ;
size_t cur ;
size_t count ;
2004-02-24 06:29:32 +03:00
char * pos ;
char * name ;
char * idstr ;
char * tail ;
2004-03-23 09:22:20 +03:00
if ( file_map ( dbfile , & buf , & bufsize ) = = 0 ) {
dbg ( " reading '%s' as db file " , dbfile ) ;
} else {
dbg ( " can't open '%s' as db file " , dbfile ) ;
2004-02-24 06:29:32 +03:00
return - 1 ;
}
2004-03-23 09:22:20 +03:00
/* loop through the whole file */
cur = 0 ;
2004-02-24 06:29:32 +03:00
while ( 1 ) {
2004-03-23 09:22:20 +03:00
count = buf_get_line ( buf , bufsize , cur ) ;
strncpy ( line , buf + cur , count ) ;
line [ count ] = ' \0 ' ;
pos = line ;
cur + = count + 1 ;
if ( cur > bufsize )
2004-02-24 06:29:32 +03:00
break ;
/* get name */
name = strsep ( & pos , " : " ) ;
if ( name = = NULL )
continue ;
/* skip pass */
if ( strsep ( & pos , " : " ) = = NULL )
continue ;
/* get id */
idstr = strsep ( & pos , " : " ) ;
if ( idstr = = NULL )
continue ;
if ( strcmp ( uname , name ) = = 0 ) {
id = strtoul ( idstr , & tail , 10 ) ;
2004-03-02 10:17:59 +03:00
if ( tail [ 0 ] ! = ' \0 ' )
2004-02-24 06:29:32 +03:00
id = - 1 ;
else
dbg ( " id for '%s' is '%li' " , name , id ) ;
break ;
}
}
2004-03-23 09:22:20 +03:00
file_unmap ( buf , bufsize ) ;
2004-02-24 06:29:32 +03:00
return id ;
}
struct passwd * getpwnam ( const char * name )
{
static struct passwd pw ;
memset ( & pw , 0x00 , sizeof ( struct passwd ) ) ;
pw . pw_uid = ( uid_t ) get_id_by_name ( name , PW_FILE ) ;
if ( pw . pw_uid < 0 )
return NULL ;
else
return & pw ;
}
struct group * getgrnam ( const char * name )
{
static struct group gr ;
memset ( & gr , 0x00 , sizeof ( struct group ) ) ;
gr . gr_gid = ( gid_t ) get_id_by_name ( name , GR_FILE ) ;
if ( gr . gr_gid < 0 )
return NULL ;
else
return & gr ;
}
2003-10-23 10:48:55 +04:00
2004-03-02 09:42:30 +03:00
int ufd = - 1 ;
void setutent ( )
{
if ( ufd < 0 )
ufd = open ( UTMP_FILE , O_RDONLY ) ;
fcntl ( ufd , F_SETFD , FD_CLOEXEC ) ;
lseek ( ufd , 0 , SEEK_SET ) ;
}
void endutent ( ) {
if ( ufd < 0 )
return ;
close ( ufd ) ;
ufd = - 1 ;
}
struct utmp * getutent ( void )
{
static struct utmp utmp ;
int retval ;
if ( ufd < 0 ) {
setutent ( ) ;
if ( ufd < 0 )
return NULL ;
}
retval = read ( ufd , & utmp , sizeof ( struct utmp ) ) ;
if ( retval < 1 )
return NULL ;
return & utmp ;
}
2003-10-23 10:48:55 +04:00
# endif