v13i075: List jobs in at queue for 4.3BSD
Rich Salz
rsalz at bbn.com
Wed Mar 2 10:01:33 AEST 1988
Submitted-by: Roger Southwick <dadla.TEK.COM!rogers>
Posting-number: Volume 13, Issue 75
Archive-name: atl
[ Short program that fills a gap nicely. --r$ ]
Upon getting 4.3BSD, we found the Berkeley had come up with a nice new
version of 'at', which allowed listing the queue and job removal. One
thing was missing, a way for the user to examine their job in the queue.
Well here it is. I call it 'atl'.
-Roger (rogers at dadla.tek.com)
# This is a shell archive. Remove anything before this line, then
# unpack it by saving it in a file and typing "sh file". (Files
# unpacked will be owned by you and have default permissions.)
#
# This archive contains:
# Makefile atl.1 atl.c
echo x - Makefile
cat > "Makefile" << '//E*O*F Makefile//'
BINDIR = /usr/local
MANDIR = /usr/manl/man1
atl : atl.c
cc -O -s -o atl atl.c
install : $(BINDIR)/atl $(MANDIR)/atl.1
$(BINDIR)/atl : atl
install -c -o daemon -g daemon -m 4711 atl $(BINDIR)
$(MANDIR)/atl.1 : atl.1
install -c -o daemon -g daemon -m 0644 atl.1 $(MANDIR)
clean :
rm -f atl
//E*O*F Makefile//
echo x - atl.1
cat > "atl.1" << '//E*O*F atl.1//'
.TH ATL 1 "Local"
.SH NAME
atl - list a job waiting to be run
.SH SYNOPSIS
.B "atl job#
[ job# ... ]
.SH DESCRIPTION
.I Atl
lists on stdout the contents of the
.I job#
which is waiting to be run at a later date. These jobs were
created with the
.IR at (1)
command. To obtain the needed
.I job#,
the user should use the
.IR atq (1)
command.
.PP
Only the job's owner (or root) may list the contents of the
job.
.SH BUGS
To be discovered.
.SH FILES
/usr/spool/at spool area
.SH AUTHOR
Roger Southwick (rogers at dadla.TEK.COM)
.SH "SEE ALSO"
at(1),
atq(1),
atrm(1),
cron(8)
//E*O*F atl.1//
echo x - atl.c
cat > "atl.c" << '//E*O*F atl.c//'
/*-------------------------------------------------------------
The atl program
By: Roger S. Southwick
April 21, 1986
This program lists the jobs in the /usr/spool/at
directory which belong to him.
usage: atl job# [job#....]
The job# is the job number reported by atq.
(This turns out to be the inode number of the file, but
we don't tell the user that!)
---------------------------------------------------------------
*
* MODIFICATION HISTORY:
*
* $Log: atl.c,v $
* Revision 1.2 86/04/21 16:45:36 rogers
* Fixed so that the user may be su'ed to
* the file's owner. (Definable).
*
* Revision 1.1 86/04/21 15:15:21 rogers
* Initial revision
*
*
-------------------------------------------------------------*/
#ifndef lint
static char *RCSid = "$Header: atl.c,v 1.2 86/04/21 16:45:36 rogers Exp $";
#endif
#define ATDIR "/usr/spool/at"
/*
* Define STRICT if you require the user to be logged in
* Without this, being su'ed will work.
*/
/* #define STRICT /* Strict login required */
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/dir.h>
#include <pwd.h>
#include <ctype.h>
extern char *sys_errlist[];
extern int errno;
#define ERROR sys_errlist[errno]
char *myname = NULL;
FILE *fp = NULL;
main(argc, argv)
int argc;
char *argv[];
{
DIR *opendir();
struct direct *readdir();
int chdir(), stat(), sscanf();
register DIR *dirp;
register struct direct *dp;
register int i;
int job;
struct stat stb;
if(chdir(ATDIR) == -1){
(void)fprintf(stderr,"atl: could not chdir %s - %s\n", ATDIR, ERROR);
exit(1);
}
if(argc < 2){
(void)fprintf(stderr, "usage: atl job# [job#....]\n");
exit(1);
}
whoami();
if((dirp = opendir(".")) == NULL){
(void)fprintf(stderr,"atl: could not opendir(%s)\n", ATDIR);
exit(1);
}
for(dp = readdir(dirp); dp != NULL; dp = readdir(dirp)){
if(dp->d_ino == 0)
continue;
if(strcmp(".", dp->d_name) == 0 || strcmp("..", dp->d_name) == 0)
continue;
if(!isdigit(dp->d_name[0]))
continue;
if(stat(dp->d_name, &stb) == -1){
(void)fprintf(stderr,"atl: could not stat %s/%s - %s\n", ATDIR, dp->d_name, ERROR);
exit(1);
}
if((stb.st_mode & S_IFMT) != S_IFREG)
continue;
for(i = 1; i < argc; i++){
if(sscanf(argv[i], "%d", &job) != 1){
(void)fprintf(stderr,"atl: job number (%s) must be numeric\n", argv[i]);
continue;
}
if(job < 0){
(void)fprintf(stderr,"atl: job number (%d) must be positive\n", job);
continue;
}
if(job != stb.st_ino)
continue;
if(notowner(dp->d_name)){
(void)fprintf(stderr, "atl: must be job's owner\n");
continue;
}
if(argc > 2)
(void)printf("\n>>>>>> Job # %d <<<<<<\n", job);
output();
}
}
exit(0);
}
int myuid;
whoami()
{
#ifdef STRICT
char *getlogin();
#endif
int getuid();
struct passwd *getpwuid();
register struct passwd *pwd;
extern char *myname;
extern int myuid;
myuid = getuid();
#ifdef STRICT
if((myname = getlogin()) == NULL){
if((pwd = getpwuid(myuid)) == NULL){
(void)fprintf(stderr, "atl: Say, who are you, anyway?\n");
exit(1);
}
myname = pwd->pw_name;
}
#else
if((pwd = getpwuid(myuid)) == NULL){
(void)fprintf(stderr, "atl: Say, who are you, anyway?\n");
exit(1);
}
myname = pwd->pw_name;
#endif
}
char owner[80];
int
notowner(name)
register char *name;
{
FILE *fopen();
int fscanf();
extern char *myname;
extern FILE *fp;
extern char owner[];
extern myuid;
if((fp = fopen(name, "r")) == NULL){
(void)fprintf(stderr,"atl: could not open %s/%s for read\n", ATDIR, name);
exit(1);
}
if(fscanf(fp, "# owner: %s\n", owner) != 1){
(void)fprintf(stderr,"atl: unknown owner %s/%s\n", ATDIR, name);
return(1);
}
if(myuid == 0)
return(0);
if(strcmp(owner, myname) != 0){
(void)fclose(fp);
fp = NULL;
return(1);
}
return(0);
}
output()
{
char *fgets();
extern FILE *fp;
extern int myuid;
extern char owner[];
char buf[BUFSIZ];
if(myuid == 0)
(void)printf("# owner: %s\n", owner);
while(fgets(buf, BUFSIZ, fp) != NULL)
(void)fputs(buf, stdout);
(void)fclose(fp);
}
//E*O*F atl.c//
echo Possible errors detected by \'wc\' [hopefully none]:
temp=/tmp/shar$$
trap "rm -f $temp; exit" 0 1 2 3 15
cat > $temp <<\!!!
17 50 298 Makefile
32 108 573 atl.1
222 526 4262 atl.c
271 684 5133 total
!!!
wc Makefile atl.1 atl.c | sed 's=[^ ]*/==' | diff -b $temp -
exit 0
--
For comp.sources.unix stuff, mail to rsalz at uunet.uu.net.
More information about the Comp.sources.unix
mailing list