From b13927da591adbbae887fc89cc66c8ca7ab5b13b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 3 Jun 1997 21:53:09 +0000 Subject: Update. 1997-06-03 23:42 Ulrich Drepper * elf/dl-support.c: Define and initialize _dl_verbose used in dl-machine.h. * io/ftw.c: Expand stat/lstat calls. * manual/intro.texi: Also refer to ISO 9945. Update info about SVID. Add description for XPG. * md5-crypt/md5-crypt.c: Namespace cleanups. * md5-crypt/md5.c: Likewise. * md5-crypt/md5.h: Likewise. * sysdeps/generic/crypt-entry.c: Likewise. * posix/unistd.h (_POSIX2_C_VERSION): Set to 199209L. * stdlib/fmtmsg.h: Declare addseverity only if __USE_SVID is defined. * sunrpc/rpc_scan.c (findkind): Declare `token' as const. * sunrpc/rpc_util.c (toktostr): Declare `token' as const. * time/Makefile: Make tzselect dependen of config.make. 1997-06-01 15:01 Miles Bader * manual/string.texi (String and Array Utilities): Add `Argz and Envz Vectors' to the menu. (Argz and Envz Vectors, Argz Functions, Envz Functions): New nodes. 1997-05-31 20:59 Andreas Schwab * login/Makefile (utmpd-routines): Add utmpd. (extra-objs): Add utmpd objects to get dependencies. (distribute): Add sources for utmpd. (subdir-dirs): Define. 1997-06-02 16:28 Ulrich Drepper * sysdeps/wordsize-32/inttypes.h: Include features.h and use __CONCAT instead of defined __CONCAT__ ourself. * sysdeps/wordsize-64/inttypes.h: Likewise. 1997-06-01 19:11 Andreas Schwab * sysdeps/wordsize-64/inttypes.h (INTMAX_C): Use `l' suffix, not `ll'. (PRIdFAST, PRIoFAST, PRIxFAST, PRIuFAST, SCNdFAST, SCNiFAST, SCNoFAST, SCNxFAST): Correct format specifiers. 1997-06-02 04:23 Ulrich Drepper * sysdeps/unix/syscalls.list: Make fchdir weak alias for __fchdir. 1997-06-01 19:17 Ulrich Drepper * md5-crypt/Makefile: Correct libmd5crypt file to really generate DES free libcrypt. * md5-crypt/onlymd5-entry.c: New file. Wrapper around sysdeps/generic/crypt-entry.c. 1997-06-01 12:48 Ulrich Drepper * sysdeps/unix/sysv/linux/alpha/gnu/types.h (__fd_mask): Change type to `unsigned long int'. Patch by Richard Henderson . 1997-05-30 17:34 Andreas Jaeger * sysdeps/generic/bb_init_func.c (__bb_init_func): Use ISO C declaration style. * nss/nss_files/files-hosts.c: Delete inclusion of "../resolv/mapv4v6hostent.h". --- ChangeLog | 77 +++ elf/dl-support.c | 16 + io/ftw.c | 21 +- localedata/locales/cs_CZ | 810 ++++++++++++++++++++++++++++++ localedata/locales/hr_HR | 91 ++-- login/Makefile | 9 +- login/programs/connection.c | 180 +++++++ login/programs/database.c | 516 +++++++++++++++++++ login/programs/error.c | 104 ++++ login/programs/request.c | 650 ++++++++++++++++++++++++ login/programs/utmpd-private.h | 107 ++++ login/programs/utmpd.c | 384 ++++++++++++++ login/programs/utmpd.h | 141 ++++++ login/programs/utmpdump.c | 53 ++ login/programs/xtmp.c | 102 ++++ login/programs/xtmp.h | 56 +++ login/utmpd/connection.c | 180 ------- login/utmpd/database.c | 516 ------------------- login/utmpd/error.c | 104 ---- login/utmpd/request.c | 650 ------------------------ login/utmpd/utmpd-private.h | 107 ---- login/utmpd/utmpd.c | 384 -------------- login/utmpd/utmpd.h | 141 ------ login/utmpd/xtmp.c | 102 ---- login/utmpd/xtmp.h | 56 --- login/utmpdump.c | 53 -- manual/intro.texi | 51 +- manual/string.texi | 225 +++++++++ md5-crypt/Makefile | 6 +- md5-crypt/md5-crypt.c | 18 +- md5-crypt/md5.c | 30 +- md5-crypt/md5.h | 19 +- md5-crypt/onlymd5-entry.c | 1 + nss/nss_files/files-hosts.c | 1 - posix/unistd.h | 2 +- stdlib/fmtmsg.h | 2 + sunrpc/rpc_scan.c | 4 +- sunrpc/rpc_util.c | 4 +- sysdeps/generic/bb_init_func.c | 3 +- sysdeps/generic/crypt-entry.c | 14 +- sysdeps/unix/syscalls.list | 2 +- sysdeps/unix/sysv/linux/alpha/gnu/types.h | 2 +- sysdeps/wordsize-32/inttypes.h | 19 +- sysdeps/wordsize-64/inttypes.h | 35 +- time/Makefile | 2 +- 45 files changed, 3631 insertions(+), 2419 deletions(-) create mode 100644 localedata/locales/cs_CZ create mode 100644 login/programs/connection.c create mode 100644 login/programs/database.c create mode 100644 login/programs/error.c create mode 100644 login/programs/request.c create mode 100644 login/programs/utmpd-private.h create mode 100644 login/programs/utmpd.c create mode 100644 login/programs/utmpd.h create mode 100644 login/programs/utmpdump.c create mode 100644 login/programs/xtmp.c create mode 100644 login/programs/xtmp.h delete mode 100644 login/utmpd/connection.c delete mode 100644 login/utmpd/database.c delete mode 100644 login/utmpd/error.c delete mode 100644 login/utmpd/request.c delete mode 100644 login/utmpd/utmpd-private.h delete mode 100644 login/utmpd/utmpd.c delete mode 100644 login/utmpd/utmpd.h delete mode 100644 login/utmpd/xtmp.c delete mode 100644 login/utmpd/xtmp.h delete mode 100644 login/utmpdump.c create mode 100644 md5-crypt/onlymd5-entry.c diff --git a/ChangeLog b/ChangeLog index fdbfc61761..e4055f766e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,80 @@ +1997-06-03 23:42 Ulrich Drepper + + * elf/dl-support.c: Define and initialize _dl_verbose used in + dl-machine.h. + + * io/ftw.c: Expand stat/lstat calls. + + * manual/intro.texi: Also refer to ISO 9945. + Update info about SVID. + Add description for XPG. + + * md5-crypt/md5-crypt.c: Namespace cleanups. + * md5-crypt/md5.c: Likewise. + * md5-crypt/md5.h: Likewise. + * sysdeps/generic/crypt-entry.c: Likewise. + + * posix/unistd.h (_POSIX2_C_VERSION): Set to 199209L. + + * stdlib/fmtmsg.h: Declare addseverity only if __USE_SVID is + defined. + + * sunrpc/rpc_scan.c (findkind): Declare `token' as const. + * sunrpc/rpc_util.c (toktostr): Declare `token' as const. + + * time/Makefile: Make tzselect dependen of config.make. + +1997-06-01 15:01 Miles Bader + + * manual/string.texi (String and Array Utilities): Add `Argz and + Envz Vectors' to the menu. + (Argz and Envz Vectors, Argz Functions, Envz Functions): New nodes. + +1997-05-31 20:59 Andreas Schwab + + * login/Makefile (utmpd-routines): Add utmpd. + (extra-objs): Add utmpd objects to get dependencies. + (distribute): Add sources for utmpd. + (subdir-dirs): Define. + +1997-06-02 16:28 Ulrich Drepper + + * sysdeps/wordsize-32/inttypes.h: Include features.h and use + __CONCAT instead of defined __CONCAT__ ourself. + * sysdeps/wordsize-64/inttypes.h: Likewise. + +1997-06-01 19:11 Andreas Schwab + + * sysdeps/wordsize-64/inttypes.h (INTMAX_C): Use `l' suffix, not + `ll'. + (PRIdFAST, PRIoFAST, PRIxFAST, PRIuFAST, SCNdFAST, SCNiFAST, + SCNoFAST, SCNxFAST): Correct format specifiers. + +1997-06-02 04:23 Ulrich Drepper + + * sysdeps/unix/syscalls.list: Make fchdir weak alias for __fchdir. + +1997-06-01 19:17 Ulrich Drepper + + * md5-crypt/Makefile: Correct libmd5crypt file to really generate + DES free libcrypt. + * md5-crypt/onlymd5-entry.c: New file. Wrapper around + sysdeps/generic/crypt-entry.c. + +1997-06-01 12:48 Ulrich Drepper + + * sysdeps/unix/sysv/linux/alpha/gnu/types.h (__fd_mask): Change + type to `unsigned long int'. + Patch by Richard Henderson . + +1997-05-30 17:34 Andreas Jaeger + + * sysdeps/generic/bb_init_func.c (__bb_init_func): Use ISO C + declaration style. + + * nss/nss_files/files-hosts.c: Delete inclusion of + "../resolv/mapv4v6hostent.h". + 1997-05-31 02:33 Ulrich Drepper * io/ftwtest-sh: More tests. diff --git a/elf/dl-support.c b/elf/dl-support.c index e59b84727e..21cd13e5cf 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -20,9 +20,25 @@ /* This file defines some things that for the dynamic linker are defined in rtld.c and dl-sysdep.c in ways appropriate to bootstrap dynamic linking. */ +#include + + extern char *__progname; char **_dl_argv = &__progname; /* This is checked for some error messages. */ /* This defines the default search path for libraries. For the dynamic linker it is set by -rpath when linking. */ const char *_dl_rpath = DEFAULT_RPATH; + +/* If nonzero print warnings about problematic situations. */ +int _dl_verbose; + + +static void init_verbose (void) __attribute__ ((unused)); + +static void +init_verbose (void) +{ + _dl_verbose = *(getenv ("LD_WARN") ?: "") == '\0' ? 0 : 1; +} +text_set_element (__libc_subinit, init_verbose); diff --git a/io/ftw.c b/io/ftw.c index 7367f9733e..c53773d0c1 100644 --- a/io/ftw.c +++ b/io/ftw.c @@ -243,12 +243,14 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, memcpy (data->dirbuf + data->ftw.base, name, namlen); data->dirbuf[data->ftw.base + namlen] = '\0'; - if (((data->flags & FTW_PHYS) ? lstat : stat) (data->dirbuf, &st) < 0) + if (((data->flags & FTW_PHYS) + ? __lxstat (_STAT_VER, data->dirbuf, &st) + : __xstat (_STAT_VER, data->dirbuf, &st)) < 0) { if (errno != EACCES && errno != ENOENT) result = -1; else if (!(data->flags & FTW_PHYS) - && lstat (data->dirbuf, &st) == 0 + && __lxstat (_STAT_VER, data->dirbuf, &st) == 0 && S_ISLNK (st.st_mode)) flag = FTW_SLN; else @@ -265,8 +267,8 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, } if (result == 0 - && (!(data->flags & FTW_MOUNT) || flag == FTW_NS - || st.st_dev == data->dev)) + && (flag == FTW_NS + || !(data->flags & FTW_MOUNT) || st.st_dev == data->dev)) { if ((data->flags & FTW_PHYS) || flag == FTW_NS || (!find_object (data, &st) @@ -282,7 +284,7 @@ process_entry (struct ftw_data *data, struct dir_data *dir, const char *name, /* Change back to current directory. */ int done = 0; if (dir->stream != NULL) - if (fchdir (dirfd (dir->stream)) == 0) + if (__fchdir (dirfd (dir->stream)) == 0) done = 1; if (!done) @@ -347,7 +349,7 @@ ftw_dir (struct ftw_data *data, struct stat *st) /* If necessary, change to this directory. */ if (data->flags & FTW_CHDIR) { - if (fchdir (dirfd (dir.stream)) < 0) + if (__fchdir (dirfd (dir.stream)) < 0) { if (errno == ENOSYS) { @@ -521,13 +523,16 @@ ftw_startup (const char *dir, int is_nftw, void *func, int descriptors, /* Get stat info for start directory. */ if (result == 0) - if (((flags & FTW_PHYS) ? lstat : stat) (data.dirbuf, &st) < 0) + if (((flags & FTW_PHYS) + ? __lxstat (_STAT_VER, data.dirbuf, &st) + : __xstat (_STAT_VER, data.dirbuf, &st)) < 0) { if (errno == EACCES) result = (*data.func) (data.dirbuf, &st, FTW_NS, &data.ftw); else if (!(flags & FTW_PHYS) && errno == ENOENT - && lstat (dir, &st) == 0 && S_ISLNK (st.st_mode)) + && __lxstat (_STAT_VER, dir, &st) == 0 + && S_ISLNK (st.st_mode)) result = (*data.func) (data.dirbuf, &st, data.cvt_arr[FTW_SLN], &data.ftw); else diff --git a/localedata/locales/cs_CZ b/localedata/locales/cs_CZ new file mode 100644 index 0000000000..ba159570d8 --- /dev/null +++ b/localedata/locales/cs_CZ @@ -0,0 +1,810 @@ +escape_char / +comment_char % +% +% Czech Language Locale for Czech +% Source: +% Address: U školy 292 Without diactitical chars: U skoly 292 +% 783 72 Velký Týnec 782 72 Velky Tynec +% Contact: Vladimir Michl +% Email: Vladimir.Michl@upol.cz +% Tel: +% Fax: +% Language: cs +% Territory: CZ +% Revision: 1.01 +% Date: 1997-01-17 +% Application: general +% Users: general +% Repertoiremap: mnemonic.ds +% Charset: ISO_8859-2:1987 +% Distribution and use is free, also +% for commercial purposes. + +% zpracování: +%% localedef -c -i -f "ISO_8859-2:1987" 'cs_CZ.ISO-8859-2' +%% pokud se podaří odstranit chyby, lze -c vynechat. + +%% pro úspěšné přeložení je třeba mít kolekci lokalizací WG15collection. +%% Tuto rozbalit do adresáře +%% /usr/share/i18n +%% Lokalizace se pak budou tvořit v adresáři /usr/share/locale + +%% Také je dobré do souboru /usr/share/locale/locale.alias napsat tyto řádky +%% cz cs_CZ.ISO88592 +%% cs cs_CZ.ISO88592 +%% czech cs_CZ.ISO88592 + + +%% Pořadí znaků +%% Možná jsou některé akcentované znaky jinak než by měly být, +%% zkuste zkontrolovat a případné vylepšení mi poslat. +%% ---------------------------------------------------------- + +LC_COLLATE +% Definice písmene ch +collating-element from "" +collating-element from "" +collating-element from "" + +collating-symbol +collating-symbol + +collating-symbol +collating-symbol +%collating-symbol +%collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol +%collating-symbol +collating-symbol +collating-symbol +collating-symbol +collating-symbol + +order_start forward;backward/ + ;forward;position + + + + + + + + +% +% + + + + +% + + + + + +% + ;;;IGNORE + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +<_> IGNORE;IGNORE;IGNORE;<_> +<--> IGNORE;IGNORE;IGNORE;<--> +<-> IGNORE;IGNORE;IGNORE;<-> +<,> IGNORE;IGNORE;IGNORE;<,> +<;> IGNORE;IGNORE;IGNORE;<;> +<:> IGNORE;IGNORE;IGNORE;<:> + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +<.> IGNORE;IGNORE;IGNORE;<.> +<''> IGNORE;IGNORE;IGNORE;<''> +<'!> IGNORE;IGNORE;IGNORE;<'!> +<'/>> IGNORE;IGNORE;IGNORE;<'/>> +<':> IGNORE;IGNORE;IGNORE;<':> +<'?> IGNORE;IGNORE;IGNORE;<'?> +<',> IGNORE;IGNORE;IGNORE;<',> +<'> IGNORE;IGNORE;IGNORE;<'> +<"> IGNORE;IGNORE;IGNORE;<"> +<(> IGNORE;IGNORE;IGNORE;<(> +<)> IGNORE;IGNORE;IGNORE;<)> +<<(> IGNORE;IGNORE;IGNORE;<<(> +<)/>> IGNORE;IGNORE;IGNORE;<)/>> +<(!> IGNORE;IGNORE;IGNORE;<(!> + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +<*> IGNORE;IGNORE;IGNORE;<*> + IGNORE;IGNORE;IGNORE; +<&> IGNORE;IGNORE;IGNORE;<&> + IGNORE;IGNORE;IGNORE; +<%> IGNORE;IGNORE;IGNORE;<%> +<+> IGNORE;IGNORE;IGNORE;<+> +<-:> IGNORE;IGNORE;IGNORE;<-:> +<*X> IGNORE;IGNORE;IGNORE;<*X> +<<> IGNORE;IGNORE;IGNORE;<<> +<=> IGNORE;IGNORE;IGNORE;<=> +> IGNORE;IGNORE;IGNORE;> + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +<'<> IGNORE;IGNORE;IGNORE;<'<> +<'(> IGNORE;IGNORE;IGNORE;<'(> +<'.> IGNORE;IGNORE;IGNORE;<'.> +<'0> IGNORE;IGNORE;IGNORE;<'0> +<';> IGNORE;IGNORE;IGNORE;<';> +<'"> IGNORE;IGNORE;IGNORE;<'"> + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +
IGNORE;IGNORE;IGNORE;
+ IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +
IGNORE;IGNORE;IGNORE;
+ IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; + IGNORE;IGNORE;IGNORE; +UNDEFINED IGNORE;IGNORE;IGNORE + +<0> <0>;<0>;IGNORE;IGNORE +<1> <1>;<1>;IGNORE;IGNORE +<2> <2>;<2>;IGNORE;IGNORE +<3> <3>;<3>;IGNORE;IGNORE +<4> <4>;<4>;IGNORE;IGNORE +<5> <5>;<5>;IGNORE;IGNORE +<6> <6>;<6>;IGNORE;IGNORE +<7> <7>;<7>;IGNORE;IGNORE +<8> <8>;<8>;IGNORE;IGNORE +<9> <9>;<9>;IGNORE;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +> ;;;IGNORE +> ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +> ;;;IGNORE +> ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE +> ;;;IGNORE +> ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +

;;;IGNORE +

;;/ + ;;;;;;/ + ;;;;;;/ + ;;
;;;;/ + ;;;;;;/ + ;;;;;;/ + ;;;;;;/ + ;;;;;;/ + ;;;; + +alpha ;...;;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;...;;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + + +upper ;...;;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + + +lower ;...;;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + >;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + ;/ + + + +toupper (,);(,);(,);(,);(,);(,);/ + (,);(,);(,);(,);(,);(,);/ + (,);(,);(,);(

,

,

);(,);(,);/ + (,);(,);(,);(,);(,);(,);/ + (,);(,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (>,>);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (>,>);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (>,>);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,) + +END LC_CTYPE + +%% LC_MESSAGES +%% ekvivalenty yes/no +%% ------------------------- + +LC_MESSAGES + +yesexpr "<<(><)/>><.><*>" +noexpr "<<(><)/>><.><*>" +yesstr "" +nostr "" + +END LC_MESSAGES + +%% LC_MONETARY -- jde jen o peníze +%% ------------------------------------------------- + +LC_MONETARY + +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "<,>" +mon_thousands_sep "" +mon_grouping 3;3 +positive_sign "" +negative_sign "<->" +int_frac_digits 2 +frac_digits 2 +p_cs_precedes 0 +p_sep_by_space 1 +n_cs_precedes 0 +n_sep_by_space 1 +p_sign_posn 1 +n_sign_posn 1 + +END LC_MONETARY + +%% O číslech +%% -------------- + +LC_NUMERIC + +decimal_point "<,>" +thousands_sep "" +grouping 3;3 + +END LC_NUMERIC + +%% Čas + +LC_TIME + +abday "";/ + "

";/ + "";/ + "";/ + "";/ + "

";/ + "" + +day "";/ + "

";/ + "";/ + "";/ + "";/ + "

";/ + "" + +abmon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "

";/ + "";/ + "";/ + "";/ + "

" + +mon "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "";/ + "

";/ + "";/ + "";/ + "

";/ + "

" + + +d_t_fmt "<%><%><.><%><%><%><:><%><:><%><%>" +%d_t_fmt "<%><.><%><.><%><%><%>" + +d_fmt "<%><.><%><.><%>" +%d_fmt "<%><.><%><.><%>" + +t_fmt "<%><:><%><:><%>" +%t_fmt "<%>" + +t_fmt_ampm "<%><:><%><:><%>" +%t_fmt_ampm "" + +%am_pm "am";"pm" +am_pm "";"" + +% Zde nevím, co následující položky znamenají +% V případě potřeby prosím opravte + +%era "<%>" + +%era_year "<%>" + +%alt_digits "<0>";"<1>";"<2>";"<3>";"<4>";/ +% "<5>";"<6>";"<7>";"<8>" + +%era_d_fmt "<%><%><%>" + +END LC_TIME + +%% END OF LOCALIZATION FILE for cs_CZ.ISO-8859-2 +%% Konec lokalizačního souboru pro české prostředí diff --git a/localedata/locales/hr_HR b/localedata/locales/hr_HR index 00b69cd5f5..482888887b 100644 --- a/localedata/locales/hr_HR +++ b/localedata/locales/hr_HR @@ -2,17 +2,18 @@ comment_char % escape_char / % % Croatian Language Locale for Croatia -% Source: USM/MZT -% Address: Kotnikova 6, -% Ljubljana, Slovenia -% Contact: Borka Jerman-Blaz<)/>><*><.>" END LC_MESSAGES LC_MONETARY -int_curr_symbol "" -currency_symbol "" -mon_decimal_point "<,>" +int_curr_symbol "" +currency_symbol "" +mon_decimal_point "<.>" mon_thousands_sep "" mon_grouping 3;3 positive_sign "" negative_sign "<->" -int_frac_digits 0 -frac_digits 0 +int_frac_digits 2 +frac_digits 2 p_cs_precedes 1 p_sep_by_space 1 n_cs_precedes 1 @@ -2181,44 +2182,44 @@ n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "<,>" +decimal_point "<.>" thousands_sep "" grouping 0;0 END LC_NUMERIC LC_TIME -abday "";"

";/ - "";"";/ - "";"

";/ - "" -day "";/ - "

";/ - "";/ - "";/ - "";/ - "

";/ - "" -abmon "";"";/ - "";"

";/ - "";"";/ - "";"";/ - "

";"";/ - "";"" -mon "";/ - "";/ - "";/ - "

";/ - "";/ - "";/ - "";/ - "";/ - "

";/ - "";/ - "";/ - "" +abday "";"

";/ + "";"";/ + "";"

";/ + "" +day "";/ + "

";/ + "";/ + "";/ + "";/ + "

";/ + "" +abmon "";"";/ + "";"";/ + "";"

";/ + "

";"";/ + "";"";/ + "";"

" +mon "";/ + "";/ + "";/ + "";/ + "";/ + "

";/ + "

";/ + "";/ + "";/ + "

";/ + "";/ + "

" d_t_fmt "<%><%><%><%><%>" -d_fmt "<%><-><%><-><%>" +d_fmt "<%><.><%><.><%>" t_fmt "<%>" am_pm "";"" t_fmt_ampm "" diff --git a/login/Makefile b/login/Makefile index 832b1caf63..05913ee337 100644 --- a/login/Makefile +++ b/login/Makefile @@ -29,11 +29,14 @@ routines := getutent getutent_r getutid getutline getutid_r getutline_r \ others = utmpd install-sbin = utmpd -utmpd-routines := connection database error request xtmp +utmpd-routines := utmpd connection database error request xtmp +extra-objs := $(utmpd-routines:=.o) -distribute := utmp-private.h utmpd/xtmp.h utmpd/utmpd.h utmpd/utmpd-private.h +distribute := utmp-private.h programs/xtmp.h programs/utmpd.h \ + programs/utmpd-private.h $(utmpd-routines:%=programs/%.c) -vpath %.c utmpd +subdir-dirs = programs +vpath %.c programs # Build the -lutil library with these extra functions. extra-libs := libutil diff --git a/login/programs/connection.c b/login/programs/connection.c new file mode 100644 index 0000000000..4e1663189d --- /dev/null +++ b/login/programs/connection.c @@ -0,0 +1,180 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Mark Kettenis , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include +#include + +#include "utmpd-private.h" + + +/* Prototypes for the local functions. */ +static client_connection *alloc_connection (void); +static void free_connection (client_connection *connection); +static int set_nonblock_flag (int desc, int value); + + +/* The head of the connection list. */ +static client_connection *connection_list = NULL; + + +/* Accept connection on SOCK, with access permissions given by ACCESS. + Returns a pointer to a newly allocated client_connection if + successful, NULL if not. */ +client_connection * +accept_connection (int sock, int access) +{ + client_connection *connection; + + connection = alloc_connection (); + if (connection == NULL) + return NULL; + + connection->sock = accept (sock, NULL, NULL); + connection->access = access; + if (connection->sock < 0) + { + free_connection (connection); + return NULL; + } + + if (set_nonblock_flag (connection->sock, 1) < 0) + { + close_connection (connection); + return NULL; + } + + return connection; +} + + +/* Close CONNECTION. */ +void +close_connection (client_connection *connection) +{ + close (connection->sock); + free_connection (connection); +} + + +/* Return the connection for SOCK. */ +client_connection * +find_connection (int sock) +{ + client_connection *connection; + + for (connection = connection_list; connection; + connection = connection->next) + { + if (connection->sock == sock) + return connection; + } + + return NULL; +} + + +static client_connection * +alloc_connection (void) +{ + client_connection *connection; + size_t read_bufsize = 1024; + size_t write_bufsize = 1024; + + connection = (client_connection *)malloc (sizeof (client_connection)); + if (connection == NULL) + return NULL; + + memset (connection, 0, sizeof (client_connection)); + + /* Allocate read buffer. */ + connection->read_base = malloc (read_bufsize); + connection->read_ptr = connection->read_base; + connection->read_end = connection->read_base + read_bufsize; + if (connection->read_base == NULL) + { + free (connection); + return NULL; + } + + /* Allocate write buffer. */ + connection->write_base = malloc (write_bufsize); + connection->write_ptr = connection->write_base; + connection->write_end = connection->write_base + write_bufsize; + if (connection->write_base == NULL) + { + free (connection->read_base); + free (connection); + return NULL; + } + + /* Link connection. */ + connection->next = connection_list; + connection_list = connection; + if (connection->next) + connection->next->prev = connection; + + return connection; +} + + +static void +free_connection (client_connection *connection) +{ + /* Unlink connection. */ + if (connection->next) + connection->next->prev = connection->prev; + if (connection->prev) + connection->prev->next = connection->next; + + /* Take care of the head of the list. */ + if (connection == connection_list) + connection_list = connection->next; + + /* Free buffers. */ + if (connection->read_base) + free (connection->read_base); + if (connection->write_base) + free (connection->write_base); + + free (connection); +} + + +/* Set the `O_NONBLOCK' flag of DESC if VALUE is nonzero, + or clear the flag if VALUE is 0. + Return 0 on success, or -1 on error with `errno' set. */ +static int +set_nonblock_flag (int desc, int value) +{ + int oldflags = fcntl (desc, F_GETFL, 0); + /* If reading the flags failed, return error indication now. */ + if (oldflags == -1) + return -1; + /* Set just the flag we want to set. */ + if (value != 0) + oldflags |= O_NONBLOCK; + else + oldflags &= ~O_NONBLOCK; + /* Store modified flag word in the descriptor. */ + return fcntl (desc, F_SETFL, oldflags); +} diff --git a/login/programs/database.c b/login/programs/database.c new file mode 100644 index 0000000000..e31e0d9dae --- /dev/null +++ b/login/programs/database.c @@ -0,0 +1,516 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Mark Kettenis , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#include "utmpd-private.h" +#include "xtmp.h" + + +/* Prototypes for the local functions. */ +static int initialize_database (utmp_database *database); +static int store_state_entry (utmp_database *database, int old_position, + const struct utmp *old_entry); +static int store_process_entry (utmp_database *database, int old_position, + const struct utmp *old_entry); +static int replace_entry (utmp_database *database, int old_position, + int new_position, const struct utmp *entry); +static int store_entry (utmp_database *database, int position, + const struct utmp *entry); +static int proc_utmp_eq (const struct utmp *entry, const struct utmp *match); +static int get_mtime (const char *file, time_t *timer); + + +/* Open the database specified by FILE and merge it with the + contents of the old format file specified by OLD_FILE. Returns a + pointer to a newly allocated structure describing the database, or + NULL on error. */ +utmp_database * +open_database (const char *file, const char *old_file) +{ + utmp_database *database; + + /* Allocate memory. */ + database = (utmp_database *) malloc (sizeof (utmp_database)); + if (database == NULL) + return NULL; + + memset (database, 0, sizeof (utmp_database)); + + /* Open database. */ + database->fd = open (file, O_RDWR); + if (database->fd < 0) + goto fail; + + database->old_fd = open (old_file, O_RDWR); + if (database->old_fd < 0) + goto fail; + + if ((file && !(database->file = strdup (file))) + || (old_file && !(database->old_file = strdup (old_file)))) + goto fail; + + if (initialize_database (database) < 0 + || synchronize_database (database) < 0) + goto fail; + + return database; + +fail: + close_database (database); + return NULL; +} + +/* Synchronize DATABASE. */ +int +synchronize_database (utmp_database *database) +{ + assert (database); + + /* Check if there is a file in the old format, that we have to + synchronize with. */ + if (database->old_file) + { + time_t curtime; + time_t mtime; + + curtime = time (NULL); + + if (get_mtime (database->old_file, &mtime) < 0) + return -1; + + if (mtime >= database->mtime) + { + int position = 0; + struct utmp entry; + struct utmp old_entry; + + while (1) + { + if (read_old_entry (database, position, &old_entry) < 0) + break; + + if (read_entry (database, position, &entry) < 0 + || !compare_entry (&old_entry, &entry)) + { + if (write_entry (database, position, &old_entry) < 0) + return -1; + } + + position++; + } + + database->mtime = curtime; + } + + } + + return 0; +} + + +/* Close DATABASE. */ +void +close_database (utmp_database *database) +{ + assert (database); + + if (database->fd >= 0) + close (database->fd); + + if (database->old_fd >= 0) + close (database->old_fd); + + /* Free allocated memory. */ + if (database->file) + free (database->file); + if (database->old_file) + free (database->old_file); + free (database); +} + + +/* Read the entry at POSITION in DATABASE and store the result in + ENTRY. Returns 0 if successful, -1 if not. */ +int +read_entry (utmp_database *database, int position, struct utmp *entry) +{ + ssize_t nbytes; + off_t offset; + + offset = position * sizeof (struct utmp); + if (lseek (database->fd, offset, SEEK_SET) < 0) + return -1; + + nbytes = read (database->fd, entry, sizeof (struct utmp)); + if (nbytes != sizeof (struct utmp)) + return -1; + + return 0; +} + + +/* Write ENTRY at POSITION in DATABASE. Returns 0 if successful, -1 + on error. */ +int +write_entry (utmp_database *database, int position, + const struct utmp *entry) +{ + int result = -1; + struct flock fl; + ssize_t nbytes; + off_t offset; + + /* Try to lock the file. */ + memset (&fl, 0, sizeof (struct flock)); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fcntl (database->fd, F_SETLKW, &fl); + + offset = position * sizeof (struct utmp); + if (lseek (database->fd, offset, SEEK_SET) < 0) + goto fail; + + nbytes = write (database->fd, entry, sizeof (struct utmp)); + if (nbytes != sizeof (struct utmp)) + { + ftruncate (database->fd, offset); + goto fail; + } + + result = 0; + +fail: + /* And unlock the file. */ + fl.l_type = F_UNLCK; + fcntl (database->fd, F_SETLKW, &fl); + + return result; +} + + +/* Append ENTRY to DATABASE. Returns the position of the appended + entry if successful, or -1 on error. */ +int +append_entry (utmp_database *database, const struct utmp *entry) +{ + int result = -1; + struct flock fl; + ssize_t nbytes; + off_t offset; + + /* Try to lock the file. */ + memset (&fl, 0, sizeof (struct flock)); + fl.l_type = F_WRLCK; + fl.l_whence = SEEK_SET; + fcntl (database->fd, F_SETLKW, &fl); + + offset = lseek (database->fd, 0, SEEK_END); + if (offset % sizeof (struct utmp) != 0) + { + offset -= offset % sizeof (struct utmp); + ftruncate (database->fd, offset); + + if (lseek (database->fd, 0, SEEK_END) < 0) + goto fail; + } + + nbytes = write (database->fd, entry, sizeof (struct utmp)); + if (nbytes != sizeof (struct utmp)) + { + ftruncate (database->fd, offset); + goto fail; + } + + result = offset / sizeof (struct utmp); + +fail: + /* And unlock the file. */ + fl.l_type = F_UNLCK; + fcntl (database->fd, F_SETLKW, &fl); + + return result; +} + + +int +read_old_entry (utmp_database *database, int position, + struct utmp *entry) +{ + struct xtmp old_entry; + ssize_t nbytes; + off_t offset; + + offset = position * sizeof (struct xtmp); + if (lseek (database->old_fd, offset, SEEK_SET) < 0) + return -1; + + nbytes = read (database->old_fd, &old_entry, sizeof (struct xtmp)); + if (nbytes != sizeof (struct xtmp)) + return -1; + + xtmp_to_utmp (&old_entry, entry); + return 0; +} + + +int +write_old_entry (utmp_database *database, int position, + const struct utmp *entry) +{ + struct xtmp old_entry; + ssize_t nbytes; + off_t offset; + + utmp_to_xtmp (entry, &old_entry); + + offset = position * sizeof (struct xtmp); + if (lseek (database->old_fd, offset, SEEK_SET) < 0) + return -1; + + nbytes = write (database->old_fd, &old_entry, sizeof (struct xtmp)); + if (nbytes != sizeof (struct xtmp)) + return -1; + + return 0; +} + + +/* Initialize DATABASE. */ +static int +initialize_database (utmp_database *database) +{ + struct utmp entry; + int position = 0; + + assert (database); + + /* Check if there is a file in the old format to read. */ + if (database->old_file) + { + while (1) + { + if (read_old_entry (database, position, &entry) < 0) + break; + +#if _HAVE_UT_TYPE - 0 + /* If the login type is one of RUN_LVL, BOOT_TIME, OLD_TIME or + NEW_TIME, search for an entry of the same type in the + database, and replace it if the entry in the file is newer. */ + if (entry.ut_type == RUN_LVL || entry.ut_type == BOOT_TIME + || entry.ut_type == OLD_TIME || entry.ut_type == NEW_TIME) + { + if (store_state_entry (database, position, &entry) < 0) + return -1; + } + else +#endif + { + if (store_process_entry (database, position, &entry) < 0) + return -1; + } + + /* Update position. */ + position++; + } + + while (1) + { + if (read_entry (database, position, &entry) < 0) + break; + + if (write_old_entry (database, position, &entry) < 0) + return -1; + + /* Update position. */ + position++; + } + } + + return 0; +} + + +static int +store_state_entry (utmp_database *database, int old_position, + const struct utmp *old_entry) +{ + struct utmp new_entry; + int new_position = 0; + int found = 0; + + assert (old_entry->ut_type == RUN_LVL + || old_entry->ut_type == BOOT_TIME + || old_entry->ut_type == OLD_TIME + || old_entry->ut_type == NEW_TIME); + + while (!found) + { + /* Read the next entry. */ + if (read_entry (database, new_position, &new_entry) < 0) + break; + + if (old_entry->ut_type == new_entry.ut_type) + { + found = 1; + continue; + } + + /* Update position. */ + new_position++; + } + + if (found) + { + const struct utmp *entry; + + if (old_entry->ut_time > new_entry.ut_time) + entry = old_entry; + else + entry = &new_entry; + + return replace_entry (database, old_position, new_position, entry); + } + + return store_entry (database, old_position, old_entry); +} + + +static int +store_process_entry (utmp_database *database, int old_position, + const struct utmp *old_entry) +{ + struct utmp new_entry; + int new_position = 0; + int found = 0; + + while (!found) + { + /* Read the next entry. */ + if (read_entry (database, new_position, &new_entry) < 0) + break; + + if (proc_utmp_eq (old_entry, &new_entry)) + { + found = 1; + continue; + } + + /* Update position. */ + new_position++; + } + + if (found) + { + const struct utmp *entry; + + if (old_entry->ut_time > new_entry.ut_time) + entry = old_entry; + else + entry = &new_entry; + + return replace_entry (database, old_position, new_position, entry); + } + + return store_entry (database, old_position, old_entry); +} + + +static int +replace_entry (utmp_database *database, int old_position, int new_position, + const struct utmp *entry) +{ + struct utmp tmp; + + if (read_entry (database, old_position, &tmp) < 0 + || write_entry (database, old_position, entry) < 0 + || write_entry (database, new_position, &tmp) < 0) + return -1; + + return 0; +} + + +static int +store_entry (utmp_database *database, int position, + const struct utmp *entry) +{ + struct utmp tmp; + + if (read_entry (database, position, &tmp) < 0) + return write_entry (database, position, entry); + + if (write_entry (database, position, entry) < 0 + || append_entry (database, &tmp) < 0) + return -1; + + return 0; +} + + +/* This function is identical to the one in login/utmp_file.c. */ +static int +proc_utmp_eq (const struct utmp *entry, const struct utmp *match) +{ + return + ( +#if _HAVE_UT_TYPE - 0 + (entry->ut_type == INIT_PROCESS + || entry->ut_type == LOGIN_PROCESS + || entry->ut_type == USER_PROCESS + || entry->ut_type == DEAD_PROCESS) + && + (match->ut_type == INIT_PROCESS + || match->ut_type == LOGIN_PROCESS + || match->ut_type == USER_PROCESS + || match->ut_type == DEAD_PROCESS) + && +#endif +#if _HAVE_UT_ID - 0 + strncmp (entry->ut_id, match->ut_id, sizeof match->ut_id) == 0 +#else + strncmp (entry->ut_line, match->ut_line, sizeof match->ut_line) == 0 +#endif + ); +} + + +/* Get modification time of FILE and put it in TIMER. returns 0 if + successful, -1 if not. */ +static int +get_mtime (const char *file, time_t *timer) +{ + struct stat st; + + if (stat (file, &st) < 0) + return -1; + + *timer = st.st_mtime; + + return 0; +} diff --git a/login/programs/error.c b/login/programs/error.c new file mode 100644 index 0000000000..e6511442e3 --- /dev/null +++ b/login/programs/error.c @@ -0,0 +1,104 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Mark Kettenis , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include +#include + +#include "utmpd-private.h" + + +/* This variable indicates if we have forked. If set, we log messages + via the system logger. Otherwise we simply print the program name + and the message to standard error. */ +int forked = 0; + + +/* Log error message MESSAGE, which is a printf-style format string + with optional args. + If ERRNUM is nonzero, also log its corresponding system error message. + Exit with status STATUS if it is nonzero. */ +void +error (int status, int errnum, const char *message, ...) +{ + va_list ap; + char *buffer = NULL; + + va_start (ap, message); + vasprintf (&buffer, message, ap); + va_end (ap); + + if (forked) + { + if (errnum == 0) + syslog (LOG_ERR, "%s", buffer); + else + syslog (LOG_ERR, "%s: %s", buffer, strerror (errnum)); + } + else + { + if (errnum == 0) + fprintf (stderr, "%s: %s\n", program_invocation_name, buffer); + else + fprintf (stderr, "%s: %s: %s\n", program_invocation_name, buffer, + strerror (errnum)); + } + + if (buffer) + free (buffer); + + if (status) + exit (status); +} + +/* Log warning message MESSAGE, which is a printf-style format string + with optional args. + If ERRNUM is nonzero, also log its corresponding system error message. */ +void +warning (int errnum, const char *message, ...) +{ + va_list ap; + char *buffer = NULL; + + va_start (ap, message); + vasprintf (&buffer, message, ap); + va_end (ap); + + if (forked) + { + if (errnum == 0) + syslog (LOG_WARNING, "%s", buffer); + else + syslog (LOG_WARNING, "%s: %s", buffer, strerror (errnum)); + } + else + { + if (errnum == 0) + printf ("%s: %s\n", program_invocation_name, buffer); + else + printf ("%s: %s: %s\n", program_invocation_name, buffer, + strerror (errnum)); + } + + if (buffer) + free (buffer); +} diff --git a/login/programs/request.c b/login/programs/request.c new file mode 100644 index 0000000000..0f68b8ae79 --- /dev/null +++ b/login/programs/request.c @@ -0,0 +1,650 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Mark Kettenis , 1997. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include +#include +#include +#include +#include + +#include "utmpd.h" +#include "utmpd-private.h" + + +/* Prototypes for the local functions. */ +static int process_request (client_connection *connection); +static int send_reply (client_connection *connect, const reply_header *reply); + +static int do_setutent (client_connection *connection); +static int do_getutent (client_connection *connection); +static int do_endutent (client_connection *connection); +static int do_getutline (client_connection *connection); +static int do_getutid (client_connection *connection); +static int do_pututline (client_connection *connection); +static int do_updwtmp (client_connection *connection); + +static int proc_utmp_eq (const struct utmp *entry, const struct utmp *match); +static int internal_getut_r (client_connection *connection, + const struct utmp *id, struct utmp *buffer); + + +/* Read data from the client on CONNECTION. */ +int +read_data (client_connection *connection) +{ + ssize_t nbytes; + + assert (connection); + assert ((connection->read_end - connection->read_ptr) > 0); + + /* Read data. */ + nbytes = read (connection->sock, connection->read_ptr, + connection->read_end - connection->read_ptr); + if (nbytes > 0) + { + size_t total_bytes; + + /* Update read pointer. */ + connection->read_ptr += nbytes; + + /* Check if we have a complete request header. */ + total_bytes = connection->read_ptr - connection->read_base; + if (total_bytes >= sizeof (request_header)) + { + request_header *header; + + /* Check if we have a complete request. */ + header = (request_header *)connection->read_base; + if (total_bytes >= header->size) + { + /* Process the request. */ + if (process_request (connection) < 0) + return -1; + + /* Adjust read pointer, and flush buffer. */ + connection->read_ptr -= header->size; + memmove (connection->read_base, + connection->read_base + header->size, + connection->read_ptr - connection->read_base); + } + } + + return 0; + } + + if (nbytes < 0) + error (0, errno, "cannot read from client"); + + return -1; +} + + +/* Write data to the client on CONNECTION. */ +int +write_data (client_connection *connection) +{ + ssize_t nbytes; + + assert (connection); + assert ((connection->write_ptr - connection->write_base) > 0); + + /* Write data. */ + nbytes = write (connection->sock, connection->write_base, + connection->write_ptr - connection->write_base); + if (nbytes > 0) + { + /* Adjust write pointer and flush buffer. */ + connection->write_ptr -= nbytes; + memmove (connection->write_base, connection->write_base + nbytes, + connection->write_ptr - connection->write_base); + + return 0; + } + + if (nbytes < 0) + error (0, errno, "cannot write to client"); + + return -1; +} + + +/* Process the request received on CONNECTION. Returns 0 if + successful, -1 if not. */ +static int +process_request (client_connection *connection) +{ + request_header *header; + + assert (connection); + assert (connection->read_base); + + header = (request_header *)connection->read_base; + if (header->version != UTMPD_VERSION) + { + warning (EINVAL, "invalid protocol version"); + return -1; + } + + switch (header->type) + { + case UTMPD_REQ_SETUTENT: return do_setutent (connection); + case UTMPD_REQ_GETUTENT: return do_getutent (connection); + case UTMPD_REQ_ENDUTENT: return do_endutent (connection); + case UTMPD_REQ_GETUTLINE: return do_getutline (connection); + case UTMPD_REQ_GETUTID: return do_getutid (connection); + case UTMPD_REQ_PUTUTLINE: return do_pututline (connection); + case UTMPD_REQ_UPDWTMP: return do_updwtmp (connection); + default: + warning (EINVAL, "invalid request type"); + return -1; + } +} + + +/* Send the reply specified by HEADER to the client on CONNECTION. + Returns 0 if successful, -1 if not. */ +static int +send_reply (client_connection *connection, const reply_header *reply) +{ + /* Check if the reply fits in the buffer. */ + if ((size_t) (connection->write_end - connection->write_ptr) < reply->size) + { + error (0, 0, "buffer overflow"); + return -1; + } + + /* Copy reply to buffer, and adjust write pointer. */ + memcpy (connection->write_ptr, reply, reply->size); + connection->write_ptr += reply->size; + + return 0; +} + + +static int +do_setutent (client_connection *connection) +{ + setutent_request *request; + setutent_reply reply; + + request = (setutent_request *)connection->read_base; + if (request->header.size != sizeof (setutent_request)) + { + warning (EINVAL, "invalid request size"); + return -1; + } + + /* Initialize reply. */ + reply.header.version = UTMPD_VERSION; + reply.header.size = sizeof (setutent_reply); + reply.header.type = UTMPD_REQ_SETUTENT; + + /* Select database. */ + if (!strncmp (request->file, _PATH_UTMP, sizeof request->file)) + connection->database = utmp_db; + else + { + errno = EINVAL; + goto return_error; + } + + /* Initialize position pointer. */ + connection->position = 0; + +#if _HAVE_UT_TYPE - 0 + /* Make sure the entry won't match. */ + connection->last_entry.ut_type = -1; +#endif + + reply.errnum = 0; + reply.result = 0; + return send_reply (connection, &reply.header); + +return_error: + reply.errnum = errno; + reply.result = -1; + return send_reply (connection, &reply.header); +} + + +static int +do_getutent (client_connection *connection) +{ + getutent_request *request; + getutent_reply reply; + + request = (getutent_request *)connection->read_base; + if (request->header.size != sizeof (getutent_request)) + { + warning (EINVAL, "invalid request size"); + return -1; + } + + /* Initialize reply. */ + reply.header.version = UTMPD_VERSION; + reply.header.size = sizeof (getutent_reply); + reply.header.type = UTMPD_REQ_GETUTENT; + + if (connection->database == NULL || connection->position == -1) + { + errno = ESRCH; + goto return_error; + } + + /* Make sure we're in synch with the ordinary file. */ + if (synchronize_database (connection->database) < 0) + { + errno = ESRCH; + goto return_error; + } + + /* Read the next entry from the database. */ + if (read_entry (connection->database, connection->position, + &connection->last_entry) < 0) + { + connection->position = -1; + errno = ESRCH; + goto return_error; + } + + /* Update position pointer. */ + connection->position++; + + memcpy (&reply.entry, &connection->last_entry, sizeof (struct utmp)); + reply.errnum = 0; + reply.result = 0; + return send_reply (connection, (reply_header *)&reply); + +return_error: + memset (&reply.entry, 0, sizeof (struct utmp)); + reply.errnum = errno; + reply.result = -1; + return send_reply (connection, &reply.header); +} + + +static int +do_endutent (client_connection *connection) +{ + endutent_request *request; + endutent_reply reply; + + request = (endutent_request *)connection->read_base; + if (request->header.size != sizeof (endutent_request)) + { + warning (EINVAL, "invalid request size"); + return -1; + } + + /* Deselect database. */ + connection->database = NULL; + + /* Formulate reply. */ + reply.header.version = UTMPD_VERSION; + reply.header.size = sizeof (endutent_reply); + reply.header.type = UTMPD_REQ_ENDUTENT; + reply.errnum = 0; + reply.result = 0; + + return send_reply (connection, &reply.header); +} + + +static int +do_getutline (client_connection *connection) +{ + getutline_request *request; + getutline_reply reply; + + request = (getutline_request *)connection->read_base; + if (request->header.size != sizeof (getutline_request)) + { + warning (EINVAL, "invalid request size"); + return -1; + } + + /* Initialize reply.

);(,);(,);/ + (,);(,);(,);(,);(,);(,);/ + (,);(,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (>,>);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (>,>);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (>,>);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,);/ + (,) + +tolower (,);(,);(,);(,);(,);(,);/ + (,);(,);(,);(,);(,);(,);/ + (,);(,);(,);(

;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + ;;;IGNORE + +order_end + +END LC_COLLATE + +% Definice typů znaků + +LC_CTYPE + +digit <0>;<1>;<2>;<3>;<4>;/ + <5>;<6>;<7>;<8>;<9> + +xdigit <0>;<1>;<2>;<3>;<4>;/ + <5>;<6>;<7>;<8>;<9>;/ + ;...;;/ + ;...; + +punct ;...;;/ + <:>;...;;/ + <<(>;...;<'!>;/ + <(!>;...;<'?>;/ + <'(>;;;<':>;/ + <-->;;<';>;<''>;/ + <'<>;<',>;<'">;<*X>;/ + <-:>;<'.> + +blank ;; + +space ;;;;/ + ;; + +cntrl ;;;;;;/ + ;;;;;;/ + ;;;;