diff --git a/cmd/shutdown.c b/cmd/shutdown.c index 16e0c8e..0d11cc5 100644 --- a/cmd/shutdown.c +++ b/cmd/shutdown.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/initd/init.h b/initd/init.h index 0bfed6c..dee0b00 100644 --- a/initd/init.h +++ b/initd/init.h @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef INIT_H #define INIT_H @@ -14,22 +31,101 @@ enum { STATUS_WAIT, }; +/********** runlst.c **********/ + +/* + Plow through an array of strings and execute each one, i.e. do + a fork() and exec(). + + In the parent process, wait() until the child is done before + continuing through the list. + + If ctty is not NULL, open it and redirect all I/O of the child + process to that file. + + If everyhing works, the function returns EXIT_SUCCESS. If one child + does not exit with EXIT_SUCCESS, processing of the list is aborted + and the function returns the exit status of the failed process. +*/ int runlst_wait(char **exec, size_t num, const char *ctty); +/* + Does basically the same as runlst_wait, but asynchronously. + + A child process is created that calls runlst_wait exits with the + result of runlst_wait. In the parent process, the function returns + immediately with the PID of the child process. + + Alternatively, if num is 1, the child process directly exec()s the + given command. +*/ pid_t runlst(char **exec, size_t num, const char *ctty); +/********** setup_tty.c **********/ + +/* + Initial tty setup for init. Makes /dev/console our controlling tty and + reroutes all output there. Closes stdin because we presumably won't + need it anymore. + + Returns 0 on success, -1 on failure. The function takes care of + printing error messages on failure. +*/ int setup_tty(void); +/********** status.c **********/ + +/* + Print a status message. Type is either STATUS_OK, STATUS_FAIL or + STATUS_WAIT. + + A new-line is appended to the mssage, UNLESS type is STATUS_WAIT. + + If update is true, print a carriage return first to overwrite the + current line (e.g. after a STATUS_WAIT message). +*/ void print_status(const char *msg, int type, bool update); +/********** mksock.c **********/ + +/* + Create a UNIX socket that programs can use to pass messages to init. + + Returns the socked fd or -1 on failure. The function takes care of + printing error messages on failure. + + The socket has the CLOEXEC flag set. +*/ int mksock(void); +/********** shutdown.c **********/ + +/* + Kindly tell all processes to go kill themselves, then send + a SIGKILL if they don't and perform system shutdown. + + The argument is passed directly to the reboot() syscall. +*/ NORETURN void do_shutdown(int type); +/********** svclist.c **********/ + +/* + Returns true if the list of running services contains + single shot processes. +*/ bool svclist_have_singleshot(void); +/* Add a service to the list of running services */ void svclist_add(service_t *svc); +/* + Remove a service, identifierd by PID, from the list of + running services. + + Returns the service identified by the PID or NULL if there + is no such service. +*/ service_t *svclist_remove(pid_t pid); #endif /* INIT_H */ diff --git a/initd/main.c b/initd/main.c index 211188e..be9fc0d 100644 --- a/initd/main.c +++ b/initd/main.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/initd/mksock.c b/initd/mksock.c index ab26e51..6a9cab0 100644 --- a/initd/mksock.c +++ b/initd/mksock.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/initd/runlst.c b/initd/runlst.c index cf75126..908ec15 100644 --- a/initd/runlst.c +++ b/initd/runlst.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/initd/setup_tty.c b/initd/setup_tty.c index cec663b..807b69d 100644 --- a/initd/setup_tty.c +++ b/initd/setup_tty.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/initd/shutdown.c b/initd/shutdown.c index 45af1c2..1ee68c2 100644 --- a/initd/shutdown.c +++ b/initd/shutdown.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/initd/status.c b/initd/status.c index 280670b..67b049b 100644 --- a/initd/status.c +++ b/initd/status.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include "init.h" diff --git a/initd/svclist.c b/initd/svclist.c index 590091e..4ed897f 100644 --- a/initd/svclist.c +++ b/initd/svclist.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "init.h" static service_t *running = NULL; /* currently supervised services */ diff --git a/lib/include/service.h b/lib/include/service.h index eb92d85..6808bdd 100644 --- a/lib/include/service.h +++ b/lib/include/service.h @@ -1,19 +1,45 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef SERVICE_H #define SERVICE_H #include enum { + /* + Start the service in the background and continue with + other services. The service will eventually terminate. + */ SVC_ONCE = 0, - SVC_WAIT, + SVC_WAIT, /* run service and wait until it finishes */ + + /* + Similar to SVC_ONCE, but restart the service when + it terminates. + */ SVC_RESPAWN, }; enum { - TGT_BOOT = 0, - TGT_SHUTDOWN, - TGT_REBOOT, - TGT_CAD, + TGT_BOOT = 0, /* run service when the system boots */ + TGT_SHUTDOWN, /* run service when at system shut down */ + TGT_REBOOT, /* run service when during system reboot */ + TGT_CAD, /* run service when CTRL+ALT+DEL is pressed */ TGT_MAX }; @@ -27,9 +53,9 @@ typedef struct service_t { size_t num_exec; /* number of command lines */ char *ctty; /* controlling tty or log file */ - char **before; + char **before; /* services that must be executed later */ size_t num_before; - char **after; + char **after; /* services that must be executed first */ size_t num_after; pid_t pid; @@ -49,6 +75,13 @@ service_t *rdsrv(int dirfd, const char *filename); void delsrv(service_t *srv); +/* + Rebuild a service list by scanning a directory and parsing all + service descriptions. + + Returns 0 on success, -1 on failure. The function takes care of + printing error messages on failure. +*/ int srvscan(const char *directory, service_list_t *list); void del_srv_list(service_list_t *list); diff --git a/lib/include/telinit.h b/lib/include/telinit.h index 72ad871..3a3dd8c 100644 --- a/lib/include/telinit.h +++ b/lib/include/telinit.h @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef TELINIT_H #define TELINIT_H @@ -11,9 +28,10 @@ enum { }; typedef struct { - int type; + int type; /* TI_* message type identifier */ } ti_msg_t; +/* Try to connect to the init socket. */ int opensock(void); #endif /* TELINIT_H */ diff --git a/lib/include/util.h b/lib/include/util.h index bed2ba7..ed5dac2 100644 --- a/lib/include/util.h +++ b/lib/include/util.h @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef UTIL_H #define UTIL_H @@ -52,6 +69,11 @@ int splitkv(char *line, char **key, char **value); */ const enum_map_t *enum_by_name(const enum_map_t *map, const char *name); +/* + Create a copy of the input string inp, but replace all occourances + of % with argv[number] if the number is within the bounds + specified by argc. +*/ char *strexpand(const char *inp, size_t argc, const char *const *argv); #endif /* UTIL_H */ diff --git a/lib/src/del_srv_list.c b/lib/src/del_srv_list.c index 916fcb2..d54c40b 100644 --- a/lib/src/del_srv_list.c +++ b/lib/src/del_srv_list.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include "service.h" diff --git a/lib/src/delsrv.c b/lib/src/delsrv.c index b660558..87b65bc 100644 --- a/lib/src/delsrv.c +++ b/lib/src/delsrv.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include "service.h" diff --git a/lib/src/enum_by_name.c b/lib/src/enum_by_name.c index 1948eb9..95f306f 100644 --- a/lib/src/enum_by_name.c +++ b/lib/src/enum_by_name.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include "util.h" diff --git a/lib/src/opensock.c b/lib/src/opensock.c index 06101ef..0c2bf56 100644 --- a/lib/src/opensock.c +++ b/lib/src/opensock.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/lib/src/rdline.c b/lib/src/rdline.c index 591c713..1b91008 100644 --- a/lib/src/rdline.c +++ b/lib/src/rdline.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/lib/src/rdsrv.c b/lib/src/rdsrv.c index 52eb19c..ec60ce1 100644 --- a/lib/src/rdsrv.c +++ b/lib/src/rdsrv.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/lib/src/splitkv.c b/lib/src/splitkv.c index 6c6fe94..b1ef8d3 100644 --- a/lib/src/splitkv.c +++ b/lib/src/splitkv.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include "util.h" diff --git a/lib/src/srv_tsort.c b/lib/src/srv_tsort.c index e2549b1..d375c4f 100644 --- a/lib/src/srv_tsort.c +++ b/lib/src/srv_tsort.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/lib/src/srvscan.c b/lib/src/srvscan.c index 71ad4f9..69d0b91 100644 --- a/lib/src/srvscan.c +++ b/lib/src/srvscan.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/lib/src/strexpand.c b/lib/src/strexpand.c index 7e552eb..58b69a0 100644 --- a/lib/src/strexpand.c +++ b/lib/src/strexpand.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/servicecmd/disable.c b/servicecmd/disable.c index 90d8b80..1901381 100644 --- a/servicecmd/disable.c +++ b/servicecmd/disable.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/servicecmd/enable.c b/servicecmd/enable.c index 8e6200c..73ea01e 100644 --- a/servicecmd/enable.c +++ b/servicecmd/enable.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include #include diff --git a/servicecmd/help.c b/servicecmd/help.c index 6cd816e..4fa9951 100644 --- a/servicecmd/help.c +++ b/servicecmd/help.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "servicecmd.h" extern char *__progname; diff --git a/servicecmd/list.c b/servicecmd/list.c index 2286197..aad70d6 100644 --- a/servicecmd/list.c +++ b/servicecmd/list.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include "servicecmd.h" #include "service.h" #include "config.h" diff --git a/servicecmd/servicecmd.c b/servicecmd/servicecmd.c index 278afaf..ff37740 100644 --- a/servicecmd/servicecmd.c +++ b/servicecmd/servicecmd.c @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #include #include diff --git a/servicecmd/servicecmd.h b/servicecmd/servicecmd.h index ce5e58f..27204d0 100644 --- a/servicecmd/servicecmd.h +++ b/servicecmd/servicecmd.h @@ -1,3 +1,20 @@ +/* SPDX-License-Identifier: GPL-3.0-or-later */ +/* + * Copyright (C) 2018 - David Oberhollenzer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ #ifndef SERVICECMD_H #define SERVICECMD_H @@ -8,21 +25,46 @@ #include "util.h" +/* + Describes a command that can be launched by passing its name as + second command line argument to the main() function (i.e. immediately + after the actual program name). + + Short and long descriptions can be provided to print out help text. + + The main() function calls into a callback in this structure to execute + the command. +*/ typedef struct command_t { struct command_t *next; - const char *cmd; - const char *usage; - const char *s_desc; - const char *l_desc; + const char *cmd; /* command name */ + const char *usage; /* list of possible arguments */ + const char *s_desc; /* short description used by help */ + const char *l_desc; /* long description used by help */ + /* + Semantics are the same as for main(). Called from main() + function with first argument (i.e. top level program name) + removed. + */ int (*run_cmd)(int argc, char **argv); } command_t; +/* Global list of available commands */ extern command_t *commands; +/* + Implemented in servicecmd.c. Prints program usage message and + terminates with the given exit status. +*/ void usage(int status) NORETURN; +/* + To implement a new command, add a global, static instance of a + command_t (or derived) structure to a C file and pass it to this + macro to have it automatically registered on program startup. +*/ #define REGISTER_COMMAND(cmd) \ static void __attribute__((constructor)) register_##cmd(void) \ { \