chiark / gitweb /
1bcf4968e2c5df0d31e59b0f771efd0382cfb2bc
[elogind.git] / src / core / job.c
1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
2
3 /***
4   This file is part of systemd.
5
6   Copyright 2010 Lennart Poettering
7
8   systemd is free software; you can redistribute it and/or modify it
9   under the terms of the GNU Lesser General Public License as published by
10   the Free Software Foundation; either version 2.1 of the License, or
11   (at your option) any later version.
12
13   systemd is distributed in the hope that it will be useful, but
14   WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16   Lesser General Public License for more details.
17
18   You should have received a copy of the GNU Lesser General Public License
19   along with systemd; If not, see <http://www.gnu.org/licenses/>.
20 ***/
21
22 #include <assert.h>
23 #include <errno.h>
24 #include <sys/timerfd.h>
25 #include <sys/epoll.h>
26
27 #include "sd-id128.h"
28 #include "sd-messages.h"
29 #include "set.h"
30 #include "unit.h"
31 #include "macro.h"
32 #include "strv.h"
33 #include "load-fragment.h"
34 #include "load-dropin.h"
35 #include "log.h"
36 #include "dbus-job.h"
37 #include "special.h"
38 #include "async.h"
39 #include "virt.h"
40 #include "dbus-client-track.h"
41
42 Job* job_new_raw(Unit *unit) {
43         Job *j;
44
45         /* used for deserialization */
46
47         assert(unit);
48
49         j = new0(Job, 1);
50         if (!j)
51                 return NULL;
52
53         j->manager = unit->manager;
54         j->unit = unit;
55         j->type = _JOB_TYPE_INVALID;
56
57         return j;
58 }
59
60 Job* job_new(Unit *unit, JobType type) {
61         Job *j;
62
63         assert(type < _JOB_TYPE_MAX);
64
65         j = job_new_raw(unit);
66         if (!j)
67                 return NULL;
68
69         j->id = j->manager->current_job_id++;
70         j->type = type;
71
72         /* We don't link it here, that's what job_dependency() is for */
73
74         return j;
75 }
76
77 void job_free(Job *j) {
78         assert(j);
79         assert(!j->installed);
80         assert(!j->transaction_prev);
81         assert(!j->transaction_next);
82         assert(!j->subject_list);
83         assert(!j->object_list);
84
85         if (j->in_run_queue)
86                 LIST_REMOVE(run_queue, j->manager->run_queue, j);
87
88         if (j->in_dbus_queue)
89                 LIST_REMOVE(dbus_queue, j->manager->dbus_job_queue, j);
90
91         sd_event_source_unref(j->timer_event_source);
92
93         bus_client_track_free(j->subscribed);
94
95         free(j);
96 }
97
98 void job_uninstall(Job *j) {
99         Job **pj;
100
101         assert(j->installed);
102
103         pj = (j->type == JOB_NOP) ? &j->unit->nop_job : &j->unit->job;
104         assert(*pj == j);
105
106         /* Detach from next 'bigger' objects */
107
108         /* daemon-reload should be transparent to job observers */
109         if (j->manager->n_reloading <= 0)
110                 bus_job_send_removed_signal(j);
111
112         *pj = NULL;
113
114         unit_add_to_gc_queue(j->unit);
115
116         hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
117         j->installed = false;
118 }
119
120 static bool job_type_allows_late_merge(JobType t) {
121         /* Tells whether it is OK to merge a job of type 't' with an already
122          * running job.
123          * Reloads cannot be merged this way. Think of the sequence:
124          * 1. Reload of a daemon is in progress; the daemon has already loaded
125          *    its config file, but hasn't completed the reload operation yet.
126          * 2. Edit foo's config file.
127          * 3. Trigger another reload to have the daemon use the new config.
128          * Should the second reload job be merged into the first one, the daemon
129          * would not know about the new config.
130          * JOB_RESTART jobs on the other hand can be merged, because they get
131          * patched into JOB_START after stopping the unit. So if we see a
132          * JOB_RESTART running, it means the unit hasn't stopped yet and at
133          * this time the merge is still allowed. */
134         return t != JOB_RELOAD;
135 }
136
137 static void job_merge_into_installed(Job *j, Job *other) {
138         assert(j->installed);
139         assert(j->unit == other->unit);
140
141         if (j->type != JOB_NOP)
142                 job_type_merge_and_collapse(&j->type, other->type, j->unit);
143         else
144                 assert(other->type == JOB_NOP);
145
146         j->override = j->override || other->override;
147         j->irreversible = j->irreversible || other->irreversible;
148         j->ignore_order = j->ignore_order || other->ignore_order;
149 }
150
151 Job* job_install(Job *j) {
152         Job **pj;
153         Job *uj;
154
155         assert(!j->installed);
156         assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION);
157
158         pj = (j->type == JOB_NOP) ? &j->unit->nop_job : &j->unit->job;
159         uj = *pj;
160
161         if (uj) {
162                 if (j->type != JOB_NOP && job_type_is_conflicting(uj->type, j->type))
163                         job_finish_and_invalidate(uj, JOB_CANCELED, false);
164                 else {
165                         /* not conflicting, i.e. mergeable */
166
167                         if (j->type == JOB_NOP || uj->state == JOB_WAITING ||
168                             (job_type_allows_late_merge(j->type) && job_type_is_superset(uj->type, j->type))) {
169                                 job_merge_into_installed(uj, j);
170                                 log_debug_unit(uj->unit->id,
171                                                "Merged into installed job %s/%s as %u",
172                                                uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
173                                 return uj;
174                         } else {
175                                 /* already running and not safe to merge into */
176                                 /* Patch uj to become a merged job and re-run it. */
177                                 /* XXX It should be safer to queue j to run after uj finishes, but it is
178                                  * not currently possible to have more than one installed job per unit. */
179                                 job_merge_into_installed(uj, j);
180                                 log_debug_unit(uj->unit->id,
181                                                "Merged into running job, re-running: %s/%s as %u",
182                                                uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
183                                 uj->state = JOB_WAITING;
184                                 uj->manager->n_running_jobs--;
185                                 return uj;
186                         }
187                 }
188         }
189
190         /* Install the job */
191         *pj = j;
192         j->installed = true;
193         j->manager->n_installed_jobs ++;
194         log_debug_unit(j->unit->id,
195                        "Installed new job %s/%s as %u",
196                        j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
197         return j;
198 }
199
200 int job_install_deserialized(Job *j) {
201         Job **pj;
202
203         assert(!j->installed);
204
205         if (j->type < 0 || j->type >= _JOB_TYPE_MAX_IN_TRANSACTION) {
206                 log_debug("Invalid job type %s in deserialization.", strna(job_type_to_string(j->type)));
207                 return -EINVAL;
208         }
209
210         pj = (j->type == JOB_NOP) ? &j->unit->nop_job : &j->unit->job;
211
212         if (*pj) {
213                 log_debug_unit(j->unit->id,
214                                "Unit %s already has a job installed. Not installing deserialized job.",
215                                j->unit->id);
216                 return -EEXIST;
217         }
218         *pj = j;
219         j->installed = true;
220         log_debug_unit(j->unit->id,
221                        "Reinstalled deserialized job %s/%s as %u",
222                        j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
223         return 0;
224 }
225
226 JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts) {
227         JobDependency *l;
228
229         assert(object);
230
231         /* Adds a new job link, which encodes that the 'subject' job
232          * needs the 'object' job in some way. If 'subject' is NULL
233          * this means the 'anchor' job (i.e. the one the user
234          * explicitly asked for) is the requester. */
235
236         if (!(l = new0(JobDependency, 1)))
237                 return NULL;
238
239         l->subject = subject;
240         l->object = object;
241         l->matters = matters;
242         l->conflicts = conflicts;
243
244         if (subject)
245                 LIST_PREPEND(subject, subject->subject_list, l);
246
247         LIST_PREPEND(object, object->object_list, l);
248
249         return l;
250 }
251
252 void job_dependency_free(JobDependency *l) {
253         assert(l);
254
255         if (l->subject)
256                 LIST_REMOVE(subject, l->subject->subject_list, l);
257
258         LIST_REMOVE(object, l->object->object_list, l);
259
260         free(l);
261 }
262
263 void job_dump(Job *j, FILE*f, const char *prefix) {
264         assert(j);
265         assert(f);
266
267         if (!prefix)
268                 prefix = "";
269
270         fprintf(f,
271                 "%s-> Job %u:\n"
272                 "%s\tAction: %s -> %s\n"
273                 "%s\tState: %s\n"
274                 "%s\tForced: %s\n"
275                 "%s\tIrreversible: %s\n",
276                 prefix, j->id,
277                 prefix, j->unit->id, job_type_to_string(j->type),
278                 prefix, job_state_to_string(j->state),
279                 prefix, yes_no(j->override),
280                 prefix, yes_no(j->irreversible));
281 }
282
283 /*
284  * Merging is commutative, so imagine the matrix as symmetric. We store only
285  * its lower triangle to avoid duplication. We don't store the main diagonal,
286  * because A merged with A is simply A.
287  *
288  * If the resulting type is collapsed immediately afterwards (to get rid of
289  * the JOB_RELOAD_OR_START, which lies outside the lookup function's domain),
290  * the following properties hold:
291  *
292  * Merging is associative! A merged with B merged with C is the same as
293  * A merged with C merged with B.
294  *
295  * Mergeability is transitive! If A can be merged with B and B with C then
296  * A also with C.
297  *
298  * Also, if A merged with B cannot be merged with C, then either A or B cannot
299  * be merged with C either.
300  */
301 static const JobType job_merging_table[] = {
302 /* What \ With       *  JOB_START         JOB_VERIFY_ACTIVE  JOB_STOP JOB_RELOAD */
303 /*********************************************************************************/
304 /*JOB_START          */
305 /*JOB_VERIFY_ACTIVE  */ JOB_START,
306 /*JOB_STOP           */ -1,                  -1,
307 /*JOB_RELOAD         */ JOB_RELOAD_OR_START, JOB_RELOAD,          -1,
308 /*JOB_RESTART        */ JOB_RESTART,         JOB_RESTART,         -1, JOB_RESTART,
309 };
310
311 JobType job_type_lookup_merge(JobType a, JobType b) {
312         assert_cc(ELEMENTSOF(job_merging_table) == _JOB_TYPE_MAX_MERGING * (_JOB_TYPE_MAX_MERGING - 1) / 2);
313         assert(a >= 0 && a < _JOB_TYPE_MAX_MERGING);
314         assert(b >= 0 && b < _JOB_TYPE_MAX_MERGING);
315
316         if (a == b)
317                 return a;
318
319         if (a < b) {
320                 JobType tmp = a;
321                 a = b;
322                 b = tmp;
323         }
324
325         return job_merging_table[(a - 1) * a / 2 + b];
326 }
327
328 bool job_type_is_redundant(JobType a, UnitActiveState b) {
329         switch (a) {
330
331         case JOB_START:
332                 return
333                         b == UNIT_ACTIVE ||
334                         b == UNIT_RELOADING;
335
336         case JOB_STOP:
337                 return
338                         b == UNIT_INACTIVE ||
339                         b == UNIT_FAILED;
340
341         case JOB_VERIFY_ACTIVE:
342                 return
343                         b == UNIT_ACTIVE ||
344                         b == UNIT_RELOADING;
345
346         case JOB_RELOAD:
347                 return
348                         b == UNIT_RELOADING;
349
350         case JOB_RESTART:
351                 return
352                         b == UNIT_ACTIVATING;
353
354         default:
355                 assert_not_reached("Invalid job type");
356         }
357 }
358
359 void job_type_collapse(JobType *t, Unit *u) {
360         UnitActiveState s;
361
362         switch (*t) {
363
364         case JOB_TRY_RESTART:
365                 s = unit_active_state(u);
366                 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(s))
367                         *t = JOB_NOP;
368                 else
369                         *t = JOB_RESTART;
370                 break;
371
372         case JOB_RELOAD_OR_START:
373                 s = unit_active_state(u);
374                 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(s))
375                         *t = JOB_START;
376                 else
377                         *t = JOB_RELOAD;
378                 break;
379
380         default:
381                 ;
382         }
383 }
384
385 int job_type_merge_and_collapse(JobType *a, JobType b, Unit *u) {
386         JobType t = job_type_lookup_merge(*a, b);
387         if (t < 0)
388                 return -EEXIST;
389         *a = t;
390         job_type_collapse(a, u);
391         return 0;
392 }
393
394 static bool job_is_runnable(Job *j) {
395         Iterator i;
396         Unit *other;
397
398         assert(j);
399         assert(j->installed);
400
401         /* Checks whether there is any job running for the units this
402          * job needs to be running after (in the case of a 'positive'
403          * job type) or before (in the case of a 'negative' job
404          * type. */
405
406         /* Note that unit types have a say in what is runnable,
407          * too. For example, if they return -EAGAIN from
408          * unit_start() they can indicate they are not
409          * runnable yet. */
410
411         /* First check if there is an override */
412         if (j->ignore_order)
413                 return true;
414
415         if (j->type == JOB_NOP)
416                 return true;
417
418         if (j->type == JOB_START ||
419             j->type == JOB_VERIFY_ACTIVE ||
420             j->type == JOB_RELOAD) {
421
422                 /* Immediate result is that the job is or might be
423                  * started. In this case lets wait for the
424                  * dependencies, regardless whether they are
425                  * starting or stopping something. */
426
427                 SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i)
428                         if (other->job)
429                                 return false;
430         }
431
432         /* Also, if something else is being stopped and we should
433          * change state after it, then lets wait. */
434
435         SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i)
436                 if (other->job &&
437                     (other->job->type == JOB_STOP ||
438                      other->job->type == JOB_RESTART))
439                         return false;
440
441         /* This means that for a service a and a service b where b
442          * shall be started after a:
443          *
444          *  start a + start b â†’ 1st step start a, 2nd step start b
445          *  start a + stop b  â†’ 1st step stop b,  2nd step start a
446          *  stop a  + start b â†’ 1st step stop a,  2nd step start b
447          *  stop a  + stop b  â†’ 1st step stop b,  2nd step stop a
448          *
449          *  This has the side effect that restarts are properly
450          *  synchronized too. */
451
452         return true;
453 }
454
455 static void job_change_type(Job *j, JobType newtype) {
456         log_debug_unit(j->unit->id,
457                        "Converting job %s/%s -> %s/%s",
458                        j->unit->id, job_type_to_string(j->type),
459                        j->unit->id, job_type_to_string(newtype));
460
461         j->type = newtype;
462 }
463
464 int job_run_and_invalidate(Job *j) {
465         int r;
466         uint32_t id;
467         Manager *m = j->manager;
468
469         assert(j);
470         assert(j->installed);
471         assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION);
472         assert(j->in_run_queue);
473
474         LIST_REMOVE(run_queue, j->manager->run_queue, j);
475         j->in_run_queue = false;
476
477         if (j->state != JOB_WAITING)
478                 return 0;
479
480         if (!job_is_runnable(j))
481                 return -EAGAIN;
482
483         j->state = JOB_RUNNING;
484         m->n_running_jobs++;
485         job_add_to_dbus_queue(j);
486
487         /* While we execute this operation the job might go away (for
488          * example: because it is replaced by a new, conflicting
489          * job.) To make sure we don't access a freed job later on we
490          * store the id here, so that we can verify the job is still
491          * valid. */
492         id = j->id;
493
494         switch (j->type) {
495
496                 case JOB_START:
497                         r = unit_start(j->unit);
498
499                         /* If this unit cannot be started, then simply wait */
500                         if (r == -EBADR)
501                                 r = 0;
502                         break;
503
504                 case JOB_VERIFY_ACTIVE: {
505                         UnitActiveState t = unit_active_state(j->unit);
506                         if (UNIT_IS_ACTIVE_OR_RELOADING(t))
507                                 r = -EALREADY;
508                         else if (t == UNIT_ACTIVATING)
509                                 r = -EAGAIN;
510                         else
511                                 r = -EBADR;
512                         break;
513                 }
514
515                 case JOB_STOP:
516                 case JOB_RESTART:
517                         r = unit_stop(j->unit);
518
519                         /* If this unit cannot stopped, then simply wait. */
520                         if (r == -EBADR)
521                                 r = 0;
522                         break;
523
524                 case JOB_RELOAD:
525                         r = unit_reload(j->unit);
526                         break;
527
528                 case JOB_NOP:
529                         r = -EALREADY;
530                         break;
531
532                 default:
533                         assert_not_reached("Unknown job type");
534         }
535
536         j = manager_get_job(m, id);
537         if (j) {
538                 if (r == -EALREADY)
539                         r = job_finish_and_invalidate(j, JOB_DONE, true);
540                 else if (r == -EBADR)
541                         r = job_finish_and_invalidate(j, JOB_SKIPPED, true);
542                 else if (r == -ENOEXEC)
543                         r = job_finish_and_invalidate(j, JOB_INVALID, true);
544                 else if (r == -EAGAIN) {
545                         j->state = JOB_WAITING;
546                         m->n_running_jobs--;
547                 } else if (r < 0)
548                         r = job_finish_and_invalidate(j, JOB_FAILED, true);
549         }
550
551         return r;
552 }
553
554 _pure_ static const char *job_get_status_message_format(Unit *u, JobType t, JobResult result) {
555         const UnitStatusMessageFormats *format_table;
556
557         assert(u);
558         assert(t >= 0);
559         assert(t < _JOB_TYPE_MAX);
560
561         format_table = &UNIT_VTABLE(u)->status_message_formats;
562         if (!format_table)
563                 return NULL;
564
565         if (t == JOB_START)
566                 return format_table->finished_start_job[result];
567         else if (t == JOB_STOP || t == JOB_RESTART)
568                 return format_table->finished_stop_job[result];
569
570         return NULL;
571 }
572
573 _pure_ static const char *job_get_status_message_format_try_harder(Unit *u, JobType t, JobResult result) {
574         const char *format;
575
576         assert(u);
577         assert(t >= 0);
578         assert(t < _JOB_TYPE_MAX);
579
580         format = job_get_status_message_format(u, t, result);
581         if (format)
582                 return format;
583
584         /* Return generic strings */
585         if (t == JOB_START) {
586                 if (result == JOB_DONE)
587                         return "Started %s.";
588                 else if (result == JOB_FAILED)
589                         return "Failed to start %s.";
590                 else if (result == JOB_DEPENDENCY)
591                         return "Dependency failed for %s.";
592                 else if (result == JOB_TIMEOUT)
593                         return "Timed out starting %s.";
594         } else if (t == JOB_STOP || t == JOB_RESTART) {
595                 if (result == JOB_DONE)
596                         return "Stopped %s.";
597                 else if (result == JOB_FAILED)
598                         return "Stopped (with error) %s.";
599                 else if (result == JOB_TIMEOUT)
600                         return "Timed out stoppping %s.";
601         } else if (t == JOB_RELOAD) {
602                 if (result == JOB_DONE)
603                         return "Reloaded %s.";
604                 else if (result == JOB_FAILED)
605                         return "Reload failed for %s.";
606                 else if (result == JOB_TIMEOUT)
607                         return "Timed out reloading %s.";
608         }
609
610         return NULL;
611 }
612
613 #pragma GCC diagnostic push
614 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
615 static void job_print_status_message(Unit *u, JobType t, JobResult result) {
616         const char *format;
617
618         assert(u);
619         assert(t >= 0);
620         assert(t < _JOB_TYPE_MAX);
621
622         if (t == JOB_START) {
623                 format = job_get_status_message_format(u, t, result);
624                 if (!format)
625                         return;
626
627                 switch (result) {
628
629                 case JOB_DONE:
630                         if (u->condition_result)
631                                 unit_status_printf(u, ANSI_GREEN_ON "  OK  " ANSI_HIGHLIGHT_OFF, format);
632                         break;
633
634                 case JOB_FAILED:
635                         manager_flip_auto_status(u->manager, true);
636                         unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON "FAILED" ANSI_HIGHLIGHT_OFF, format);
637                         manager_status_printf(u->manager, false, NULL, "See 'systemctl status %s' for details.", u->id);
638                         break;
639
640                 case JOB_DEPENDENCY:
641                         manager_flip_auto_status(u->manager, true);
642                         unit_status_printf(u, ANSI_HIGHLIGHT_YELLOW_ON "DEPEND" ANSI_HIGHLIGHT_OFF, format);
643                         break;
644
645                 case JOB_TIMEOUT:
646                         manager_flip_auto_status(u->manager, true);
647                         unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF, format);
648                         break;
649
650                 default:
651                         ;
652                 }
653
654         } else if (t == JOB_STOP || t == JOB_RESTART) {
655
656                 format = job_get_status_message_format(u, t, result);
657                 if (!format)
658                         return;
659
660                 switch (result) {
661
662                 case JOB_TIMEOUT:
663                         manager_flip_auto_status(u->manager, true);
664                         unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF, format);
665                         break;
666
667                 case JOB_DONE:
668                 case JOB_FAILED:
669                         unit_status_printf(u, ANSI_GREEN_ON "  OK  " ANSI_HIGHLIGHT_OFF, format);
670                         break;
671
672                 default:
673                         ;
674                 }
675
676         } else if (t == JOB_VERIFY_ACTIVE) {
677
678                 /* When verify-active detects the unit is inactive, report it.
679                  * Most likely a DEPEND warning from a requisiting unit will
680                  * occur next and it's nice to see what was requisited. */
681                 if (result == JOB_SKIPPED)
682                         unit_status_printf(u, ANSI_HIGHLIGHT_ON " INFO " ANSI_HIGHLIGHT_OFF, "%s is not active.");
683         }
684 }
685 #pragma GCC diagnostic pop
686
687 #pragma GCC diagnostic push
688 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
689 static void job_log_status_message(Unit *u, JobType t, JobResult result) {
690         const char *format;
691         char buf[LINE_MAX];
692
693         assert(u);
694         assert(t >= 0);
695         assert(t < _JOB_TYPE_MAX);
696
697         /* Skip this if it goes to the console. since we already print
698          * to the console anyway... */
699
700         if (log_on_console())
701                 return;
702
703         format = job_get_status_message_format_try_harder(u, t, result);
704         if (!format)
705                 return;
706
707         snprintf(buf, sizeof(buf), format, unit_description(u));
708         char_array_0(buf);
709
710         if (t == JOB_START) {
711                 sd_id128_t mid;
712
713                 mid = result == JOB_DONE ? SD_MESSAGE_UNIT_STARTED : SD_MESSAGE_UNIT_FAILED;
714                 log_struct_unit(result == JOB_DONE ? LOG_INFO : LOG_ERR,
715                            u->id,
716                            MESSAGE_ID(mid),
717                            "RESULT=%s", job_result_to_string(result),
718                            "MESSAGE=%s", buf,
719                            NULL);
720
721         } else if (t == JOB_STOP)
722                 log_struct_unit(result == JOB_DONE ? LOG_INFO : LOG_ERR,
723                            u->id,
724                            MESSAGE_ID(SD_MESSAGE_UNIT_STOPPED),
725                            "RESULT=%s", job_result_to_string(result),
726                            "MESSAGE=%s", buf,
727                            NULL);
728
729         else if (t == JOB_RELOAD)
730                 log_struct_unit(result == JOB_DONE ? LOG_INFO : LOG_ERR,
731                            u->id,
732                            MESSAGE_ID(SD_MESSAGE_UNIT_RELOADED),
733                            "RESULT=%s", job_result_to_string(result),
734                            "MESSAGE=%s", buf,
735                            NULL);
736 }
737 #pragma GCC diagnostic pop
738
739 int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) {
740         Unit *u;
741         Unit *other;
742         JobType t;
743         Iterator i;
744
745         assert(j);
746         assert(j->installed);
747         assert(j->type < _JOB_TYPE_MAX_IN_TRANSACTION);
748
749         u = j->unit;
750         t = j->type;
751
752         j->result = result;
753
754         if (j->state == JOB_RUNNING)
755                 j->manager->n_running_jobs--;
756
757         log_debug_unit(u->id, "Job %s/%s finished, result=%s",
758                        u->id, job_type_to_string(t), job_result_to_string(result));
759
760         job_print_status_message(u, t, result);
761         job_log_status_message(u, t, result);
762
763         job_add_to_dbus_queue(j);
764
765         /* Patch restart jobs so that they become normal start jobs */
766         if (result == JOB_DONE && t == JOB_RESTART) {
767
768                 job_change_type(j, JOB_START);
769                 j->state = JOB_WAITING;
770
771                 job_add_to_run_queue(j);
772
773                 goto finish;
774         }
775
776         if (result == JOB_FAILED || result == JOB_INVALID)
777                 j->manager->n_failed_jobs ++;
778
779         job_uninstall(j);
780         job_free(j);
781
782         /* Fail depending jobs on failure */
783         if (result != JOB_DONE && recursive) {
784
785                 if (t == JOB_START ||
786                     t == JOB_VERIFY_ACTIVE) {
787
788                         SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
789                                 if (other->job &&
790                                     (other->job->type == JOB_START ||
791                                      other->job->type == JOB_VERIFY_ACTIVE))
792                                         job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
793
794                         SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
795                                 if (other->job &&
796                                     (other->job->type == JOB_START ||
797                                      other->job->type == JOB_VERIFY_ACTIVE))
798                                         job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
799
800                         SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
801                                 if (other->job &&
802                                     !other->job->override &&
803                                     (other->job->type == JOB_START ||
804                                      other->job->type == JOB_VERIFY_ACTIVE))
805                                         job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
806
807                 } else if (t == JOB_STOP) {
808
809                         SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
810                                 if (other->job &&
811                                     (other->job->type == JOB_START ||
812                                      other->job->type == JOB_VERIFY_ACTIVE))
813                                         job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true);
814                 }
815         }
816
817         /* Trigger OnFailure dependencies that are not generated by
818          * the unit itself. We don't treat JOB_CANCELED as failure in
819          * this context. And JOB_FAILURE is already handled by the
820          * unit itself. */
821         if (result == JOB_TIMEOUT || result == JOB_DEPENDENCY) {
822                 log_struct_unit(LOG_NOTICE,
823                            u->id,
824                            "JOB_TYPE=%s", job_type_to_string(t),
825                            "JOB_RESULT=%s", job_result_to_string(result),
826                            "Job %s/%s failed with result '%s'.",
827                            u->id,
828                            job_type_to_string(t),
829                            job_result_to_string(result),
830                            NULL);
831
832                 unit_start_on_failure(u);
833         }
834
835         unit_trigger_notify(u);
836
837 finish:
838         /* Try to start the next jobs that can be started */
839         SET_FOREACH(other, u->dependencies[UNIT_AFTER], i)
840                 if (other->job)
841                         job_add_to_run_queue(other->job);
842         SET_FOREACH(other, u->dependencies[UNIT_BEFORE], i)
843                 if (other->job)
844                         job_add_to_run_queue(other->job);
845
846         manager_check_finished(u->manager);
847
848         return 0;
849 }
850
851 static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *userdata) {
852         Job *j = userdata;
853
854         assert(j);
855         assert(s == j->timer_event_source);
856
857         log_warning_unit(j->unit->id, "Job %s/%s timed out.",
858                          j->unit->id, job_type_to_string(j->type));
859
860         job_finish_and_invalidate(j, JOB_TIMEOUT, true);
861         return 0;
862 }
863
864 int job_start_timer(Job *j) {
865         int r;
866
867         if (j->unit->job_timeout <= 0 || j->timer_event_source)
868                 return 0;
869
870         j->begin_usec = now(CLOCK_MONOTONIC);
871
872         r = sd_event_add_monotonic(j->manager->event, j->begin_usec + j->unit->job_timeout, 0, job_dispatch_timer, j, &j->timer_event_source);
873         if (r < 0)
874                 return r;
875
876         return 0;
877 }
878
879 void job_add_to_run_queue(Job *j) {
880         assert(j);
881         assert(j->installed);
882
883         if (j->in_run_queue)
884                 return;
885
886         if (!j->manager->run_queue)
887                 sd_event_source_set_enabled(j->manager->run_queue_event_source, SD_EVENT_ONESHOT);
888
889         LIST_PREPEND(run_queue, j->manager->run_queue, j);
890         j->in_run_queue = true;
891 }
892
893 void job_add_to_dbus_queue(Job *j) {
894         assert(j);
895         assert(j->installed);
896
897         if (j->in_dbus_queue)
898                 return;
899
900         /* We don't check if anybody is subscribed here, since this
901          * job might just have been created and not yet assigned to a
902          * connection/client. */
903
904         LIST_PREPEND(dbus_queue, j->manager->dbus_job_queue, j);
905         j->in_dbus_queue = true;
906 }
907
908 char *job_dbus_path(Job *j) {
909         char *p;
910
911         assert(j);
912
913         if (asprintf(&p, "/org/freedesktop/systemd1/job/%"PRIu32, j->id) < 0)
914                 return NULL;
915
916         return p;
917 }
918
919 int job_serialize(Job *j, FILE *f, FDSet *fds) {
920         fprintf(f, "job-id=%u\n", j->id);
921         fprintf(f, "job-type=%s\n", job_type_to_string(j->type));
922         fprintf(f, "job-state=%s\n", job_state_to_string(j->state));
923         fprintf(f, "job-override=%s\n", yes_no(j->override));
924         fprintf(f, "job-irreversible=%s\n", yes_no(j->irreversible));
925         fprintf(f, "job-sent-dbus-new-signal=%s\n", yes_no(j->sent_dbus_new_signal));
926         fprintf(f, "job-ignore-order=%s\n", yes_no(j->ignore_order));
927
928         if (j->begin_usec > 0)
929                 fprintf(f, "job-begin="USEC_FMT"\n", j->begin_usec);
930
931         bus_client_track_serialize(j->manager, f, j->subscribed);
932
933         /* End marker */
934         fputc('\n', f);
935         return 0;
936 }
937
938 int job_deserialize(Job *j, FILE *f, FDSet *fds) {
939         assert(j);
940
941         for (;;) {
942                 char line[LINE_MAX], *l, *v;
943                 size_t k;
944
945                 if (!fgets(line, sizeof(line), f)) {
946                         if (feof(f))
947                                 return 0;
948                         return -errno;
949                 }
950
951                 char_array_0(line);
952                 l = strstrip(line);
953
954                 /* End marker */
955                 if (l[0] == 0)
956                         return 0;
957
958                 k = strcspn(l, "=");
959
960                 if (l[k] == '=') {
961                         l[k] = 0;
962                         v = l+k+1;
963                 } else
964                         v = l+k;
965
966                 if (streq(l, "job-id")) {
967
968                         if (safe_atou32(v, &j->id) < 0)
969                                 log_debug("Failed to parse job id value %s", v);
970
971                 } else if (streq(l, "job-type")) {
972                         JobType t;
973
974                         t = job_type_from_string(v);
975                         if (t < 0)
976                                 log_debug("Failed to parse job type %s", v);
977                         else if (t >= _JOB_TYPE_MAX_IN_TRANSACTION)
978                                 log_debug("Cannot deserialize job of type %s", v);
979                         else
980                                 j->type = t;
981
982                 } else if (streq(l, "job-state")) {
983                         JobState s;
984
985                         s = job_state_from_string(v);
986                         if (s < 0)
987                                 log_debug("Failed to parse job state %s", v);
988                         else
989                                 j->state = s;
990
991                 } else if (streq(l, "job-override")) {
992                         int b;
993
994                         b = parse_boolean(v);
995                         if (b < 0)
996                                 log_debug("Failed to parse job override flag %s", v);
997                         else
998                                 j->override = j->override || b;
999
1000                 } else if (streq(l, "job-irreversible")) {
1001                         int b;
1002
1003                         b = parse_boolean(v);
1004                         if (b < 0)
1005                                 log_debug("Failed to parse job irreversible flag %s", v);
1006                         else
1007                                 j->irreversible = j->irreversible || b;
1008
1009                 } else if (streq(l, "job-sent-dbus-new-signal")) {
1010                         int b;
1011
1012                         b = parse_boolean(v);
1013                         if (b < 0)
1014                                 log_debug("Failed to parse job sent_dbus_new_signal flag %s", v);
1015                         else
1016                                 j->sent_dbus_new_signal = j->sent_dbus_new_signal || b;
1017
1018                 } else if (streq(l, "job-ignore-order")) {
1019                         int b;
1020
1021                         b = parse_boolean(v);
1022                         if (b < 0)
1023                                 log_debug("Failed to parse job ignore_order flag %s", v);
1024                         else
1025                                 j->ignore_order = j->ignore_order || b;
1026
1027                 } else if (streq(l, "job-begin")) {
1028                         unsigned long long ull;
1029
1030                         if (sscanf(v, "%llu", &ull) != 1)
1031                                 log_debug("Failed to parse job-begin value %s", v);
1032                         else
1033                                 j->begin_usec = ull;
1034
1035                 } else {
1036                         char t[strlen(l) + 1 + strlen(v) + 1];
1037
1038                         strcpy(stpcpy(stpcpy(t, l), "="), v);
1039
1040                         if (bus_client_track_deserialize_item(j->manager, &j->subscribed, t) == 0)
1041                                 log_debug("Unknown deserialization key '%s'", l);
1042                 }
1043         }
1044 }
1045
1046 int job_coldplug(Job *j) {
1047         int r;
1048
1049         assert(j);
1050
1051         if (j->begin_usec <= 0)
1052                 return 0;
1053
1054         if (j->timer_event_source)
1055                 j->timer_event_source = sd_event_source_unref(j->timer_event_source);
1056
1057         r = sd_event_add_monotonic(j->manager->event, j->begin_usec + j->unit->job_timeout, 0, job_dispatch_timer, j, &j->timer_event_source);
1058         if (r < 0)
1059                 log_debug("Failed to restart timeout for job: %s", strerror(-r));
1060
1061         return r;
1062 }
1063
1064 void job_shutdown_magic(Job *j) {
1065         assert(j);
1066
1067         /* The shutdown target gets some special treatment here: we
1068          * tell the kernel to begin with flushing its disk caches, to
1069          * optimize shutdown time a bit. Ideally we wouldn't hardcode
1070          * this magic into PID 1. However all other processes aren't
1071          * options either since they'd exit much sooner than PID 1 and
1072          * asynchronous sync() would cause their exit to be
1073          * delayed. */
1074
1075         if (j->type != JOB_START)
1076                 return;
1077
1078         if (j->unit->manager->running_as != SYSTEMD_SYSTEM)
1079                 return;
1080
1081         if (!unit_has_name(j->unit, SPECIAL_SHUTDOWN_TARGET))
1082                 return;
1083
1084         /* In case messages on console has been disabled on boot */
1085         j->unit->manager->no_console_output = false;
1086
1087         if (detect_container(NULL) > 0)
1088                 return;
1089
1090         asynchronous_sync();
1091 }
1092
1093 int job_get_timeout(Job *j, uint64_t *timeout) {
1094         Unit *u = j->unit;
1095         uint64_t x = -1, y = -1;
1096         int r = 0, q = 0;
1097
1098         assert(u);
1099
1100         if (j->timer_event_source) {
1101                 r = sd_event_source_get_time(j->timer_event_source, &x);
1102                 if (r < 0)
1103                         return r;
1104                 r = 1;
1105         }
1106
1107         if (UNIT_VTABLE(u)->get_timeout) {
1108                 q = UNIT_VTABLE(u)->get_timeout(u, &y);
1109                 if (q < 0)
1110                         return q;
1111         }
1112
1113         if (r == 0 && q == 0)
1114                 return 0;
1115
1116         *timeout = MIN(x, y);
1117
1118         log_info("job_get_timeout %s %d/%"PRIu64" %d/%"PRIu64" -> 1/%"PRIu64,
1119                  j->unit->id, r, x, q, y, *timeout);
1120
1121         return 1;
1122 }
1123
1124 static const char* const job_state_table[_JOB_STATE_MAX] = {
1125         [JOB_WAITING] = "waiting",
1126         [JOB_RUNNING] = "running"
1127 };
1128
1129 DEFINE_STRING_TABLE_LOOKUP(job_state, JobState);
1130
1131 static const char* const job_type_table[_JOB_TYPE_MAX] = {
1132         [JOB_START] = "start",
1133         [JOB_VERIFY_ACTIVE] = "verify-active",
1134         [JOB_STOP] = "stop",
1135         [JOB_RELOAD] = "reload",
1136         [JOB_RELOAD_OR_START] = "reload-or-start",
1137         [JOB_RESTART] = "restart",
1138         [JOB_TRY_RESTART] = "try-restart",
1139         [JOB_NOP] = "nop",
1140 };
1141
1142 DEFINE_STRING_TABLE_LOOKUP(job_type, JobType);
1143
1144 static const char* const job_mode_table[_JOB_MODE_MAX] = {
1145         [JOB_FAIL] = "fail",
1146         [JOB_REPLACE] = "replace",
1147         [JOB_REPLACE_IRREVERSIBLY] = "replace-irreversibly",
1148         [JOB_ISOLATE] = "isolate",
1149         [JOB_IGNORE_DEPENDENCIES] = "ignore-dependencies",
1150         [JOB_IGNORE_REQUIREMENTS] = "ignore-requirements",
1151         [JOB_FLUSH] = "flush",
1152 };
1153
1154 DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);
1155
1156 static const char* const job_result_table[_JOB_RESULT_MAX] = {
1157         [JOB_DONE] = "done",
1158         [JOB_CANCELED] = "canceled",
1159         [JOB_TIMEOUT] = "timeout",
1160         [JOB_FAILED] = "failed",
1161         [JOB_DEPENDENCY] = "dependency",
1162         [JOB_SKIPPED] = "skipped",
1163         [JOB_INVALID] = "invalid",
1164 };
1165
1166 DEFINE_STRING_TABLE_LOOKUP(job_result, JobResult);