+ /* Loop through all jobs */
+ LockRes();
+ foreach_res(job, R_JOB) {
+ sched = job->schedule;
+ if (!sched || !job->enabled || (sched && !sched->enabled) ||
+ (job->client && !job->client->enabled)) {
+ continue; /* no, skip this job */
+ }
+ if (job_name[0] && strcmp(job_name, job->name()) != 0) {
+ continue;
+ }
+ for (run=sched->run; run; run=run->next) {
+ next = now;
+ for (i=0; i<days; i++) {
+ struct tm tm;
+ int mday, wday, month, wom, woy, ldom;
+ char dt[MAX_TIME_LENGTH];
+ bool ok;
+
+ /* compute values for next time */
+ (void)localtime_r(&next, &tm);
+ mday = tm.tm_mday - 1;
+ wday = tm.tm_wday;
+ month = tm.tm_mon;
+ wom = mday / 7;
+ woy = tm_woy(next); /* get week of year */
+ ldom = tm_ldom(month, tm.tm_year + 1900);
+
+//#define xxx_debug
+#ifdef xxx_debug
+ Dmsg6(000, "m=%d md=%d wd=%d wom=%d woy=%d ldom=%d\n",
+ month, mday, wday, wom, woy, ldom);
+ Dmsg6(000, "bitset bsm=%d bsmd=%d bswd=%d bswom=%d bswoy=%d bsldom=%d\n",
+ bit_is_set(month, run->month),
+ bit_is_set(mday, run->mday),
+ bit_is_set(wday, run->wday),
+ bit_is_set(wom, run->wom),
+ bit_is_set(woy, run->woy),
+ bit_is_set(31, run->mday));
+#endif
+
+ ok = (bit_is_set(mday, run->mday) &&
+ bit_is_set(wday, run->wday) &&
+ bit_is_set(month, run->month) &&
+ bit_is_set(wom, run->wom) &&
+ bit_is_set(woy, run->woy)) ||
+ (bit_is_set(month, run->month) &&
+ bit_is_set(31, run->mday) && mday == ldom);
+ if (!ok) {
+ next += 24 * 60 * 60; /* Add one day */
+ continue;
+ }
+ for (int j=0; j < 24; j++) {
+ if (bit_is_set(j, run->hour)) {
+ tm.tm_hour = j;
+ tm.tm_min = run->minute;
+ tm.tm_sec = 0;
+ runtime = mktime(&tm);
+ bstrftime_dn(dt, sizeof(dt), runtime);
+ break;
+ }
+ }
+
+ level = job->JobLevel;
+ if (run->level) {
+ level = run->level;
+ }
+ switch (job->JobType) {
+ case JT_ADMIN:
+ level_ptr = "Admin";
+ break;
+ case JT_RESTORE:
+ level_ptr = "Restore";
+ break;
+ default:
+ level_ptr = level_to_str(level);
+ break;
+ }
+ priority = job->Priority;
+ if (run->Priority) {
+ priority = run->Priority;
+ }
+ if (!hdr_printed) {
+ prt_lrunhdr(ua);
+ hdr_printed = true;
+ }
+ if (ua->api) {
+ ua->send_msg(_("%-14s\t%-8s\t%3d\t%-18s\t%-18s\t%s\n"),
+ level_ptr, job_type_to_str(job->JobType), priority, dt,
+ job->name(), sched->name());
+ } else {
+ ua->send_msg(_("%-14s %-8s %3d %-18s %-18s %s\n"),
+ level_ptr, job_type_to_str(job->JobType), priority, dt,
+ job->name(), sched->name());
+ }
+ next += 24 * 60 * 60; /* Add one day */
+ num_jobs++;
+ if (num_jobs >= limit) {
+ goto get_out;
+ }
+ }
+ } /* end loop over run pkts */
+ } /* end for loop over resources */
+get_out:
+ UnlockRes();
+ if (num_jobs == 0 && !ua->api) {
+ ua->send_msg(_("No Scheduled Jobs.\n"));
+ }
+ if (!ua->api) ua->send_msg("====\n");
+ Dmsg0(200, "Leave ;list_sched_jobs_runs()\n");
+}
+
+
+/*
+ * Sort items by runtime, priority
+ */
+static int my_compare(void *item1, void *item2)
+{
+ sched_pkt *p1 = (sched_pkt *)item1;
+ sched_pkt *p2 = (sched_pkt *)item2;
+ if (p1->runtime < p2->runtime) {
+ return -1;
+ } else if (p1->runtime > p2->runtime) {
+ return 1;
+ }
+ if (p1->priority < p2->priority) {
+ return -1;
+ } else if (p1->priority > p2->priority) {
+ return 1;
+ }
+ return 0;