1/* Find out who I am & where I am.
2   Copyright (C) 1994, 1995 Free Software Foundation, Inc.
3
4   This program is free software; you can redistribute it and/or modify
5   it under the terms of the GNU General Public License as published by
6   the Free Software Foundation; either version 2, or (at your option)
7   any later version.
8
9   This program is distributed in the hope that it will be useful,
10   but WITHOUT ANY WARRANTY; without even the implied warranty of
11   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12   GNU General Public License for more details.
13
14   You should have received a copy of the GNU General Public License
15   along with this program; if not, write to the Free Software Foundation,
16   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17*/
18
19#include "system.h"
20
21/* Size of buffers holding strings.  */
22#define STRING_BUFFER_SIZE 64
23
24#include <pwd.h>
25
26/* On Ultrix 2.x, <utsname.h> uses SYS_NMLEN, which is only defined in
27   <limits.h>.  Sigh!  */
28
29#ifdef HAVE_UNAME
30# ifdef HAVE_LIMITS_H
31#  include <limits.h>
32# endif
33# include <sys/utsname.h>
34# include <time.h>
35#else
36# include <sys/time.h>
37#endif
38
39#ifdef HAVE_UNISTD_H
40# include <unistd.h>
41#endif
42
43#ifndef _POSIX_VERSION
44struct passwd *getpwuid ();
45#endif
46
47/*----------------.
48| Get user name.  |
49`----------------*/
50
51static const char *
52get_username ()
53{
54  struct passwd *passwd;
55
56  passwd = getpwuid (getuid ());
57  endpwent ();
58  if (passwd == NULL)
59    return "???";
60  return passwd->pw_name;
61}
62
63/*------------------------------------------------------.
64| Do uname, gethostname, or read file (/etc/systemid).  |
65`------------------------------------------------------*/
66
67static const char *
68get_hostname ()
69{
70#if HAVE_UNAME
71
72  static struct utsname hostname_buffer;
73
74  uname (&hostname_buffer);
75  return hostname_buffer.nodename;
76
77#else
78# if HAVE_ETC_SYSTEMID
79
80  FILE *fpsid = fopen ("/etc/systemid", "r");
81  static char buffer[STRING_BUFFER_SIZE];
82
83  if (!fpsid)
84    return "???";
85  fgets (buffer, sizeof (buffer), fpsid);
86  fclose (fpsid);
87  buffer[strlen (buffer) - 1] = 0;
88  return buffer;
89
90# else
91
92  static char hostname_buffer[STRING_BUFFER_SIZE];
93
94  gethostname (hostname_buffer, sizeof (hostname_buffer));
95  return hostname_buffer;
96
97# endif
98#endif
99}
100
101/*------------------------------------------------------------------.
102| Fill BUFFER with a string representing the username and hostname  |
103| separated by an `@' sign, and return a pointer to the constructed |
104| string.  If BUFFER is NULL, use an internal buffer instead.	    |
105`------------------------------------------------------------------*/
106
107char *
108get_submitter (buffer)
109     char *buffer;
110{
111  static char static_buffer[STRING_BUFFER_SIZE];
112
113  if (!buffer)
114    buffer = static_buffer;
115  strcpy (buffer, get_username ());
116  strcat (buffer, "@");
117  return strcat (buffer, get_hostname ());
118}
119