File at-3.1.13-joblist.patch of Package at

Index: at.c
===================================================================
--- at.c.orig
+++ at.c
@@ -132,11 +132,13 @@ char atverify = 0;		/* verify time inste
 
 static void sigc(int signo);
 static void alarmc(int signo);
 static char *cwdname(void);
 static void writefile(time_t runtimer, char queue);
-static void list_jobs(void);
+static void list_jobs(long *, int);
+static int in_job_list(long, long *, int);
+static long *get_job_list(int, char *[], int *);
 
 /* Signal catching functions */
 
 static RETSIGTYPE 
 sigc(int signo)
@@ -545,12 +547,24 @@ writefile(time_t runtimer, char queue)
 	break;
     }
     return;
 }
 
+static int
+in_job_list(long job, long *joblist, int len)
+{
+    int i;
+
+    for (i = 0; i < len; i++)
+        if (job == joblist[i])
+            return 1;
+
+    return 0;
+}
+
 static void
-list_jobs(void)
+list_jobs(long *joblist, int len)
 {
     /* List all a user's jobs in the queue, by looping through ATJOB_DIR, 
      * or everybody's if we are root
      */
     DIR *spool;
@@ -585,10 +599,14 @@ list_jobs(void)
 	    continue;
 
 	if (sscanf(dirent->d_name, "%c%5lx%8lx", &queue, &jobno, &ctm) != 3)
 	    continue;
 
+	/* If jobs are given, only list those jobs */
+	if (joblist && !in_job_list(jobno, joblist, len))
+	    continue;
+
 	if (atqueue && (queue != atqueue))
 	    continue;
 
 	runtimer = 60 * (time_t) ctm;
 	runtime = localtime(&runtimer);
@@ -706,10 +724,33 @@ process_jobs(int argc, char **argv, int
 	}
     }
     return rc;
 }				/* delete_jobs */
 
+static long *
+get_job_list(int argc, char *argv[], int *joblen)
+{
+    int i, len;
+    long *joblist;
+    char *ep;
+
+    joblist = NULL;
+    len = argc;
+    if (len > 0) {
+	joblist = (long *) mymalloc(len * sizeof(*joblist));
+	for (i = 0; i < argc; i++) {
+	    errno = 0;
+	    if ((joblist[i] = strtol(argv[i], &ep, 10)) < 0 ||
+		ep == argv[i] || *ep != '\0' || errno)
+		panic("invalid job number");
+        }
+    }
+
+    *joblen = len;
+    return joblist;
+}
+
 /* Global functions */
 
 void *
 mymalloc(size_t n)
 {
@@ -731,10 +772,12 @@ main(int argc, char **argv)
 
     int program = AT;		/* our default program */
     char *options = "q:f:MmvlrdhVct:";	/* default options for at */
     int disp_version = 0;
     time_t timer = 0;
+    long *joblist = NULL;
+    int joblen = 0;
     struct passwd *pwe;
     struct group *ge;
 
     RELINQUISH_PRIVS
 
@@ -868,12 +911,13 @@ main(int argc, char **argv)
     switch (program) {
 	int i;
     case ATQ:
 
 	REDUCE_PRIV(daemon_uid, daemon_gid)
-
-	    list_jobs();
+	    if (queue_set == 0)
+		joblist = get_job_list(argc - optind, argv + optind, &joblen);
+	    list_jobs(joblist, joblen);
 	break;
 
     case ATRM:
 
 	REDUCE_PRIV(daemon_uid, daemon_gid)
Index: panic.c
===================================================================
--- panic.c.orig
+++ panic.c
@@ -93,10 +93,11 @@ usage(void)
 /* Print usage and exit.
  */
     fprintf(stderr, "Usage: at [-V] [-q x] [-f file] [-mlbv] timespec ...\n"
             "       at [-V] [-q x] [-f file] [-mlbv] -t time\n"
     	    "       at -c job ...\n"
+	    "       at [-V] -l [job ...]\n"
 	    "       atq [-V] [-q x]\n"
 	    "       at [ -rd ] job ...\n"
 	    "       atrm [-V] job ...\n"
 	    "       batch\n");
     exit(EXIT_FAILURE);
openSUSE Build Service is sponsored by