Figure summarized how the four platforms covered in this book store user and group information.
information |
FreeBSD 8.0 |
Linux 3.2.0 |
Mac OS X 10.6.8 |
Solaris 10 |
account information |
/etc/passwd |
/etc/passwd |
Directory Services |
/etc/passwd |
encrypted passwords |
/etc/master.passwd |
/etc/shadow |
Directory Services |
/etc/shadow |
hashed password files |
yes |
no |
no |
no |
@H_404_186@
On many systems,the user and group databases are implemented using the Network Information Service (NIS). This allows administrators to edit a master copy of the databases and distribute them automatically to all servers in an organization. Client systems contact servers to look up information about users and groups. NIS+ and the Lightweight Directory Access Protocol (LDAP) provide similar functionality. Many systems control the method used to administer each type of information through the /etc/nsswitch.conf configuration file.
Other Data Files
The general principle is that every data file has at least three functions:
1.A get function that reads the next record,opening the file if necessary. These functions normally return a pointer to a structure. A null pointer is returned when the end of file is reached. Most of the get functions return a pointer to a static structure,so we always have to copy the structure if we want to save it.
2.A set function that opens the file,if not already open,and rewinds the file. We use this function when we know we want to start again at the beginning of the file.
3.An end entry that closes the data file. As we mentioned earlier,we always have to call this function when we’re done,to close all the files.
Login Accounting
Two data files provided with most UNIX systems are the utmp file,which keeps track of all the users currently logged in,and the wtmp file,which keeps track of all logins and logouts.
struct utmp
{
char ut_line[8];
char ut_name[8];
long ut_time;
};
Most versions of the UNIX System still provide the utmp and wtmp files,but as expected,the amount of information in these files has grown. The 20-byte structure that was written by Version 7 grew to 36 bytes with SVR2,and the extended utmp structure with SVR4 takes more than 350 bytes!
System Identification
POSIX.1 defines the uname function to return information on the current host and operating system.
#include <sys/utsname.h>
int uname(struct utsname *name);
We pass the address of a utsname structure to this function,and the function then fills it in. POSIX.1 defines only the minimum fields in the structure,which are all character arrays,and it’s up to each implementation to set the size of each array.
struct utsname
{
char sysname[];
char nodename[];
char release[];
char version[];
char machine[];
};
Interface |
Maximum name length |
FreeBSD 8.0 |
Linux 3.2.0 |
Mac OS X 10.6.8 |
Solaris 10 |
uname |
256 |
65 |
256 |
257 |
gethostname |
256 |
64 |
256 |
256 |
@H_404_186@
Historically,BSD-derived systems provided the gethostname function to return only the name of the host. This name is usually the name of the host on a TCP/IP network.
#include <unistd.h>
int gethostname(char *name,int namelen);
Time and Date Routines
The basic time service provided by the UNIX kernel counts the number of seconds that have passed since the Epoch: 00:00:00 January 1,1970,Coordinated Universal Time (UTC).
The UNIX System has always differed from other operating systems in (a) keeping time in UTC instead of the local time,(b) automatically handling conversions,such as daylight saving time,and (c) keeping the time and date as a single quantity.
The time function returns the current time and date.
time_t time(time_t *calptr);
The time value is always returned as the value of the function. If the argument is non-null,the time value is also stored at the location pointed to by calptr.
The real-time extensions to POSIX.1 added support for multiple system clocks. In Version 4 of the Single UNIX Specification,the interfaces used to control these clocks were moved from an option group to the base.
#include <sys/time.h>
int clock_gettime(clockid_t clock_id,struct timespec *tsp);
When the clock ID is set to CLOCK_REALTIME,the clock_gettime function provides similar functionality to the time function,except with clock_gettime,we might be able to get a higher-resolution time value if the system supports it.
We can use the clock_getres function to determine the resolution of a given system clock.
#include <sys/time.h>
int clock_getres(clockid_t clock_id,struct timespec *tsp);
The clock_getres function initializes the timespec structure pointed to by the tsp argument to the resolution of the clock corresponding to the clock_id argument.
#inlcude <sys//time.h>
int clock_settime(clockid_t clock_id,const struct timespec *tsp);
We can use the clock_getres function to determine the resolution of a given system clock.
#include <sys/time.h>
int clock_getres(clockid_t clock_id,struct timespec *tsp);
To set the time for a particular clock,we can call the clock_settime function
#include <sys/time.h>
int clock_settime(clockid_t clock_id,const struct timespec *tsp);
Historically,on implementations derived from System V,the stime(2) function was called to set the system time,whereas BSD-derived systems used settimeofday(2).
Version 4 of the Single UNIX Specification specifies that the gettimeofday function is now obsolescent. However,a lot of programs still use it,because it provides greater resolution (up to a microsecond) than the time function.
#include <sys/time.h>
int gettimeofday(struct timeval *restrict tp,void *restrict tzp);
The only legal value for tzp is NULL; other values result in unspecified behavior. Some platforms support the specification of a time zone through the use of tzp,but this is implementation specific and not defined by the Single UNIX Specification.
The gettimeofday function stores the current time as measured from the Epoch in the memory pointed to by tp. This time is represented as a timeval structure,which stores seconds and microseconds.
A tm structure:
struct tm
{
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
}
The formal definition of UTC doesn’t allow for double leap seconds,so the valid range for seconds is now 0–60.
#include <time.h>
struct tm *gmtime(const time_t *calptr);
struct tm *localtime(const time_t *calptr);
The difference between localtime and gmtime is that the first converts the calendar time to the local time,taking into account the local time zone and daylight saving time flag,whereas the latter converts the calendar time into a broken-down time expressed as UTC.