From 0867c8acab709b584168eeab5f9cdff8810326db Mon Sep 17 00:00:00 2001 From: Laurence Withers Date: Mon, 9 Oct 2006 16:21:24 +0100 Subject: [PATCH] Initial import --- .gitignore | 2 + COPYING | 278 +++++++++++++++++++++++++++++++ README | 25 +++ make.sh | 292 +++++++++++++++++++++++++++++++++ mini-at.kdevelop | 168 +++++++++++++++++++ mini-at.kdevelop.filelist | 4 + run-test.sh | 54 ++++++ scripts/.gitignore | 12 ++ scripts/functions.sh | 68 ++++++++ src/mini-at/.params | 1 + src/mini-at/TopSource.c | 19 +++ src/mini-at/build.app | 41 +++++ src/mini-at/build.default | 1 + src/mini-at/build.install | 1 + src/mini-at/build.install-app | 12 ++ src/mini-at/build.monolithic | 18 ++ src/mini-atd/.params | 1 + src/mini-atd/TopSource.c | 29 ++++ src/mini-atd/build.app | 41 +++++ src/mini-atd/build.default | 1 + src/mini-atd/build.install | 1 + src/mini-atd/build.install-app | 12 ++ src/mini-atd/build.monolithic | 18 ++ src/mini-atd/main.c | 144 ++++++++++++++++ src/mini-atd/setup.c | 179 ++++++++++++++++++++ src/mini-atd/time.c | 228 +++++++++++++++++++++++++ src/mini-atd/util.c | 72 ++++++++ version | 19 +++ 28 files changed, 1741 insertions(+) create mode 100644 .gitignore create mode 100644 COPYING create mode 100644 README create mode 100755 make.sh create mode 100644 mini-at.kdevelop create mode 100644 mini-at.kdevelop.filelist create mode 100755 run-test.sh create mode 100644 scripts/.gitignore create mode 100755 scripts/functions.sh create mode 100644 src/mini-at/.params create mode 100644 src/mini-at/TopSource.c create mode 100644 src/mini-at/build.app create mode 100644 src/mini-at/build.default create mode 100644 src/mini-at/build.install create mode 100644 src/mini-at/build.install-app create mode 100644 src/mini-at/build.monolithic create mode 100644 src/mini-atd/.params create mode 100644 src/mini-atd/TopSource.c create mode 100644 src/mini-atd/build.app create mode 100644 src/mini-atd/build.default create mode 100644 src/mini-atd/build.install create mode 100644 src/mini-atd/build.install-app create mode 100644 src/mini-atd/build.monolithic create mode 100644 src/mini-atd/main.c create mode 100644 src/mini-atd/setup.c create mode 100644 src/mini-atd/time.c create mode 100644 src/mini-atd/util.c create mode 100644 version diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d025740 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +obj +html diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..d28d2c7 --- /dev/null +++ b/COPYING @@ -0,0 +1,278 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. diff --git a/README b/README new file mode 100644 index 0000000..fa95696 --- /dev/null +++ b/README @@ -0,0 +1,25 @@ +mini-at +======================================================================== +(c)2006, Laurence Withers, . +Released under the GNU GPLv2. See file COPYING or +http://www.gnu.org/copyleft/gpl.html for details. + +Really Quick Instructions +------------------------- + +To build: ./make.sh +To install: ./make.sh install + (you might want to set PREFIX, by default it's /usr/local) + +Rationale +--------- + +Why this and not the standard `at' suite? + + 1) Deals with non-monotonic time (unfortunately this means we have to + wake up once every so often to check if our time is too far out). + 2) Simpler specification of timestamp (uses ISO8601). + 3) Allows redirection of stdin from a file which is automatically + deleted. + 4) Flexible user control through use of Uinx sockets. + diff --git a/make.sh b/make.sh new file mode 100755 index 0000000..f8858d5 --- /dev/null +++ b/make.sh @@ -0,0 +1,292 @@ +#!/bin/bash +# mini-at/make.sh +# +# (c)2006, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + + +# This file is the script used to build mini-at. There are some +# options that can be edited; these are set below (or you can pass them +# in as variables). +[ -z "${CC}" ] && CC="gcc" +[ -z "${CXX}" ] && CXX="g++" +[ -z "${CFLAGS}" ] && CFLAGS="-g -O2 -W -Wall" +[ -z "${PREFIX}" ] && PREFIX="/usr/local" +[ -z "${LIBDIR}" ] && LIBDIR="${PREFIX}/lib" +[ -z "${BINDIR}" ] && BINDIR="${PREFIX}/bin" +[ -z "${INCLUDEDIR}" ] && INCLUDEDIR="${PREFIX}/include" +[ -z "${DOCSDIR}" ] && DOCSDIR="${PREFIX}/share/doc/mini-at" + +# for pkg-config +[ -z "${PKGCONFDIR}" ] && PKGCONFDIR="${LIBDIR}/pkgconfig" +[ -z "${FINALLIBDIR}" ] && FINALLIBDIR="${LIBDIR}" +[ -z "${FINALINCLUDEDIR}" ] && FINALINCLUDEDIR="${INCLUDEDIR}" + +# for SDCC-built firmware +[ -z "${HEXDIR}" ] && HEXDIR="${PREFIX}/share/firmware" +[ -z "${SDCC}" ] && SDCC="sdcc" + + + +# Get version information +source version || exit 1 +VERSION="${VERMAJOR}.${VERMINOR}.${VERMICRO}" +if [ ! -z "${VEREXTRA}" ] +then + VERSION="${VERSION}-${VEREXTRA}" +fi + + + +# Get standard functions +[ -z "${VERBOSE}" ] && VERBOSE="0" +source scripts/functions.sh || exit 1 + + +# List of directories which will be emptied by clean. +OUTPUT_DIRS="obj html" + + + +# This function makes a monolithic file out of several source files. Its +# first argument is the name of the output file, and the second is the +# format of monolithic file to create (for example, "C" will cause the +# inclusion of "#line" directives at the top of each included file). +# +# It also examines the following variables: +# MONOLITHIC_TESTS if any file mentioned in this list is newer +# than the output file, then we recreate it +# MONOLITHIC_SOURCE a list (in order) of the source files +# +# Recognised formats are: +# none no special processing happens before each file +# C #line directives are inserted before each file +# and VERSION, VERMAJOR etc. are #defined +# Ch Like C, but for header files (no VERSION #defines) +# +make_monolithic() { + if [ $# -ne 2 ] + then + print_failure "make_monolithic() called with wrong number of arguments" + print_failure "(expecting 2, got $#)" + return 1 + fi + + MONOLITHIC_OUT=$1 + + # extract options + HASHLINE=0 + VERDEFINE=0 + if [ "$2" == "C" ] + then + HASHLINE=1 + VERDEFINE=1 + elif [ "$2" == "Ch" ] + then + HASHLINE=1 + elif [ "$2" == "none" ] + then + HASHLINE=0 # dummy command + else + print_failure "make_monolithic() called with unknown format $2" + return 1 + fi + + echo " Building monolithic file '${MONOLITHIC_OUT}'..." + + MODIFIED=0 + for FILE in ${MONOLITHIC_TESTS} ${MONOLITHIC_SOURCE} + do + if [ ! -e "${FILE}" ] + then + print_failure "'${FILE}' does not exist" + return 1 + fi + + if [ "${FILE}" -nt ${MONOLITHIC_OUT} ] + then + MODIFIED=1 + break + fi + done + + if [ ${MODIFIED} -ne 0 ] + then + do_cmd mkdir -p $(dirname ${MONOLITHIC_OUT}) + do_cmd rm -f ${MONOLITHIC_OUT} || exit 1 + + if [ ${VERDEFINE} -ne 0 ] + then + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERSION \"${VERSION}\"" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERMAJOR ${VERMAJOR}" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERMINOR ${VERMINOR}" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VERMICRO ${VERMICRO}" || return 1 + do_cmd_redir ${MONOLITHIC_OUT} echo "#define VEREXTRA \"${VEREXTRA}\"" || return 1 + fi + + for FILE in ${MONOLITHIC_SOURCE} + do + if [ ${HASHLINE} -ne 0 ] + then + do_cmd_redir ${MONOLITHIC_OUT} echo "#line 1 \"${FILE}\"" || return 1 + fi + do_cmd_redir ${MONOLITHIC_OUT} cat "${FILE}" || return 1 + done + print_success "Done" + else + print_success "Up to date" + fi +} + + + +# This will build a directory tree, if required, with mode 0755. The +# argument is the directory to build. +build_dir_tree() { + # sanity check + if [ $# -ne 1 ] + then + print_failure "build_dir_tree() called with wrong number of arguments" + print_failure "(expecting 1, got $#)" + return 1 + fi + + local DIR="$1" + + # if the directory already exists, return success + [ -d "${DIR}" ] && return 0 + + # if something with this name already exists, but not a directory, + # then fail + if [ -e "${DIR}" ] + then + print_failure "Failed to create directory '${DIR}'" + return 1 + fi + + # build the directory, but if it fails, recurse a level (and handle + # the case where recursion fails) + mkdir "${DIR}" >& /dev/null + if [ $? -ne 0 ] + then + build_dir_tree $(dirname "${DIR}") || return 1 + mkdir "${DIR}" + if [ $? -ne 0 ] + then + print_failure "Failed to create directory '${DIR}'" + return 1 + fi + fi + + # set permissions on newly-created dir and return + chmod 0755 "${DIR}" + return 0 +} + + + +# This will install a file. The first parameter is the source, and the +# second is the destination. The third is the octal mode. +install_file() { + # figure out if $2 is a directory or not + DEST_FILE="$2" + [ -d "$2" ] && DEST_FILE="$2/$(basename $1)" + + echo " Installing: '$1' -> '$2'" + do_cmd cp -fP "$1" "${DEST_FILE}" || return 1 + do_cmd chmod "$3" "${DEST_FILE}" || return 1 + + return 0 +} + + + +# This will install a header file. It is basically similar to +# install_file(), only we strip out the #line directives. +install_header() { + DEST_FILE="$2" + [ -d "$2" ] && DEST_FILE="$2/$(basename $1)" + + echo " Installing header: '$1' -> '$2'" + do_cmd rm -f ${DEST_FILE} || exit 1 + do_cmd_redir ${DEST_FILE} sed -e "s,^#line.*,," $1 || exit 1 + do_cmd chmod "$3" "${DEST_FILE}" || return 1 + + return 0 +} + + + +# This installs a symlink. The first argument is the symlink's name; the +# second the symlink's source filename, and the third is the directory +# in which to create the symlink. +install_symlink() { + echo " Installing symlink: '$3/$2' -> '$1'" + + ( do_cmd cd $3; ln -sf $2 $1 ) || return 1 + + return 0 +} + + + +build_target() { + ITEMS="src/$1/build.default" + if [ ! -e "${ITEMS}" ] + then + ITEMS="$(find src -type f -name build.$1)" + fi + + if [ -z "${ITEMS}" ] + then + print_failure "Unrecognised target '$1'" + return 1 + fi + + for item in ${ITEMS} + do + do_cmd source ${item} || exit 1 + done + return 0 +} + + + +######################################################################## +# Main script +######################################################################## + +if [ $# -eq 0 ] +then + targets="default" +else + targets="$@" +fi + +for func in ${targets} +do + case ${func} in + clean) + echo "Cleaning..." + rm -rf ${OUTPUT_DIRS} + print_success "Done" + ;; + + # bad Kdevelop! bad! + -j1) + ;; + -k) + ;; + + *) + build_target ${func} || exit 1 + ;; + esac +done + +exit 0 + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/mini-at.kdevelop b/mini-at.kdevelop new file mode 100644 index 0000000..2ddbc5e --- /dev/null +++ b/mini-at.kdevelop @@ -0,0 +1,168 @@ + + + + Laurence Withers + l@lwithers.me.uk + $VERSION$ + KDevCustomProject + C++ + + . + false + + + + + + /bin/true + executable + / + + false + true + + + + make + + + + false + 1 + 0 + false + ./make.sh + default + + default + + + + + + + + + + + + + + + + + true + false + false + + + false + true + 10 + + + + + ada + ada_bugs_gcc + bash + bash_bugs + clanlib + fortran_bugs_gcc + gnome1 + gnustep + gtk + gtk_bugs + haskell + haskell_bugs_ghc + java_bugs_gcc + java_bugs_sun + kde2book + opengl + pascal_bugs_fp + php + php_bugs + perl + perl_bugs + python + python_bugs + qt-kdev3 + ruby + ruby_bugs + sdl + sw + w3c-dom-level2-html + w3c-svg + w3c-uaag10 + wxwidgets_bugs + + + Guide to the Qt Translation Tools + Qt Assistant Manual + Qt Designer Manual + Qt Reference Documentation + qmake User Guide + + + KDE Libraries (Doxygen) + + + + + + + + + + + + .h + .cpp + + + + + true + true + true + false + true + true + true + 1 + 1 + 250 + + + + set + m_,_ + theValue + true + true + + + + + + + + + + + + + false + false + + + *.o,*.lo,CVS + false + false + + + + + + + diff --git a/mini-at.kdevelop.filelist b/mini-at.kdevelop.filelist new file mode 100644 index 0000000..81bce2d --- /dev/null +++ b/mini-at.kdevelop.filelist @@ -0,0 +1,4 @@ +# KDevelop Custom Project File List +src/lib/BottomHeader.h +src/lib/TopHeader.h +src/lib/TopSource.cpp diff --git a/run-test.sh b/run-test.sh new file mode 100755 index 0000000..01bfae2 --- /dev/null +++ b/run-test.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# mini-at/test.sh +# +# (c)2006, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + +# Running this script on its own will display a summary of all the +# available tests; running it with arguments runs the relevant test. + + + +# This runs a test, setting the correct library path. +run_test() { + EXE=obj/tests/$1 + shift + if [ ! -x ${EXE} ] + then + echo "No such test '${EXE}'" + return 1 + fi + + LD_LIBRARY_PATH="obj" ${EXE} "$@" || return 1 + return 0 +} + + + +# This prints summary output from each test app. +print_tests() { + echo "Available tests" + echo "---------------------------------------------------------------------" + for EXE in obj/tests/* + do + [ -x ${EXE} ] || continue + NAME=$(echo ${EXE} | sed 's,obj/tests/,,') + echo -ne "${NAME}\t" + LD_LIBRARY_PATH="obj" ${EXE} --print-summary + done +} + + +# Main script +if [ $# -eq 0 ] +then + print_tests + exit 0 +fi + +run_test $* + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/scripts/.gitignore b/scripts/.gitignore new file mode 100644 index 0000000..a540f48 --- /dev/null +++ b/scripts/.gitignore @@ -0,0 +1,12 @@ +build.c++.app +build.c++.lib +build.c++.qtapp +build.c++.tests +build.c.app +build.c.lib +build.c.tests +build.doxygen.docs +build.none.files +build.sdcc.firmware +module-create.sh +release.sh diff --git a/scripts/functions.sh b/scripts/functions.sh new file mode 100755 index 0000000..2cf4998 --- /dev/null +++ b/scripts/functions.sh @@ -0,0 +1,68 @@ +#!/bin/bash +# mini-at/scripts/functions.sh +# +# (c)2006, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + +# Common functions + + + +# Print a success message +print_success() { + if [ -z "${TERM}" -o "${TERM}" == "dumb" ] + then + echo -n " - " + else + (echo -n -e " \E[32m* "; tput sgr0) + fi + echo $* +} + + + +# Print a failure message +print_failure() { + if [ -z "${TERM}" -o "${TERM}" == "dumb" ] + then + echo -n " *** " + else + (echo -n -e " \E[31m*** "; tput sgr0) + fi + echo $* +} + + + +# This function carries out a command, but reports its failure if +# necessary. +do_cmd() { + [ "${VERBOSE}" != "0" ] && echo "$@" + "$@" + if [ $? -ne 0 ] + then + print_failure "'$@' failed." + return 1 + fi +} + + + +# This function carries out a command, but reports its failure if +# necessary. +do_cmd_redir() { + DEST=$1 + shift + [ "${VERBOSE}" != "0" ] && echo "$@ >> ${DEST}" + "$@" >> ${DEST} + if [ $? -ne 0 ] + then + print_failure "'$@' failed." + return 1 + fi +} + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-at/.params b/src/mini-at/.params new file mode 100644 index 0000000..c97698f --- /dev/null +++ b/src/mini-at/.params @@ -0,0 +1 @@ +c app mini-at diff --git a/src/mini-at/TopSource.c b/src/mini-at/TopSource.c new file mode 100644 index 0000000..53f66d9 --- /dev/null +++ b/src/mini-at/TopSource.c @@ -0,0 +1,19 @@ +/* mini-at/src/mini-at/TopSource.c + * + * (c)2006, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +// Below are all the includes used throughout the application. + + +int main(void) +{ + return 0; +} + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/mini-at/build.app b/src/mini-at/build.app new file mode 100644 index 0000000..064ba34 --- /dev/null +++ b/src/mini-at/build.app @@ -0,0 +1,41 @@ +# These are external variables, and shouldn't clash with anything else +# mini_at +# mini_at_BUILT +# + +if [ -z ${mini_at_BUILT} ] +then + mini_at="obj/mini-at" + EXTRAS="" # @TODO@ cflags, libs + + echo "Building application ${mini_at}..." + + do_cmd source src/mini-at/build.monolithic || return 1 + + MODIFIED=0 + for test in ${MONOLITHIC_TESTS} ${SRC} + do + if [ ${test} -nt ${mini_at} ] + then + MODIFIED=1 + break + fi + done + + if [ ${MODIFIED} -ne 0 ] + then + echo " Compiling..." + + do_cmd ${CC} ${CFLAGS} -I obj -o "${mini_at}" ${SRC} ${EXTRAS} || return 1 + + print_success "Application built" + else + print_success "Application up to date" + fi + + mini_at_BUILT=1 + +fi + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-at/build.default b/src/mini-at/build.default new file mode 100644 index 0000000..45af402 --- /dev/null +++ b/src/mini-at/build.default @@ -0,0 +1 @@ +source src/mini-at/build.app diff --git a/src/mini-at/build.install b/src/mini-at/build.install new file mode 100644 index 0000000..7a1260c --- /dev/null +++ b/src/mini-at/build.install @@ -0,0 +1 @@ +source src/mini-at/build.install-app diff --git a/src/mini-at/build.install-app b/src/mini-at/build.install-app new file mode 100644 index 0000000..3ee2a81 --- /dev/null +++ b/src/mini-at/build.install-app @@ -0,0 +1,12 @@ +build_target mini-at + +# make paths (this is for Gentoo in particular) +build_dir_tree "${BINDIR}" || return 1 + +# install binary +echo "Installing binaries into '${BINDIR}'" +install_file "${mini_at}" "${BINDIR}" 0755 || return 1 +print_success "Done" + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-at/build.monolithic b/src/mini-at/build.monolithic new file mode 100644 index 0000000..c2f3f5e --- /dev/null +++ b/src/mini-at/build.monolithic @@ -0,0 +1,18 @@ +# These are external variables, and shouldn't clash with anything else +# mini_at_MONOLITHIC +# + +SRC="obj/mini-at.c" +MONOLITHIC_TESTS="src/mini-at/build.app src/mini-at/build.monolithic" + +if [ -z "${mini_at_MONOLITHIC}" ] +then + MONOLITHIC_SOURCE="$(echo src/mini-at/TopSource.c)" + make_monolithic ${SRC} C || return 1 + + mini_at_MONOLITHIC=1 + MONOLITHIC_DOC="${MONOLITHIC_DOC} ${SRC}" +fi + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-atd/.params b/src/mini-atd/.params new file mode 100644 index 0000000..34e1bb0 --- /dev/null +++ b/src/mini-atd/.params @@ -0,0 +1 @@ +c app mini-atd diff --git a/src/mini-atd/TopSource.c b/src/mini-atd/TopSource.c new file mode 100644 index 0000000..7e61f58 --- /dev/null +++ b/src/mini-atd/TopSource.c @@ -0,0 +1,29 @@ +/* mini-at/src/mini-atd/TopSource.c + * + * (c)2006, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + +// Below are all the includes used throughout the application. +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/mini-atd/build.app b/src/mini-atd/build.app new file mode 100644 index 0000000..2007c58 --- /dev/null +++ b/src/mini-atd/build.app @@ -0,0 +1,41 @@ +# These are external variables, and shouldn't clash with anything else +# mini_atd +# mini_atd_BUILT +# + +if [ -z ${mini_atd_BUILT} ] +then + mini_atd="obj/mini-atd" + EXTRAS="-D_GNU_SOURCE" + + echo "Building application ${mini_atd}..." + + do_cmd source src/mini-atd/build.monolithic || return 1 + + MODIFIED=0 + for test in ${MONOLITHIC_TESTS} ${SRC} + do + if [ ${test} -nt ${mini_atd} ] + then + MODIFIED=1 + break + fi + done + + if [ ${MODIFIED} -ne 0 ] + then + echo " Compiling..." + + do_cmd ${CC} ${CFLAGS} -I obj -o "${mini_atd}" ${SRC} ${EXTRAS} || return 1 + + print_success "Application built" + else + print_success "Application up to date" + fi + + mini_atd_BUILT=1 + +fi + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-atd/build.default b/src/mini-atd/build.default new file mode 100644 index 0000000..bc5d323 --- /dev/null +++ b/src/mini-atd/build.default @@ -0,0 +1 @@ +source src/mini-atd/build.app diff --git a/src/mini-atd/build.install b/src/mini-atd/build.install new file mode 100644 index 0000000..bad6698 --- /dev/null +++ b/src/mini-atd/build.install @@ -0,0 +1 @@ +source src/mini-atd/build.install-app diff --git a/src/mini-atd/build.install-app b/src/mini-atd/build.install-app new file mode 100644 index 0000000..9f19cd0 --- /dev/null +++ b/src/mini-atd/build.install-app @@ -0,0 +1,12 @@ +build_target mini-atd + +# make paths (this is for Gentoo in particular) +build_dir_tree "${BINDIR}" || return 1 + +# install binary +echo "Installing binaries into '${BINDIR}'" +install_file "${mini_atd}" "${BINDIR}" 0755 || return 1 +print_success "Done" + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-atd/build.monolithic b/src/mini-atd/build.monolithic new file mode 100644 index 0000000..859b8e8 --- /dev/null +++ b/src/mini-atd/build.monolithic @@ -0,0 +1,18 @@ +# These are external variables, and shouldn't clash with anything else +# mini_atd_MONOLITHIC +# + +SRC="obj/mini-atd.c" +MONOLITHIC_TESTS="src/mini-atd/build.app src/mini-atd/build.monolithic" + +if [ -z "${mini_atd_MONOLITHIC}" ] +then + MONOLITHIC_SOURCE="$(echo src/mini-atd/{TopSource,setup,util,time,main}.c)" + make_monolithic ${SRC} C || return 1 + + mini_atd_MONOLITHIC=1 + MONOLITHIC_DOC="${MONOLITHIC_DOC} ${SRC}" +fi + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4 diff --git a/src/mini-atd/main.c b/src/mini-atd/main.c new file mode 100644 index 0000000..a479e0b --- /dev/null +++ b/src/mini-atd/main.c @@ -0,0 +1,144 @@ +/* mini-at/src/mini-atd/main.c + * + * (c)2006, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +void version(void) +{ + printf("mini-atd " VERSION "\n" + "(c)2006, Laurence Withers.\n"); +} + + + +void usage(void) +{ + printf("Usage:\n\n" + " mini-atd [options]\n\n" + "Options:\n" + "-h, --help Display this screen.\n" + "-V, --version Display version.\n" + "-D, --daemon Daemonise.\n" + "-s, --socket Name of socket file (default: ~/.mini-atd).\n" + "-p, --permissions Octal permissions of socket (default: 0600).\n" + "\n"); +} + + + +struct option options[] = { + { "help", no_argument, 0, 'h' }, + { "version", no_argument, 0, 'V' }, + { "daemon", no_argument, 0, 'D' }, + { "socket", required_argument, 0, 's' }, + { "permissions", required_argument, 0, 'p' }, + { 0, 0, 0, 0 } +}; + + + +int main(int argc, char* argv[]) +{ + const char* socket = 0; + char* endp; + int perms = -1, daemon = 0, fd = -1; + char fn_buf[sizeof(struct sockaddr_un) - sizeof(int)]; // not perfect, but solves build errors + + // process commandline options + while(1) { + switch(getopt_long(argc, argv, "hVs:p:", options, 0)) { + case -1: + goto done; + + case 'h': + usage(); + return 0; + + case 'V': + version(); + return 0; + + case 'D': + daemon++; + break; + + case 's': + if(socket) { + fprintf(stderr, "Cannot specify name of socket twice.\n"); + return 1; + } + socket = optarg; + break; + + case 'p': + if(perms != -1) { + fprintf(stderr, "Cannot specify permissions twice.\n"); + return 1; + } + + endp = 0; + errno = 0; + perms = strtol(optarg, &endp, 8); + if(errno || !endp || *endp) { + fprintf(stderr, "Invalid mode string `%s'.\n", optarg); + return 1; + } + + if(perms < 0 || perms > 03777) { + fprintf(stderr, "Invalid mode %04o.\n", perms); + return 1; + } + break; + + default: + // getopt() already printed an error message + return -1; + } + } + +done: + // defaults if not specified + if(!socket) { + endp = getenv("HOME"); + if(!endp) { + fprintf(stderr, "${HOME} not set; cannot construct socket filename.\n"); + return 1; + } + snprintf(fn_buf, sizeof(fn_buf) - 1, "%s/.mini-atd", endp); + fn_buf[sizeof(fn_buf) - 1] = 0; + } else { + strncpy(fn_buf, socket, sizeof(fn_buf) - 1); + fn_buf[sizeof(fn_buf) - 1] = 0; + } + if(perms == -1) perms = 0600; + + // setup + if(daemon && daemonise()) return 1; + setup_signals(); + fd = setup_socket(fn_buf, perms); + if(fd == -1) return 1; + + // process + while(!Quit) { +// if(process_socket(fd)) return 1; + sleep(1); + } + + // clean up + close(fd); + unlink(fn_buf); + + // done + return 0; +} + + + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/mini-atd/setup.c b/src/mini-atd/setup.c new file mode 100644 index 0000000..a041afe --- /dev/null +++ b/src/mini-atd/setup.c @@ -0,0 +1,179 @@ +/* mini-at/src/mini-atd/setup.c + * + * (c)2006, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +/* Daemon + * + * Global flag which records whether or not we're daemonised. In daemon mode, we LOG() to syslog; + * otherwise, we LOG() to stdout/stderr. + */ +int Daemon = 0; + + + +/* LOG(), do_log() + * + * The logging system. + */ +#define LOG(_level, _fmt, ...) do { \ + do_log(_level, "%s:%d: %s: " _fmt, __FILE__, __LINE__, __FUNCTION__ , ##__VA_ARGS__); \ +}while(0) +void do_log(int level, const char* fmt, ...) +{ + va_list va; + + va_start(va, fmt); + + if(Daemon) { + vsyslog(level, fmt, va); + } else { + FILE* out = stdout; + + switch(level) { + case LOG_WARNING: + case LOG_ERR: + case LOG_CRIT: + case LOG_ALERT: + case LOG_EMERG: + out = stderr; + } + + vfprintf(out, fmt, va); + fputc('\n', out); + } + + va_end(va); +} + + + +/* daemonise() + * + * Turns us into a daemon. Returns 0 on success. + */ +int daemonise(void) +{ + // normal daemon stuff + switch(fork()) { + case -1: + perror("fork"); + return 1; + + case 0: + // child + break; + + default: + // parent + exit(0); + } + + if(setsid() == -1) { + perror("setsid"); + return 1; + } + + // switch LOG() over to syslog + ++Daemon; + openlog("mini-atd", 0, LOG_DAEMON); + + // close file descriptors, re-open on /dev/null + close(0); + close(1); + close(2); + if(open("/dev/null", O_RDWR) == -1 || dup(0) == -1 || dup(1) == -1) { + LOG(LOG_CRIT, "Opening /dev/null or dup() failed - %s (%d).", + strerror(errno), errno); + return 123; + } + + return 0; +} + + + +/* setup_socket() + * + * Sets up a unix socket with the given name and permissions. Returns file descriptor on success, + * or -1 on error. + */ +int setup_socket(const char* name, int perms) +{ + int fd; + long flags; + struct sockaddr_un addr; + + // create socket structure + fd = socket(PF_UNIX, SOCK_DGRAM, 0); + if(fd == -1) { + LOG(LOG_CRIT, "Creating new socket with socket() failed - %s (%d).", + strerror(errno), errno); + return -1; + } + + // set non-blocking mode + if( (flags = fcntl(fd, F_GETFL, 0)) == -1 || fcntl(fd, F_SETFL, flags | O_NONBLOCK)) { + LOG(LOG_CRIT, "Couldn't set non-blocking mode on fd %d - %s (%d).", + fd, strerror(errno), errno); + return -1; + } + + // bind to filename we were passed + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strcpy(addr.sun_path, name); // main() ensures it is less than UNIX_PATH_MAX bytes + + if(bind(fd, (struct sockaddr*)&addr, sizeof(addr))) { + LOG(LOG_CRIT, "Couldn't bind socket (fd %d) to file ``%s'' - %s (%d).", + fd, name, strerror(errno), errno); + close(fd); + return -1; + } + + // set permissions + if(fchmod(fd, perms)) { + LOG(LOG_CRIT, "Couldn't set permissions %04o on socket ``%s'' (fd %d) - %s (%d).", + perms, name, fd, strerror(errno), errno); + close(fd); + unlink(name); + return -1; + } + + return fd; +} + + + +/* setup_signals(), signal_handler(), Quit + * + * Our signal handling mechanism. We want to exit cleanly on SIGINT or SIGTERM (these will set the + * global variable Quit). Otherwise, we want to abort. + */ +volatile int Quit = 0; + +void signal_handler(int sig) +{ + LOG(LOG_NOTICE, "Received signal %d, send again to force quit now.", sig); + Quit = 1; + + // restore default signal handler to force quit next time + signal(sig, SIG_DFL); +} + +void setup_signals(void) +{ + signal(SIGINT, signal_handler); + signal(SIGTERM, signal_handler); +} + + + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/mini-atd/time.c b/src/mini-atd/time.c new file mode 100644 index 0000000..6b60cd3 --- /dev/null +++ b/src/mini-atd/time.c @@ -0,0 +1,228 @@ +/* mini-at/src/mini-atd/time.c + * + * (c)2006, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +/* struct time_db_entry + * + * A structure which holds a single entry for a command. It has the date at which the command will + * be run, the command, its arguments, and potentially a filename from which stdin will be + * redirected. It is part of a linked list. + */ +struct time_db_entry { + time_t when; // when do we run it? + char* path; // path to program + int num_args; // number of arguments + char** args; // list of arguments + char* in; // possible input filename + + struct time_db_entry* next; +}; + + + +/* struct time_db + * + * Holds a list of commands. The list must be sorted. Also holds a variable array of PIDs which we + * are waiting on for exit status. + */ +struct time_db { + struct time_db_entry* head; + + pid_t* pids, * pids2; + int num_pids, sz_pids; +}; + + + +/* free_time_db_entry() + * + * Frees a time database entry (frees memory associated with it and unlinks any temporary files + * associated with it). + */ +void free_time_db_entry(struct time_db_entry* t) +{ + int i; + + free(t->path); + for(i = 0; i < t->num_args; ++i) free(t->args[i]); + free(t->args); + if(t->in) unlink(t->in); + free(t->in); + + free(t); +} + + + +/* process_time_db_entry() + * + * Runs a time database entry. + */ +pid_t process_time_db_entry(const struct time_db_entry* t) +{ + pid_t pid; + + LOG(LOG_INFO, "Running program ``%s'' (%d args).", t->path, t->num_args); + + switch( (pid = fork()) ) { + case -1: + LOG(LOG_ALERT, "fork() failed - %s (%d) - couldn't run command.", strerror(errno), errno); + return -1; + + case 0: + // child + break; + + default: + // parent -- return PID + return pid; + } + + // if we have an input file, we should redirect stdin from there + if(t->in) { + close(0); + if(open(t->in, O_RDONLY) == -1) { + LOG(LOG_ERR, "Couldn't redirect stdin from ``%s'' for command ``%s'' - %s (%d).", + t->in, t->path, strerror(errno), errno); + _exit(1); // this is the child we are exiting, not the parent + } + } + + // now run the new process, inheriting the current environment + execve(t->path, t->args, environ); + LOG(LOG_ERR, "Couldn't run command ``%s'' - %s (%d).", + t->path, strerror(errno), errno); + _exit(1); // child, not parent +} + + + +/* process_time_db() + * + * Processes the time database structure `tdb', running all commands for which we have entries, and + * removing them from the list. Also wait()s on any PIDs we have spawned. + */ +void process_time_db(struct time_db* tdb) +{ + struct time_db_entry* iter, * next; + time_t now; + int i, j, status; + pid_t pid, * pids; + + // clean up children + for(j = 0, i = 0; i < tdb->num_pids; ++i) { + switch(waitpid(tdb->pids[i], &status, WNOHANG)) { + case 0: // nothing exited + // copy to new list + tdb->pids2[j++] = tdb->pids[i]; + break; + + case -1: // error + LOG(LOG_WARNING, "waitpid(%d) returned error - %s (%d).", + tdb->pids[i], strerror(errno), errno); + break; + + default: // exited + if(WIFSIGNALED(status)) { + LOG(LOG_INFO, "process %d killed by signal %d.", + tdb->pids[i], WTERMSIG(status)); + } else if(WIFEXITED(status)) { + LOG(LOG_INFO, "process %d exited with status %d.", + tdb->pids[i], WEXITSTATUS(status)); + } else { + LOG(LOG_INFO, "process %d exited via unknown method %x.", + tdb->pids[i], status); + } + break; // we no longer track this PID + } + } + // swap tables + pids = tdb->pids; + tdb->pids = tdb->pids2; + tdb->pids2 = pids; + tdb->num_pids = j; + + // process the list of commands (sorted) + time(&now); + + iter = tdb->head; + while(iter && now <= iter->when) { + // run this command + pid = process_time_db_entry(iter); + if(pid != -1) { + // add to children list + if(tdb->num_pids == tdb->sz_pids) { + // resize array + if(tdb->sz_pids) tdb->sz_pids <<= 1; + else tdb->sz_pids = 4; + + tdb->pids = safe_realloc(tdb->pids, tdb->sz_pids * sizeof(pid_t)); + tdb->pids2 = safe_realloc(tdb->pids2, tdb->sz_pids * sizeof(pid_t)); + } + + tdb->pids[tdb->num_pids++] = pid; + } + + // free up from linked list + next = iter->next; + free_time_db_entry(iter); + tdb->head = next; + iter = next; + } +} + + + +/* free_time_db() + * + * Frees the time database and any entries associated with it. This will clean up all temporary + * files used for stdin redirection. + */ +void free_time_db(struct time_db* tdb) +{ + struct time_db_entry* iter, * next; + + for(iter = tdb->head; iter; iter = next) { + next = iter->next; + free_time_db_entry(iter); + } + + free(tdb->pids); + free(tdb->pids2); + free(tdb); +} + + + +/* add_time_db_entry() + * + * Adds an entry `t' into the time database `tdb'. Does a sorted list insert. + */ +void add_time_db_entry(struct time_db* tdb, struct time_db_entry* t) +{ + struct time_db_entry* iter, * prev; + + prev = 0; + iter = tdb->head; + while(iter) { + if(t->when <= iter->when) break; + prev = iter; + iter = iter->next; + } + t->next = iter; + + if(prev) prev->next = t; + else tdb->head = t; +} + + + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/src/mini-atd/util.c b/src/mini-atd/util.c new file mode 100644 index 0000000..64a4b21 --- /dev/null +++ b/src/mini-atd/util.c @@ -0,0 +1,72 @@ +/* mini-at/src/mini-atd/util.c + * + * (c)2006, Laurence Withers, . + * Released under the GNU GPLv2. See file COPYING or + * http://www.gnu.org/copyleft/gpl.html for details. +*/ + + + +/* safe_malloc() + * + * Allocates `n' bytes, aborting the program if we run out of memory. Always retruns a valid + * pointer. Clears memory. + */ +void* safe_malloc(size_t n) +{ + void* p; + + p = malloc(n); + if(!p) { + LOG(LOG_CRIT, "error allocating %lu bytes of memory (%d - %s)", + (unsigned long)n, errno, strerror(errno)); + abort(); + } + memset(p, 0, n); + return p; +} + + + +/* safe_realloc() + * + * Reallocates `p' so that it is `n' bytes in size, aborting the program if we run out of memory. + * Always returns a valid pointer. Semantics as realloc(3). + */ +void* safe_realloc(void* p, size_t n) +{ + p = realloc(p, n); + if(!p) { + LOG(LOG_CRIT, "error reallocating %lu bytes of memory (%d - %s)", + (unsigned long)n, errno, strerror(errno)); + abort(); + } + return p; +} + + + +/* safe_strdup() + * + * Returns a newly-malloc()ed duplicate of `s', aborting the program if we run out of memory. + * Always returns a valid pointer. + */ +char* safe_strdup(const char* s) +{ + char* p; + + p = strdup(s); + if(!p) { + LOG(LOG_CRIT, "error allocating %lu bytes of memory (%d - %s)", + (unsigned long)(strlen(s)), errno, strerror(errno)); + abort(); + } + return p; +} + + + +/* options for text editors +kate: replace-trailing-space-save true; space-indent true; tab-width 4; +vim: expandtab:ts=4:sw=4 +*/ diff --git a/version b/version new file mode 100644 index 0000000..1d9906f --- /dev/null +++ b/version @@ -0,0 +1,19 @@ +# mini-at/version +# +# (c)2006, Laurence Withers, . +# Released under the GNU GPLv2. See file COPYING or +# http://www.gnu.org/copyleft/gpl.html for details. +# + + + +# VERSION contains the full version number of the library, which is +# expected to be in 'major.minor.micro' format. It can optionally be +# suffixed with a string. +VERMAJOR=0 +VERMINOR=0 +VERMICRO=0 +VEREXTRA="" + +# kate: replace-trailing-space-save true; space-indent true; tab-width 4; +# vim: expandtab:ts=4:sw=4