wall: remove global variables and support TMPDIR
The TMPDIR environment is preferred over _PATH_TMP in which a file is created that is ultimately sent to terminals. This patch will also fix compiler warnings and removes magical numbers, which has not explanation. Signed-off-by: Sami Kerola <kerolasa@iki.fi> Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
ca6182333e
commit
98e2d4deb3
|
@ -66,8 +66,6 @@
|
||||||
#include "carefulputc.h"
|
#include "carefulputc.h"
|
||||||
#include "c.h"
|
#include "c.h"
|
||||||
|
|
||||||
void makemsg __P((char *));
|
|
||||||
|
|
||||||
#define IGNOREUSER "sleeper"
|
#define IGNOREUSER "sleeper"
|
||||||
|
|
||||||
#ifndef MAXHOSTNAMELEN
|
#ifndef MAXHOSTNAMELEN
|
||||||
|
@ -78,9 +76,8 @@ void makemsg __P((char *));
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int nobanner;
|
/* Function prototypes */
|
||||||
int mbufsize;
|
char *makemsg(char *fname, size_t *mbufsize, int print_banner);
|
||||||
char *mbuf;
|
|
||||||
|
|
||||||
static void __attribute__((__noreturn__)) usage(void)
|
static void __attribute__((__noreturn__)) usage(void)
|
||||||
{
|
{
|
||||||
|
@ -96,16 +93,19 @@ main(int argc, char **argv) {
|
||||||
struct utmp *utmpptr;
|
struct utmp *utmpptr;
|
||||||
char *p;
|
char *p;
|
||||||
char line[sizeof(utmpptr->ut_line) + 1];
|
char line[sizeof(utmpptr->ut_line) + 1];
|
||||||
|
int print_banner = TRUE;
|
||||||
|
char *mbuf;
|
||||||
|
size_t mbufsize;
|
||||||
|
|
||||||
setlocale(LC_ALL, "");
|
setlocale(LC_ALL, "");
|
||||||
bindtextdomain(PACKAGE, LOCALEDIR);
|
bindtextdomain(PACKAGE, LOCALEDIR);
|
||||||
textdomain(PACKAGE);
|
textdomain(PACKAGE);
|
||||||
|
|
||||||
while ((ch = getopt(argc, argv, "n")) != -1) {
|
while ((ch = getopt(argc, argv, "n")) != -1) {
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case 'n':
|
case 'n':
|
||||||
if (geteuid() == 0)
|
if (geteuid() == 0)
|
||||||
nobanner = 1;
|
print_banner = FALSE;
|
||||||
break;
|
break;
|
||||||
case '?':
|
case '?':
|
||||||
default:
|
default:
|
||||||
|
@ -117,9 +117,7 @@ main(int argc, char **argv) {
|
||||||
if (argc > 1)
|
if (argc > 1)
|
||||||
usage();
|
usage();
|
||||||
|
|
||||||
makemsg(*argv);
|
mbuf = makemsg(*argv, &mbufsize, print_banner);
|
||||||
|
|
||||||
setutent();
|
|
||||||
|
|
||||||
iov.iov_base = mbuf;
|
iov.iov_base = mbuf;
|
||||||
iov.iov_len = mbufsize;
|
iov.iov_len = mbufsize;
|
||||||
|
@ -144,12 +142,12 @@ main(int argc, char **argv) {
|
||||||
warnx("%s", p);
|
warnx("%s", p);
|
||||||
}
|
}
|
||||||
endutent();
|
endutent();
|
||||||
|
free(mbuf);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
char *
|
||||||
makemsg(fname)
|
makemsg(char *fname, size_t *mainmbufsize, int print_banner)
|
||||||
char *fname;
|
|
||||||
{
|
{
|
||||||
register int ch, cnt;
|
register int ch, cnt;
|
||||||
struct tm *lt;
|
struct tm *lt;
|
||||||
|
@ -158,24 +156,39 @@ makemsg(fname)
|
||||||
time_t now;
|
time_t now;
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
int fd;
|
int fd;
|
||||||
char *p, *whom, *where, hostname[MAXHOSTNAMELEN],
|
char *p, *whom, *where, *hostname, *lbuf, *tmpname, *tmpenv, *mbuf;
|
||||||
lbuf[MAXHOSTNAMELEN + 320],
|
size_t mbufsize;
|
||||||
tmpname[sizeof(_PATH_TMP) + 20];
|
long line_max;
|
||||||
|
|
||||||
sprintf(tmpname, "%s/wall.XXXXXX", _PATH_TMP);
|
hostname = xmalloc(sysconf(_SC_HOST_NAME_MAX) + 1);
|
||||||
|
line_max = sysconf(_SC_LINE_MAX);
|
||||||
|
lbuf = xmalloc(line_max);
|
||||||
|
|
||||||
|
tmpname = xmalloc(PATH_MAX);
|
||||||
|
tmpenv = getenv("TMPDIR");
|
||||||
|
if ((tmpenv))
|
||||||
|
snprintf(tmpname, PATH_MAX, "%s/%s.XXXXXX", tmpenv,
|
||||||
|
program_invocation_short_name);
|
||||||
|
else
|
||||||
|
snprintf(tmpname, PATH_MAX, "%s/%s.XXXXXX", _PATH_TMP,
|
||||||
|
program_invocation_short_name);
|
||||||
if (!(fd = mkstemp(tmpname)) || !(fp = fdopen(fd, "r+")))
|
if (!(fd = mkstemp(tmpname)) || !(fp = fdopen(fd, "r+")))
|
||||||
errx(EXIT_FAILURE, _("can't open temporary file"));
|
err(EXIT_FAILURE, _("can't open temporary file %s"), tmpname);
|
||||||
|
|
||||||
unlink(tmpname);
|
unlink(tmpname);
|
||||||
|
free(tmpname);
|
||||||
|
|
||||||
if (!nobanner) {
|
if (print_banner == TRUE) {
|
||||||
if (!(whom = getlogin()) || !*whom)
|
if (!(whom = getlogin()) || !*whom)
|
||||||
whom = (pw = getpwuid(getuid())) ? pw->pw_name : "???";
|
whom = (pw = getpwuid(getuid())) ? pw->pw_name : "???";
|
||||||
if (!whom || strlen(whom) > 100)
|
if (!whom) {
|
||||||
whom = "someone";
|
whom = "someone";
|
||||||
where = ttyname(2);
|
warn(_("cannot get passwd uid"));
|
||||||
if (!where || strlen(where) > 100)
|
}
|
||||||
|
where = ttyname(STDOUT_FILENO);
|
||||||
|
if (!where) {
|
||||||
where = "somewhere";
|
where = "somewhere";
|
||||||
|
warn(_("cannot get tty name"));
|
||||||
|
}
|
||||||
gethostname(hostname, sizeof(hostname));
|
gethostname(hostname, sizeof(hostname));
|
||||||
time(&now);
|
time(&now);
|
||||||
lt = localtime(&now);
|
lt = localtime(&now);
|
||||||
|
@ -199,6 +212,8 @@ makemsg(fname)
|
||||||
}
|
}
|
||||||
fprintf(fp, "%79s\r\n", " ");
|
fprintf(fp, "%79s\r\n", " ");
|
||||||
|
|
||||||
|
free(hostname);
|
||||||
|
|
||||||
if (fname) {
|
if (fname) {
|
||||||
/*
|
/*
|
||||||
* When we are not root, but suid or sgid, refuse to read files
|
* When we are not root, but suid or sgid, refuse to read files
|
||||||
|
@ -206,16 +221,16 @@ makemsg(fname)
|
||||||
* After all, our invoker can easily do "wall < file"
|
* After all, our invoker can easily do "wall < file"
|
||||||
* instead of "wall file".
|
* instead of "wall file".
|
||||||
*/
|
*/
|
||||||
int uid = getuid();
|
uid_t uid = getuid();
|
||||||
if (uid && (uid != geteuid() || getgid() != getegid()))
|
if (uid && (uid != geteuid() || getgid() != getegid()))
|
||||||
errx(EXIT_FAILURE, _("will not read %s - use stdin."),
|
errx(EXIT_FAILURE, _("will not read %s - use stdin."),
|
||||||
fname);
|
fname);
|
||||||
|
|
||||||
if (!freopen(fname, "r", stdin))
|
if (!freopen(fname, "r", stdin))
|
||||||
errx(EXIT_FAILURE, _("can't read %s."), fname);
|
err(EXIT_FAILURE, _("cannot open file %s"), fname);
|
||||||
}
|
}
|
||||||
|
|
||||||
while (fgets(lbuf, sizeof(lbuf), stdin)) {
|
while (fgets(lbuf, line_max, stdin)) {
|
||||||
for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
|
for (cnt = 0, p = lbuf; (ch = *p) != '\0'; ++p, ++cnt) {
|
||||||
if (cnt == 79 || ch == '\n') {
|
if (cnt == 79 || ch == '\n') {
|
||||||
for (; cnt < 79; ++cnt)
|
for (; cnt < 79; ++cnt)
|
||||||
|
@ -229,16 +244,21 @@ makemsg(fname)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(fp, "%79s\r\n", " ");
|
fprintf(fp, "%79s\r\n", " ");
|
||||||
|
|
||||||
|
free(lbuf);
|
||||||
rewind(fp);
|
rewind(fp);
|
||||||
|
|
||||||
if (fstat(fd, &sbuf))
|
if (fstat(fd, &sbuf))
|
||||||
err(EXIT_FAILURE, _("fstat failed"));
|
err(EXIT_FAILURE, _("fstat failed"));
|
||||||
|
|
||||||
mbufsize = sbuf.st_size;
|
mbufsize = sbuf.st_size;
|
||||||
|
memcpy(mainmbufsize, &mbufsize, sizeof(size_t));
|
||||||
mbuf = xmalloc(mbufsize);
|
mbuf = xmalloc(mbufsize);
|
||||||
|
|
||||||
if (fread(mbuf, sizeof(*mbuf), mbufsize, fp) != mbufsize)
|
if (fread(mbuf, sizeof(*mbuf), mbufsize, fp) != mbufsize)
|
||||||
err(EXIT_FAILURE, _("fread failed"));
|
err(EXIT_FAILURE, _("fread failed"));
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
|
fclose(fp);
|
||||||
|
return(mbuf);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue