1032624d5Sbasabi /*
2d1419d5aSNobutomo Nakano * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
3032624d5Sbasabi * Use is subject to license terms.
4*48bbca81SDaniel Hoffman * Copyright (c) 2016 by Delphix. All rights reserved.
5032624d5Sbasabi */
6032624d5Sbasabi
77c478bd9Sstevel@tonic-gate /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
87c478bd9Sstevel@tonic-gate /* All Rights Reserved */
97c478bd9Sstevel@tonic-gate
107c478bd9Sstevel@tonic-gate
117c478bd9Sstevel@tonic-gate /*
127c478bd9Sstevel@tonic-gate * Copyright (c) 1983 Regents of the University of California.
137c478bd9Sstevel@tonic-gate * All rights reserved. The Berkeley software License Agreement
147c478bd9Sstevel@tonic-gate * specifies the terms and conditions for redistribution.
157c478bd9Sstevel@tonic-gate */
167c478bd9Sstevel@tonic-gate
177c478bd9Sstevel@tonic-gate /*
187c478bd9Sstevel@tonic-gate * synopsis: atrm [-f] [-i] [-a] [[job #] [user] ...]
197c478bd9Sstevel@tonic-gate *
207c478bd9Sstevel@tonic-gate *
217c478bd9Sstevel@tonic-gate * Remove "at" jobs.
227c478bd9Sstevel@tonic-gate */
237c478bd9Sstevel@tonic-gate
247c478bd9Sstevel@tonic-gate #include <stdio.h>
257c478bd9Sstevel@tonic-gate #include <pwd.h>
267c478bd9Sstevel@tonic-gate #include <ctype.h>
277c478bd9Sstevel@tonic-gate #include <sys/types.h>
287c478bd9Sstevel@tonic-gate #include <dirent.h>
297c478bd9Sstevel@tonic-gate #include <sys/file.h>
307c478bd9Sstevel@tonic-gate #include <sys/stat.h>
317c478bd9Sstevel@tonic-gate #include <errno.h>
327c478bd9Sstevel@tonic-gate #include <unistd.h>
337c478bd9Sstevel@tonic-gate #include <locale.h>
34032624d5Sbasabi #include <strings.h>
353d63ea05Sas #include <stdlib.h>
363d63ea05Sas #include <libintl.h>
377c478bd9Sstevel@tonic-gate #include "cron.h"
383d63ea05Sas #include "getresponse.h"
397c478bd9Sstevel@tonic-gate
407c478bd9Sstevel@tonic-gate extern time_t num();
417c478bd9Sstevel@tonic-gate extern char *errmsg();
423d63ea05Sas extern void audit_at_delete(char *, char *, int);
437c478bd9Sstevel@tonic-gate
44032624d5Sbasabi #define SUPERUSER 0 /* is user super-user? */
45032624d5Sbasabi #define CANTCD "can't change directory to the at directory"
46032624d5Sbasabi #define NOREADDIR "can't read the at directory"
477c478bd9Sstevel@tonic-gate
487c478bd9Sstevel@tonic-gate uid_t user; /* person requesting removal */
497c478bd9Sstevel@tonic-gate int fflag = 0; /* suppress announcements? */
507c478bd9Sstevel@tonic-gate int iflag = 0; /* run interactively? */
517c478bd9Sstevel@tonic-gate
527c478bd9Sstevel@tonic-gate char login[UNAMESIZE];
537c478bd9Sstevel@tonic-gate char login_authchk[UNAMESIZE]; /* used for authorization checks */
547c478bd9Sstevel@tonic-gate
55032624d5Sbasabi #define INVALIDUSER "you are not a valid user (no entry in /etc/passwd)"
56032624d5Sbasabi #define NOTALLOWED "you are not authorized to use at. Sorry."
577c478bd9Sstevel@tonic-gate #define NAMETOOLONG "login name too long"
587c478bd9Sstevel@tonic-gate
59032624d5Sbasabi static void usage(void);
60032624d5Sbasabi static void atabortperror(char *msg);
61032624d5Sbasabi static void atabort(char *msg);
62032624d5Sbasabi static void atperror(char *msg);
63032624d5Sbasabi static void atperror2(char *msg, char *name);
64032624d5Sbasabi static void aterror(char *msg);
65032624d5Sbasabi static void powner(char *file);
667c478bd9Sstevel@tonic-gate
673d63ea05Sas int getjoblist(struct dirent ***, struct stat ***, int (*)());
683d63ea05Sas int removentry(char *, struct stat *, uid_t);
693d63ea05Sas
70032624d5Sbasabi int
main(int argc,char ** argv)71032624d5Sbasabi main(int argc, char **argv)
727c478bd9Sstevel@tonic-gate {
737c478bd9Sstevel@tonic-gate int i; /* for loop index */
747c478bd9Sstevel@tonic-gate int numjobs; /* # of jobs in spooling area */
757c478bd9Sstevel@tonic-gate int allflag = 0; /* remove all jobs belonging to user? */
767c478bd9Sstevel@tonic-gate int jobexists; /* does a requested job exist? */
777c478bd9Sstevel@tonic-gate char *pp;
787c478bd9Sstevel@tonic-gate struct dirent **namelist; /* names of jobs in spooling area */
797c478bd9Sstevel@tonic-gate struct stat **statlist;
807c478bd9Sstevel@tonic-gate struct passwd *pwd;
817c478bd9Sstevel@tonic-gate
827c478bd9Sstevel@tonic-gate /*
837c478bd9Sstevel@tonic-gate * If job number, user name, or "-" is not specified, just print
847c478bd9Sstevel@tonic-gate * usage info and exit.
857c478bd9Sstevel@tonic-gate */
86032624d5Sbasabi (void) setlocale(LC_ALL, "");
873d63ea05Sas (void) textdomain(TEXT_DOMAIN);
887c478bd9Sstevel@tonic-gate if (argc < 2)
897c478bd9Sstevel@tonic-gate usage();
907c478bd9Sstevel@tonic-gate
917c478bd9Sstevel@tonic-gate --argc; ++argv;
927c478bd9Sstevel@tonic-gate
93032624d5Sbasabi pp = getuser((user = getuid()));
947c478bd9Sstevel@tonic-gate if (pp == NULL)
957c478bd9Sstevel@tonic-gate atabort(INVALIDUSER);
967c478bd9Sstevel@tonic-gate if (strlcpy(login, pp, sizeof (login)) >= sizeof (login))
977c478bd9Sstevel@tonic-gate atabort(NAMETOOLONG);
987c478bd9Sstevel@tonic-gate if (strlcpy(login_authchk, pp, sizeof (login_authchk))
997c478bd9Sstevel@tonic-gate >= sizeof (NAMETOOLONG))
1007c478bd9Sstevel@tonic-gate atabort(INVALIDUSER);
1017c478bd9Sstevel@tonic-gate if (!allowed(login, ATALLOW, ATDENY))
1027c478bd9Sstevel@tonic-gate atabort(NOTALLOWED);
1037c478bd9Sstevel@tonic-gate
1047c478bd9Sstevel@tonic-gate /*
1057c478bd9Sstevel@tonic-gate * Process command line flags.
1067c478bd9Sstevel@tonic-gate * Special case the "-" option so that others may be grouped.
1077c478bd9Sstevel@tonic-gate */
1087c478bd9Sstevel@tonic-gate while (argc > 0 && **argv == '-') {
1097c478bd9Sstevel@tonic-gate *(*argv)++;
110032624d5Sbasabi while (**argv) {
111032624d5Sbasabi switch (*(*argv)++) {
1127c478bd9Sstevel@tonic-gate
1137c478bd9Sstevel@tonic-gate case 'a': ++allflag;
1147c478bd9Sstevel@tonic-gate break;
1157c478bd9Sstevel@tonic-gate
1167c478bd9Sstevel@tonic-gate case 'f': ++fflag;
1177c478bd9Sstevel@tonic-gate break;
1187c478bd9Sstevel@tonic-gate
1197c478bd9Sstevel@tonic-gate case 'i': ++iflag;
1207c478bd9Sstevel@tonic-gate break;
1217c478bd9Sstevel@tonic-gate
1227c478bd9Sstevel@tonic-gate default: usage();
123032624d5Sbasabi }
1247c478bd9Sstevel@tonic-gate }
1257c478bd9Sstevel@tonic-gate ++argv; --argc;
1267c478bd9Sstevel@tonic-gate }
1277c478bd9Sstevel@tonic-gate
1287c478bd9Sstevel@tonic-gate /*
129032624d5Sbasabi * If all jobs are to be removed and extra command line arguments
1307c478bd9Sstevel@tonic-gate * are given, print usage info and exit.
1317c478bd9Sstevel@tonic-gate */
132032624d5Sbasabi if (allflag && argc)
1337c478bd9Sstevel@tonic-gate usage();
1347c478bd9Sstevel@tonic-gate
1357c478bd9Sstevel@tonic-gate /*
1367c478bd9Sstevel@tonic-gate * If only certain jobs are to be removed and no job #'s or user
1377c478bd9Sstevel@tonic-gate * names are specified, print usage info and exit.
1387c478bd9Sstevel@tonic-gate */
139032624d5Sbasabi if (!allflag && !argc)
1407c478bd9Sstevel@tonic-gate usage();
1417c478bd9Sstevel@tonic-gate
1427c478bd9Sstevel@tonic-gate /*
1437c478bd9Sstevel@tonic-gate * If interactive removal and quiet removal are requested, override
1447c478bd9Sstevel@tonic-gate * quiet removal and run interactively.
1457c478bd9Sstevel@tonic-gate */
1467c478bd9Sstevel@tonic-gate if (iflag && fflag)
1477c478bd9Sstevel@tonic-gate fflag = 0;
1487c478bd9Sstevel@tonic-gate
1497c478bd9Sstevel@tonic-gate
1507c478bd9Sstevel@tonic-gate /*
1517c478bd9Sstevel@tonic-gate * Move to spooling directory and get a list of the files in the
1527c478bd9Sstevel@tonic-gate * spooling area.
1537c478bd9Sstevel@tonic-gate */
154032624d5Sbasabi numjobs = getjoblist(&namelist, &statlist, strcmp);
1557c478bd9Sstevel@tonic-gate /*
1567c478bd9Sstevel@tonic-gate * If all jobs belonging to the user are to be removed, compare
1577c478bd9Sstevel@tonic-gate * the user's id to the owner of the file. If they match, remove
1587c478bd9Sstevel@tonic-gate * the file. If the user is the super-user, don't bother comparing
1597c478bd9Sstevel@tonic-gate * the id's. After all files are removed, exit (status 0).
1607c478bd9Sstevel@tonic-gate */
1617c478bd9Sstevel@tonic-gate if (allflag) {
162032624d5Sbasabi for (i = 0; i < numjobs; ++i) {
163d1419d5aSNobutomo Nakano if (cron_admin(login_authchk) ||
1647c478bd9Sstevel@tonic-gate user == statlist[i]->st_uid)
1657c478bd9Sstevel@tonic-gate (void) removentry(namelist[i]->d_name,
1667c478bd9Sstevel@tonic-gate statlist[i], user);
1677c478bd9Sstevel@tonic-gate }
1687c478bd9Sstevel@tonic-gate exit(0);
1697c478bd9Sstevel@tonic-gate }
1707c478bd9Sstevel@tonic-gate
1717c478bd9Sstevel@tonic-gate /*
1727c478bd9Sstevel@tonic-gate * If only certain jobs are to be removed, interpret each command
1737c478bd9Sstevel@tonic-gate * line argument. A check is done to see if it is a user's name or
1747c478bd9Sstevel@tonic-gate * a job number (inode #). If it's a user's name, compare the argument
1757c478bd9Sstevel@tonic-gate * to the files owner. If it's a job number, compare the argument to
176032624d5Sbasabi * the file name. In either case, if a match occurs, try to
1777c478bd9Sstevel@tonic-gate * remove the file.
1787c478bd9Sstevel@tonic-gate */
1797c478bd9Sstevel@tonic-gate
1807c478bd9Sstevel@tonic-gate while (argc--) {
1817c478bd9Sstevel@tonic-gate jobexists = 0;
1827c478bd9Sstevel@tonic-gate for (i = 0; i < numjobs; ++i) {
1837c478bd9Sstevel@tonic-gate
1847c478bd9Sstevel@tonic-gate /* if the inode number is 0, this entry was removed */
1857c478bd9Sstevel@tonic-gate if (statlist[i]->st_ino == 0)
1867c478bd9Sstevel@tonic-gate continue;
1877c478bd9Sstevel@tonic-gate
188032624d5Sbasabi /*
189*48bbca81SDaniel Hoffman * if argv is a username, compare their uid to
1907c478bd9Sstevel@tonic-gate * the uid of the owner of the file......
1917c478bd9Sstevel@tonic-gate */
1927c478bd9Sstevel@tonic-gate if (pwd = getpwnam(*argv)) {
1937c478bd9Sstevel@tonic-gate if (statlist[i]->st_uid != pwd->pw_uid)
1947c478bd9Sstevel@tonic-gate continue;
1957c478bd9Sstevel@tonic-gate /*
1967c478bd9Sstevel@tonic-gate * otherwise, we assume that the argv is a job # and
1977c478bd9Sstevel@tonic-gate * thus compare argv to the file name.
1987c478bd9Sstevel@tonic-gate */
1997c478bd9Sstevel@tonic-gate } else {
200032624d5Sbasabi if (strcmp(namelist[i]->d_name, *argv))
2017c478bd9Sstevel@tonic-gate continue;
2027c478bd9Sstevel@tonic-gate }
2037c478bd9Sstevel@tonic-gate ++jobexists;
2047c478bd9Sstevel@tonic-gate /*
2057c478bd9Sstevel@tonic-gate * if the entry is ultimately removed, don't
2067c478bd9Sstevel@tonic-gate * try to remove it again later.
2077c478bd9Sstevel@tonic-gate */
208032624d5Sbasabi if (removentry(namelist[i]->d_name, statlist[i],
209032624d5Sbasabi user)) {
2107c478bd9Sstevel@tonic-gate statlist[i]->st_ino = 0;
2117c478bd9Sstevel@tonic-gate }
2127c478bd9Sstevel@tonic-gate }
2137c478bd9Sstevel@tonic-gate
2147c478bd9Sstevel@tonic-gate /*
2157c478bd9Sstevel@tonic-gate * If a requested argument doesn't exist, print a message.
2167c478bd9Sstevel@tonic-gate */
2177c478bd9Sstevel@tonic-gate if (!jobexists && !fflag) {
218032624d5Sbasabi fprintf(stderr, "atrm: %s: no such job number\n",
219032624d5Sbasabi *argv);
2207c478bd9Sstevel@tonic-gate }
2217c478bd9Sstevel@tonic-gate ++argv;
2227c478bd9Sstevel@tonic-gate }
223032624d5Sbasabi return (0);
2247c478bd9Sstevel@tonic-gate }
2257c478bd9Sstevel@tonic-gate
2267c478bd9Sstevel@tonic-gate /*
2277c478bd9Sstevel@tonic-gate * Print usage info and exit.
2287c478bd9Sstevel@tonic-gate */
229032624d5Sbasabi static void
usage(void)230032624d5Sbasabi usage(void)
2317c478bd9Sstevel@tonic-gate {
232032624d5Sbasabi fprintf(stderr, "usage: atrm [-f] [-i] [-a] [[job #] [user] ...]\n");
2337c478bd9Sstevel@tonic-gate exit(1);
2347c478bd9Sstevel@tonic-gate }
2357c478bd9Sstevel@tonic-gate
2367c478bd9Sstevel@tonic-gate
2377c478bd9Sstevel@tonic-gate /*
2387c478bd9Sstevel@tonic-gate * Remove an entry from the queue. The access of the file is checked for
2397c478bd9Sstevel@tonic-gate * write permission (since all jobs are mode 644). If access is granted,
2407c478bd9Sstevel@tonic-gate * unlink the file. If the fflag (suppress announcements) is not set,
2417c478bd9Sstevel@tonic-gate * print the job number that we are removing and the result of the access
242032624d5Sbasabi * check (either "permission denied" or "removed"). If we are running
243032624d5Sbasabi * interactively (iflag), prompt the user before we unlink the file. If
244*48bbca81SDaniel Hoffman * the super-user is removing jobs, inform them who owns each file before
2457c478bd9Sstevel@tonic-gate * it is removed. Return TRUE if file removed, else FALSE.
2467c478bd9Sstevel@tonic-gate */
2477c478bd9Sstevel@tonic-gate int
removentry(char * filename,struct stat * statptr,uid_t user)248032624d5Sbasabi removentry(char *filename, struct stat *statptr, uid_t user)
2497c478bd9Sstevel@tonic-gate {
2507c478bd9Sstevel@tonic-gate struct passwd *pwd;
2517c478bd9Sstevel@tonic-gate char *pp;
2527c478bd9Sstevel@tonic-gate int r;
2537c478bd9Sstevel@tonic-gate
2543d63ea05Sas if (init_yes() < 0) {
2553d63ea05Sas (void) fprintf(stderr, gettext(ERR_MSG_INIT_YES),
2563d63ea05Sas strerror(errno));
2573d63ea05Sas exit(1);
2583d63ea05Sas }
2593d63ea05Sas
2607c478bd9Sstevel@tonic-gate if (!fflag)
261032624d5Sbasabi printf("%s: ", filename);
2627c478bd9Sstevel@tonic-gate
263d1419d5aSNobutomo Nakano if (user != statptr->st_uid && !cron_admin(login_authchk)) {
2647c478bd9Sstevel@tonic-gate
2657c478bd9Sstevel@tonic-gate if (!fflag) {
2667c478bd9Sstevel@tonic-gate printf("permission denied\n");
2677c478bd9Sstevel@tonic-gate }
2687c478bd9Sstevel@tonic-gate return (0);
2697c478bd9Sstevel@tonic-gate
2707c478bd9Sstevel@tonic-gate } else {
2717c478bd9Sstevel@tonic-gate if (iflag) {
272d1419d5aSNobutomo Nakano if (cron_admin(login_authchk)) {
2737c478bd9Sstevel@tonic-gate printf("\t(owned by ");
2747c478bd9Sstevel@tonic-gate powner(filename);
2757c478bd9Sstevel@tonic-gate printf(") ");
2767c478bd9Sstevel@tonic-gate }
2773d63ea05Sas printf(gettext("remove it? "));
2783d63ea05Sas if (yes() == 0)
2797c478bd9Sstevel@tonic-gate return (0);
2807c478bd9Sstevel@tonic-gate }
2817c478bd9Sstevel@tonic-gate
282d1419d5aSNobutomo Nakano if (cron_admin(login_authchk)) {
283032624d5Sbasabi pp = getuser((uid_t)statptr->st_uid);
2847c478bd9Sstevel@tonic-gate if (pp == NULL)
2857c478bd9Sstevel@tonic-gate atabort(INVALIDUSER);
2867c478bd9Sstevel@tonic-gate if (strlcpy(login, pp, sizeof (login)) >=
2877c478bd9Sstevel@tonic-gate sizeof (login))
2887c478bd9Sstevel@tonic-gate atabort(NAMETOOLONG);
2897c478bd9Sstevel@tonic-gate }
290032624d5Sbasabi cron_sendmsg(DELETE, login, filename, AT);
2917c478bd9Sstevel@tonic-gate if ((r = unlink(filename)) < 0) {
2927c478bd9Sstevel@tonic-gate if (!fflag) {
2937c478bd9Sstevel@tonic-gate fputs("could not remove\n", stdout);
2947c478bd9Sstevel@tonic-gate (void) fprintf(stderr, "atrm: %s: %s\n",
2957c478bd9Sstevel@tonic-gate filename, errmsg(errno));
2967c478bd9Sstevel@tonic-gate }
2977c478bd9Sstevel@tonic-gate audit_at_delete(filename, NULL, r);
2987c478bd9Sstevel@tonic-gate return (0);
2997c478bd9Sstevel@tonic-gate }
3007c478bd9Sstevel@tonic-gate audit_at_delete(filename, NULL, r);
3017c478bd9Sstevel@tonic-gate if (!fflag && !iflag)
3027c478bd9Sstevel@tonic-gate printf("removed\n");
3037c478bd9Sstevel@tonic-gate return (1);
3047c478bd9Sstevel@tonic-gate }
3057c478bd9Sstevel@tonic-gate }
3067c478bd9Sstevel@tonic-gate
3077c478bd9Sstevel@tonic-gate /*
3087c478bd9Sstevel@tonic-gate * Print the owner of the job. This is the owner of the spoolfile.
3097c478bd9Sstevel@tonic-gate * If we run into trouble getting the name, we'll just print "???".
3107c478bd9Sstevel@tonic-gate */
311032624d5Sbasabi static void
powner(char * file)312032624d5Sbasabi powner(char *file)
3137c478bd9Sstevel@tonic-gate {
3147c478bd9Sstevel@tonic-gate struct stat statb;
3157c478bd9Sstevel@tonic-gate char *getname();
3167c478bd9Sstevel@tonic-gate
317032624d5Sbasabi if (stat(file, &statb) < 0) {
318032624d5Sbasabi printf("%s", "???");
319032624d5Sbasabi (void) fprintf(stderr, "atrm: Couldn't stat spoolfile %s: %s\n",
3207c478bd9Sstevel@tonic-gate file, errmsg(errno));
321032624d5Sbasabi return;
3227c478bd9Sstevel@tonic-gate }
3237c478bd9Sstevel@tonic-gate
324032624d5Sbasabi printf("%s", getname(statb.st_uid));
3257c478bd9Sstevel@tonic-gate }
3267c478bd9Sstevel@tonic-gate
3277c478bd9Sstevel@tonic-gate
3287c478bd9Sstevel@tonic-gate int
getjoblist(struct dirent *** namelistp,struct stat *** statlistp,int (* sortfunc)())329032624d5Sbasabi getjoblist(struct dirent ***namelistp, struct stat ***statlistp,
330032624d5Sbasabi int (*sortfunc)())
3317c478bd9Sstevel@tonic-gate {
332032624d5Sbasabi int numjobs;
333032624d5Sbasabi struct dirent **namelist;
334032624d5Sbasabi int i;
335032624d5Sbasabi struct stat *statptr; /* pointer to file stat structure */
336032624d5Sbasabi struct stat **statlist;
3377c478bd9Sstevel@tonic-gate extern int filewanted(); /* should a file be listed in queue? */
3387c478bd9Sstevel@tonic-gate if (chdir(ATDIR) < 0)
3397c478bd9Sstevel@tonic-gate atabortperror(CANTCD);
3407c478bd9Sstevel@tonic-gate
3417c478bd9Sstevel@tonic-gate /*
3427c478bd9Sstevel@tonic-gate * Get a list of the files in the spooling area.
3437c478bd9Sstevel@tonic-gate */
3442b52f2afSjk if ((numjobs = scandir(".", namelistp, filewanted, sortfunc)) < 0)
3457c478bd9Sstevel@tonic-gate atabortperror(NOREADDIR);
3467c478bd9Sstevel@tonic-gate
347032624d5Sbasabi if ((statlist =
348032624d5Sbasabi (struct stat **)malloc(numjobs * sizeof (struct stat ***)))
349032624d5Sbasabi == NULL)
3507c478bd9Sstevel@tonic-gate atabort("Out of memory");
3517c478bd9Sstevel@tonic-gate
3527c478bd9Sstevel@tonic-gate namelist = *namelistp;
3537c478bd9Sstevel@tonic-gate
3547c478bd9Sstevel@tonic-gate /*
3557c478bd9Sstevel@tonic-gate * Build an array of pointers to the file stats for all jobs in
3567c478bd9Sstevel@tonic-gate * the spooling area.
3577c478bd9Sstevel@tonic-gate */
358032624d5Sbasabi for (i = 0; i < numjobs; ++i) {
359032624d5Sbasabi statptr = (struct stat *)malloc(sizeof (struct stat));
3607c478bd9Sstevel@tonic-gate if (statptr == NULL)
3617c478bd9Sstevel@tonic-gate atabort("Out of memory");
3627c478bd9Sstevel@tonic-gate if (stat(namelist[i]->d_name, statptr) < 0) {
363032624d5Sbasabi atperror2("Can't stat", namelist[i]->d_name);
3647c478bd9Sstevel@tonic-gate continue;
3657c478bd9Sstevel@tonic-gate }
3667c478bd9Sstevel@tonic-gate statlist[i] = statptr;
3677c478bd9Sstevel@tonic-gate }
3687c478bd9Sstevel@tonic-gate
3697c478bd9Sstevel@tonic-gate *statlistp = statlist;
3707c478bd9Sstevel@tonic-gate return (numjobs);
3717c478bd9Sstevel@tonic-gate }
3727c478bd9Sstevel@tonic-gate
3737c478bd9Sstevel@tonic-gate /*
374*48bbca81SDaniel Hoffman * Get the full login name of a person using their user id.
3757c478bd9Sstevel@tonic-gate */
3767c478bd9Sstevel@tonic-gate char *
getname(uid_t uid)377032624d5Sbasabi getname(uid_t uid)
3787c478bd9Sstevel@tonic-gate {
379032624d5Sbasabi struct passwd *pwdinfo; /* password info structure */
3807c478bd9Sstevel@tonic-gate
3817c478bd9Sstevel@tonic-gate
3827c478bd9Sstevel@tonic-gate if ((pwdinfo = getpwuid(uid)) == 0)
383032624d5Sbasabi return ("???");
384032624d5Sbasabi return (pwdinfo->pw_name);
385032624d5Sbasabi }
386032624d5Sbasabi
387032624d5Sbasabi static void
aterror(char * msg)388032624d5Sbasabi aterror(char *msg)
389032624d5Sbasabi {
390032624d5Sbasabi fprintf(stderr, "atrm: %s\n", msg);
3917c478bd9Sstevel@tonic-gate }
3927c478bd9Sstevel@tonic-gate
393032624d5Sbasabi static void
atperror(char * msg)394032624d5Sbasabi atperror(char *msg)
3957c478bd9Sstevel@tonic-gate {
396032624d5Sbasabi fprintf(stderr, "atrm: %s: %s\n", msg, errmsg(errno));
3977c478bd9Sstevel@tonic-gate }
3987c478bd9Sstevel@tonic-gate
399032624d5Sbasabi static void
atperror2(char * msg,char * name)400032624d5Sbasabi atperror2(char *msg, char *name)
4017c478bd9Sstevel@tonic-gate {
402032624d5Sbasabi fprintf(stderr, "atrm: %s %s: %s\n", msg, name, errmsg(errno));
4037c478bd9Sstevel@tonic-gate }
4047c478bd9Sstevel@tonic-gate
405032624d5Sbasabi static void
atabort(char * msg)406032624d5Sbasabi atabort(char *msg)
4077c478bd9Sstevel@tonic-gate {
4087c478bd9Sstevel@tonic-gate aterror(msg);
4097c478bd9Sstevel@tonic-gate exit(1);
4107c478bd9Sstevel@tonic-gate }
4117c478bd9Sstevel@tonic-gate
412032624d5Sbasabi static void
atabortperror(char * msg)413032624d5Sbasabi atabortperror(char *msg)
4147c478bd9Sstevel@tonic-gate {
4157c478bd9Sstevel@tonic-gate atperror(msg);
4167c478bd9Sstevel@tonic-gate exit(1);
4177c478bd9Sstevel@tonic-gate }
418