[!PATH_MAX] (PATH_MAX): Define to be 1024 if not already defined.
[kopensolaris-gnu/glibc.git] / login / login.c
1 /* Copyright (C) 1996 Free Software Foundation, Inc.
2 This file is part of the GNU C Library.
3 Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
4
5 The GNU C Library is free software; you can redistribute it and/or
6 modify it under the terms of the GNU Library General Public License as
7 published by the Free Software Foundation; either version 2 of the
8 License, or (at your option) any later version.
9
10 The GNU C Library is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 Library General Public License for more details.
14
15 You should have received a copy of the GNU Library General Public
16 License along with the GNU C Library; see the file COPYING.LIB.  If
17 not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA.  */
19
20 #include <errno.h>
21 #include <limits.h>
22 #include <string.h>
23 #include <unistd.h>
24 #include <utmp.h>
25
26 /* XXX used for tty name array in login.  */
27 #ifndef PATH_MAX
28 #define PATH_MAX 1024
29 #endif
30
31 void
32 login (const struct utmp *ut)
33 {
34   char tty[PATH_MAX + UT_LINESIZE];
35   int found_tty;
36   const char *ttyp;
37   struct utmp_data data;
38
39   /* Seek tty.  */
40   found_tty = ttyname_r (STDIN_FILENO, tty, sizeof tty);
41   if (found_tty < 0)
42     found_tty = ttyname_r (STDOUT_FILENO, tty, sizeof tty);
43   if (found_tty < 0)
44     found_tty = ttyname_r (STDERR_FILENO, tty, sizeof tty);
45
46   if (found_tty >= 0)
47     {
48       /* Tell that we want to use the UTMP file.  */
49       if (utmpname (_PATH_UTMP) != 0)
50         {
51           struct utmp tmp;
52           struct utmp *old;
53
54           /* Open UTMP file.  */
55           setutent_r (&data);
56
57           /* We only want to insert the name of the tty without path.  */
58           ttyp = basename (tty);
59
60           /* Position to record for this tty.  */
61 #if _HAVE_UT_TYPE - 0
62           tmp.ut_type = USER_PROCESS;
63 #endif
64           strncpy (tmp.ut_line, ttyp, UT_LINESIZE);
65
66           /* Read the record.  */
67           if (getutline_r (&tmp, &old, &data) >= 0 || errno == ESRCH)
68             {
69 #if _HAVE_UT_TYPE - 0
70               /* We have to fake the old entry because this `login'
71                  function does not fit well into the UTMP file
72                  handling scheme.  */
73               old->ut_type = ut->ut_type;
74 #endif
75               pututline_r (ut, &data);
76             }
77
78           /* Close UTMP file.  */
79           endutent_r (&data);
80         }
81     }
82
83   /* Update the WTMP file.  Here we have to add a new entry.  */
84   if (utmpname (_PATH_WTMP) != 0)
85     {
86       /* Open the WTMP file.  */
87       setutent_r (&data);
88
89       /* Position at end of file.  */
90       data.loc_utmp = lseek (data.ut_fd, 0, SEEK_END);
91       if (data.loc_utmp != -1)
92         {
93 #if _HAVE_UT_TYPE - 0
94           /* We have to fake the old entry because this `login'
95              function does not fit well into the UTMP file handling
96              scheme.  */
97           data.ubuf.ut_type = ut->ut_type;
98 #endif
99           pututline_r (ut, &data);
100         }
101
102       /* Close WTMP file.  */
103       endutent_r (&data);
104     }
105 }