diff options
-rw-r--r-- | Makefile.am | 40 | ||||
-rw-r--r-- | NEWS | 10 | ||||
-rw-r--r-- | README | 260 | ||||
-rw-r--r-- | configure.ac | 15 | ||||
-rw-r--r-- | libabc/COPYING | 504 | ||||
-rw-r--r-- | libabc/libabc-private.h | 59 | ||||
-rw-r--r-- | libabc/libabc.h | 79 | ||||
-rw-r--r-- | libabc/libabc.sym | 24 | ||||
-rw-r--r-- | libkmod/.gitignore (renamed from libabc/.gitignore) | 2 | ||||
-rw-r--r-- | libkmod/libkmod-private.h | 38 | ||||
-rw-r--r-- | libkmod/libkmod.c (renamed from libabc/libabc.c) | 150 | ||||
-rw-r--r-- | libkmod/libkmod.h | 79 | ||||
-rw-r--r-- | libkmod/libkmod.pc.in (renamed from libabc/libabc.pc.in) | 6 | ||||
-rw-r--r-- | libkmod/libkmod.sym | 6 | ||||
-rw-r--r-- | test-libabc.c | 50 |
15 files changed, 230 insertions, 1092 deletions
diff --git a/Makefile.am b/Makefile.am index ee7823a..330d324 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,7 @@ AM_MAKEFLAGS = --no-print-directory AM_CPPFLAGS = \ -include $(top_builddir)/config.h \ - -I$(top_srcdir)/libabc \ + -I$(top_srcdir)/libkmod \ -DSYSCONFDIR=\""$(sysconfdir)"\" \ -DLIBEXECDIR=\""$(libexecdir)"\" @@ -19,29 +19,29 @@ AM_LDFLAGS = \ CLEANFILES = -LIBABC_CURRENT=2 -LIBABC_REVISION=0 -LIBABC_AGE=2 +LIBKMOD_CURRENT=2 +LIBKMOD_REVISION=0 +LIBKMOD_AGE=2 -include_HEADERS = libabc/libabc.h -lib_LTLIBRARIES = libabc/libabc.la +include_HEADERS = libkmod/libkmod.h +lib_LTLIBRARIES = libkmod/libkmod.la -libabc_libabc_la_SOURCES =\ - libabc/libabc.h \ - libabc/libabc-private.h \ - libabc/libabc.c +libkmod_libkmod_la_SOURCES =\ + libkmod/libkmod.h \ + libkmod/libkmod-private.h \ + libkmod/libkmod.c -EXTRA_DIST += libabc/libabc.sym +EXTRA_DIST += libkmod/libkmod.sym -libabc_libabc_la_LDFLAGS = $(AM_LDFLAGS) \ - -version-info $(LIBABC_CURRENT):$(LIBABC_REVISION):$(LIBABC_AGE) \ - -Wl,--version-script=$(top_srcdir)/libabc/libabc.sym +libkmod_libkmod_la_LDFLAGS = $(AM_LDFLAGS) \ + -version-info $(LIBKMOD_CURRENT):$(LIBKMOD_REVISION):$(LIBKMOD_AGE) \ + -Wl,--version-script=$(top_srcdir)/libkmod/libkmod.sym pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libabc/libabc.pc +pkgconfig_DATA = libkmod/libkmod.pc -TESTS = test-libabc - -check_PROGRAMS = test-libabc -test_libabc_SOURCES = test-libabc.c -test_libabc_LDADD = libabc/libabc.la +# TESTS = test-libkmod +# +# check_PROGRAMS = test-libkmod +# test_libkmod_SOURCES = test-libkmod.c +# test_libkmod_LDADD = libkmod/libkmod.la @@ -1,11 +1 @@ -libabc 3 -======== -Add functionality. Export symbols for 'thing'. -libabc 2 -======== -Add support for 'thing'. - -libabc 1 -======== -Initial release. @@ -1,260 +0,0 @@ -/* - This is free and unencumbered software released into the public domain. - - Anyone is free to copy, modify, publish, use, compile, sell, or - distribute this software, either in source code form or as a compiled - binary, for any purpose, commercial or non-commercial, and by any - means. - - In jurisdictions that recognize copyright laws, the author or authors - of this software dedicate any and all copyright interest in the - software to the public domain. We make this dedication for the benefit - of the public at large and to the detriment of our heirs and - successors. We intend this dedication to be an overt act of - relinquishment in perpetuity of all present and future rights to this - software under copyright law. - - Unless you really want to, do not even mention that the copied content - originates from this skeleton library. Its sole purpose is to be copied - into other projects. - - The above statements apply to all content in this skeleton library, even - when the COPYING files, or the headers in the files state otherwise, - they are just common examples. -*/ - -Questions, feedback, patches please email: - linux-hotplug@vger.kernel.org -or: - Kay Sievers <kay.sievers@vrfy.org> - Lennart Poettering <lennart@poettering.net> - -Why bother? - - To make things easy for library users, distribution packagers and - developers of library bindings for other programming languages. If - you want your stuff to be used and commonly available, try to play - nice, and give them what they are used to. It makes their life a - lot easier. - -use autotools - - Every custom config/makefile/build system is worse for everybody - than autotools is. - - We are all used to autotools, it works, nobody cares. - - It's only two simple files to edit and include in git, which are - well understood by many many people, not just you. - - Ignore all crap autotools create in the source tree. never check - the created files into git. - - Never, ever, install config.h. That's internal to your sources - and is nothing to install. - - And really, anything but autotools is realy an option. Just get - over it. Everything else is an experiment, and it will come back - to you sooner or later. Why? think cross compilation, installation/ - uninstallation, build root integration, separate object trees, - standard adherence, tarball handling, make distcheck, testing, - portability between distros, ... - -If you use the GPL, always use the GPL's "(or later)" clause - - Developers are not lawyers, libraries should be able to be linked - to any version of the GPL. Remember that GPL2-only is incompatible - with LGPL3! - -Use LGPL (for the shared libraries) if you don't care about politics - - It protects the code, but does not restrict its use. Low-level - library interfaces are mostly used like kernel syscall or proc/sysfs - interfaces, which are usually without any restrictions. - -Zero global state -- Make your library threads-aware, but *not* thread-safe! - - An app can use liba and libb. libb internally can also use liba -- - without you knowing. Both you and libb can run liba code at the - very same time in different threads and operate at the same global - variables, without telling you about that. Loadable modules make - this problem even more prominent, since the libraries they pull in - are generally completely unknown by the main application. And - *every* program has loadable modules, think NSS! - - Avoid locking and mutexes, they are very unlikely to work correctly, - and incredibly hard to get right. - - Always use a library context object. every thread should then - operate on its own context. Do not imply context objects via TLS. It - won't work. TLS inheritance to new threads will get in your way. TLS - is a problem in itself, not a solution. - - Do not use gcc constructors, or destructors, you can only loose if - you do. Do not use _fini() or _ini(), don't even use your own - explicit library initializer/destructor functions. It just won't - work if your library is pulled in indirectly from another library - or even a shared module (i.e. dlopen()) - - Always use O_CLOEXEC, SOCK_CLOEXEC and friends. It's not an - option, it's a must. - - Don't use global variables (it includes static variables defined - inside functions). Ever. And under no circumstances export global - variables. It's madness. - -Use a common prefix for _all_ exported symbols - - Avoids namespace clashes - - Also, hacking is not a contest of finding the shortest possible - function name. And nobody cares about your 80ch line limit! - - If you use a drop-in library in your own library make sure to hide its - symbols with symbol versioning. Don't forget to hide *all* symbols, and - don't install the header file of the used drop-in library. - -Do not expose any complex structures in your API - - Use get() and set() instead. - - All objects should be opaque. - - Exporting structs in headers is OK in very few cases only: usually - those where you define standard binary formats (think: file - formats, datagram headers, ...) or where you define well-known - primitive types (think struct timeval, struct iovec, uuid - type). - - Why bother? Because struct stat, struct dirent and friends are - disasters. Particularly horrible are structs with fixed-size - strings. - -Use the de-facto standardized function names - - It's abc_new(), abc_free(), abc_ref(), abc_unref(). Don't invent - your own names, and don't use the confusing kernel-style ref - counting. Function names: _get() is for accessing properties of - objects, not for refcounting. - -Stick to kernel coding style - - Just because you are otherwise not bound by the kernel guidelines - when your write userspace libraries doesn't mean you have to give - up the good things it defines. - -Avoid callbacks in your API - - Language bindings want iterators. - - Programmers want iterators too. - -Never call exit(), abort(), be very careful with assert() - - Always return error codes. - - Libraries need to be safe for usage in critical processes that - need to recover from errors instead of getting killed (think PID 1!). - -Avoid thinking about main loops/event dispatchers. - - Get your stuff right in the kernel: fds are awesome, expose them - in userspace and in the library, because people can easily integrate - them with their own poll() loops of whatever kind they have. - - Don't hide file descriptors away in your headers. - - Never add blocking kernel syscalls, and never add blocking library - calls either (with very few exceptions). Userspace code is primarily - asynchronous around event loops, and blocking calls are generally - incompatible with that. - - Corollary of that: always O_NONBLOCK! - -Functions should return int and negative errors instead of NULL - - Return NULL in malloc() is fine, return NULL in fopen() is not! - - Pass allocated objects as parameter (yes, ctx_t** is OK!) - - Returning kernel style negative <errno.h> error codes is cool in - userspace too. Do it! - -Provide pkgconfig files - - Apps want to add a single line to their configure file, - they do not want to fiddle with the parameters, dependencies - to setup and link your library. - - It's just how we do these things today on Linux, and everything - else is just horribly messy. - -Avoid *hidden* fork()/exec() in libraries - - Apps generally do not expect signals and react allergic to them. - - Mutexes, locks, threads of the app might get confused. Mixing - mutexes and fork() equals failure. It just can't work, and - pthread_atfork() is not a solution for that, because it's broken - (even POSIX acknowledges that, just read the POSIX man - pages!). fork() safety for mutex-ridden code is not an - afterthought, it's a broken right from the beginning. - -Make your code safe for unexpected termination and any point: - - Do not leave files dirty or temporary files around. - - This is a tricky, since you need to design your stuff like this - from the beginning, it's not an afterthought, since you generally - do not have a place to clean up your stuff on exit. gcc - destructors are NOT the answer. - -Use symbol versioning - - Only with that, RPM can handle dependencies for added symbols - - Hide all internal symbols! *This is important!* - -Always provide logging/debugging, but do not clutter stderr - - Allow the app to hook the libs logging into its logging facility. - - Use conditional logging, do not filter too late. - - Do not burn cycles with printf() to /dev/null. - - By default: do not generate any output on stdout/stderr. - -Always use 'make distcheck' to create tarballs - - Never release anything that does not pass distcheck. It will - likely be broken for others too - -Use ./autogen.sh to bootstrap the git repo - - Always test bootstrapping with 'git clean -x -f -d' before - release (careful, it force-deletes all uncommitted files). - -Avoid any spec files or debian/ subdirs in git trees - - Distribution specific things do not belong in upstream trees, - but into distro packages - -Update NEWS to let developers know what has changed - - It's the history of the project, stuff that packagers need to know - when putting a new version in the distro. The interesting changes - or added/removed functionality from version to version. This is - not a commit changelog. - - If you want to provide ChangeLog, use the one generated - by git, do not maintain your own. - -use standard types - - The kernel's u8, u16, ... correspond to uint8_t, uint16_t in - userspace from <inttypes.h>. Don't define your own typedefs - for that, don't include the kernel types in common headers. - - Use enums, not #define for constants, wherever possible. In - userspace you have debuggers, and they are much nicer to use if - you have proper enum identifiers instead of macro definitions, - because the debugger can translate binary values back to enum - identifiers, but not macros. However, be careful with enums in - function prototypes: they might change the int type they are - resolved to as you add new enum values. - -Always guard for multiple inclusions of headers - - You must place '#ifndef libabc, #define libabc, #endif' in your - header files. There is no way around that. - -Be careful with variadic functions - - It's great if you provide them, but you must accompany them with - "v" variants (i.e. functions taking a va_arg object), and provide - non-variadic variants as well. This is important to get language - wrappers right. - -Don't put "extern" in front of your function prototypes in headers - - It has no effect, no effect at all. - -Never use sysv IPC, always use POSIX IPC - - Shmops and semops are horrors. Don't use them, ever. POSIX IPC is - much much much nicer. - -Avoid multiplexed functions ala ioctl()/prctl() style variadic functions - - Type-safety is awesome! - -Executing out-of-process tools and parsing their output is usually -not acceptable in libraries - - Tools should be built on top of their own lib. - - Always separate 'mechanism' from 'policy'. Make access to functionality - simple, but do not try to hide things that need to be decided by the - caller. Keep automagic at its minimum. Don't do hidden fork() do not - implicitly maintain cache files, ... - -Function calls with 15 arguments are a bad idea. If you have tons of -booleans in a function call, then replace them by a flag argument! - - Think about the invocation! foo(0, 1, 0, 1, 0, 0, 0, 1) is unreadable! - foo(FOO_QUUX|FOO_BAR|FOO_WALDO) much nicer. - -Don't be afraid of C99. Use it. - - It's 12 years old. And it's nice. - -Never expose fixed size strings in your API - - Pass malloc()ed strings out, or ask the caller to provide you with - a buffer, and return ENOSPC if too short. - -Glibc has byteswapping calls, don't invent your own: - - le32toh(), htole32() and friends - - bswap32() and friends() - -Don't typedef pointers to structs! - -Don't write your own LISP interpreter and do not include it in your -library. :) diff --git a/configure.ac b/configure.ac index b860301..0d3962b 100644 --- a/configure.ac +++ b/configure.ac @@ -1,10 +1,11 @@ AC_PREREQ(2.60) -AC_INIT([libabc], - [1], - [libabc-devel@example.com], - [libabc], - [http://www.example.com/libs/libabc/]) -AC_CONFIG_SRCDIR([libabc/libabc.c]) +AC_INIT([libkmod], + [0.1], + [], + [libkmod], + [http://git.profusion.mobi/cgit.cgi/lucas/libkmod/]) + +AC_CONFIG_SRCDIR([libkmod/libkmod.c]) AC_CONFIG_AUX_DIR([build-aux]) AM_INIT_AUTOMAKE([check-news foreign 1.11 -Wall -Wno-portability silent-rules tar-pax dist-bzip2 subdir-objects]) AC_PROG_CC_STDC @@ -32,7 +33,7 @@ AS_IF([test "x$enable_debug" = "xyes"], [ AC_CONFIG_HEADERS(config.h) AC_CONFIG_FILES([ Makefile - libabc/libabc.pc + libkmod/libkmod.pc ]) AC_OUTPUT diff --git a/libabc/COPYING b/libabc/COPYING deleted file mode 100644 index 8add30a..0000000 --- a/libabc/COPYING +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -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 and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, 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 library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete 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 distribute a copy of this License along with the -Library. - - 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 Library or any portion -of it, thus forming a work based on the Library, 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) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -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 Library, 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 Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you 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. - - If distribution of 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 satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be 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. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library 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. - - 9. 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 Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -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 with -this License. - - 11. 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 Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library 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 Library. - -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. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library 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. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser 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 Library -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 Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -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 - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "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 -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. 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 LIBRARY 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 -LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - <one line to give the library's name and a brief idea of what it does.> - Copyright (C) <year> <name of author> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - <signature of Ty Coon>, 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/libabc/libabc-private.h b/libabc/libabc-private.h deleted file mode 100644 index 17a8c87..0000000 --- a/libabc/libabc-private.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - libabc - something with abc - - Copyright (C) 2011 Someone <someone@example.com> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details.¶ - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef _LIBABC_PRIVATE_H_ -#define _LIBABC_PRIVATE_H_ - -#include <stdbool.h> -#include <syslog.h> - -#include "libabc.h" - -static inline void __attribute__((always_inline, format(printf, 2, 3))) -abc_log_null(struct abc_ctx *ctx, const char *format, ...) {} - -#define abc_log_cond(ctx, prio, arg...) \ - do { \ - if (abc_get_log_priority(ctx) >= prio) \ - abc_log(ctx, prio, __FILE__, __LINE__, __FUNCTION__, ## arg); \ - } while (0) - -#ifdef ENABLE_LOGGING -# ifdef ENABLE_DEBUG -# define dbg(ctx, arg...) abc_log_cond(ctx, LOG_DEBUG, ## arg) -# else -# define dbg(ctx, arg...) abc_log_null(ctx, ## arg) -# endif -# define info(ctx, arg...) abc_log_cond(ctx, LOG_INFO, ## arg) -# define err(ctx, arg...) abc_log_cond(ctx, LOG_ERR, ## arg) -#else -# define dbg(ctx, arg...) abc_log_null(ctx, ## arg) -# define info(ctx, arg...) abc_log_null(ctx, ## arg) -# define err(ctx, arg...) abc_log_null(ctx, ## arg) -#endif - -#define ABC_EXPORT __attribute__ ((visibility("default"))) - -void abc_log(struct abc_ctx *ctx, - int priority, const char *file, int line, const char *fn, - const char *format, ...) - __attribute__((format(printf, 6, 7))); - -#endif diff --git a/libabc/libabc.h b/libabc/libabc.h deleted file mode 100644 index 6942fc4..0000000 --- a/libabc/libabc.h +++ /dev/null @@ -1,79 +0,0 @@ -/* - libabc - something with abc - - Copyright (C) 2011 Someone <someone@example.com> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details.¶ - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ - -#ifndef _LIBABC_H_ -#define _LIBABC_H_ - -#include <stdarg.h> - -#ifdef __cplusplus -extern "C" { -#endif - -/* - * abc_ctx - * - * library user context - reads the config and system - * environment, user variables, allows custom logging - */ -struct abc_ctx; -struct abc_ctx *abc_ref(struct abc_ctx *ctx); -struct abc_ctx *abc_unref(struct abc_ctx *ctx); -int abc_new(struct abc_ctx **ctx); -void abc_set_log_fn(struct abc_ctx *ctx, - void (*log_fn)(struct abc_ctx *ctx, - int priority, const char *file, int line, const char *fn, - const char *format, va_list args)); -int abc_get_log_priority(struct abc_ctx *ctx); -void abc_set_log_priority(struct abc_ctx *ctx, int priority); -void *abc_get_userdata(struct abc_ctx *ctx); -void abc_set_userdata(struct abc_ctx *ctx, void *userdata); - -/* - * abc_list - * - * access to abc generated lists - */ -struct abc_list_entry; -struct abc_list_entry *abc_list_entry_get_next(struct abc_list_entry *list_entry); -const char *abc_list_entry_get_name(struct abc_list_entry *list_entry); -const char *abc_list_entry_get_value(struct abc_list_entry *list_entry); -#define abc_list_entry_foreach(list_entry, first_entry) \ - for (list_entry = first_entry; \ - list_entry != NULL; \ - list_entry = abc_list_entry_get_next(list_entry)) - -/* - * abc_thing - * - * access to things of abc - */ -struct abc_thing; -struct abc_thing *abc_thing_ref(struct abc_thing *thing); -struct abc_thing *abc_thing_unref(struct abc_thing *thing); -struct abc_ctx *abc_thing_get_ctx(struct abc_thing *thing); -int abc_thing_new_from_string(struct abc_ctx *ctx, const char *string, struct abc_thing **thing); -struct abc_list_entry *abc_thing_get_some_list_entry(struct abc_thing *thing); - -#ifdef __cplusplus -} /* extern "C" */ -#endif - -#endif diff --git a/libabc/libabc.sym b/libabc/libabc.sym deleted file mode 100644 index a1b588b..0000000 --- a/libabc/libabc.sym +++ /dev/null @@ -1,24 +0,0 @@ -LIBABC_3 { -global: - abc_thing_ref; - abc_thing_unref; - abc_thing_get_ctx; - abc_thing_new_from_string; - abc_thing_get_some_list_entry; -local: - *; -}; - -LIBABC_1 { -global: - abc_get_userdata; - abc_set_userdata; - abc_ref; - abc_get_log_priority; - abc_set_log_fn; - abc_unref; - abc_set_log_priority; - abc_new; -local: - *; -}; diff --git a/libabc/.gitignore b/libkmod/.gitignore index faa121b..826fd62 100644 --- a/libabc/.gitignore +++ b/libkmod/.gitignore @@ -3,4 +3,4 @@ .libs/ *.la *.lo -libabc.pc +libkmod.pc diff --git a/libkmod/libkmod-private.h b/libkmod/libkmod-private.h new file mode 100644 index 0000000..24175f3 --- /dev/null +++ b/libkmod/libkmod-private.h @@ -0,0 +1,38 @@ +#ifndef _LIBKMOD_PRIVATE_H_ +#define _LIBKMOD_PRIVATE_H_ + +#include <stdbool.h> +#include <syslog.h> + +#include "libkmod.h" + +static inline void __attribute__((always_inline, format(printf, 2, 3))) + kmod_log_null(struct kmod_ctx *ctx, const char *format, ...) {} + +#define kmod_log_cond(ctx, prio, arg...) \ + do { \ + if (kmod_get_log_priority(ctx) >= prio) \ + kmod_log(ctx, prio, __FILE__, __LINE__, __FUNCTION__, ## arg);\ + } while (0) + +#ifdef ENABLE_LOGGING +# ifdef ENABLE_DEBUG +# define dbg(ctx, arg...) kmod_log_cond(ctx, LOG_DEBUG, ## arg) +# else +# define dbg(ctx, arg...) kmod_log_null(ctx, ## arg) +# endif +# define info(ctx, arg...) kmod_log_cond(ctx, LOG_INFO, ## arg) +# define err(ctx, arg...) kmod_log_cond(ctx, LOG_ERR, ## arg) +#else +# define dbg(ctx, arg...) kmod_log_null(ctx, ## arg) +# define info(ctx, arg...) kmod_log_null(ctx, ## arg) +# define err(ctx, arg...) kmod_log_null(ctx, ## arg) +#endif + +#define KMOD_EXPORT __attribute__ ((visibility("default"))) + +void kmod_log(struct kmod_ctx *ctx, + int priority, const char *file, int line, const char *fn, + const char *format, ...) __attribute__((format(printf, 6, 7))); + +#endif diff --git a/libabc/libabc.c b/libkmod/libkmod.c index fc472b3..3c3d59e 100644 --- a/libabc/libabc.c +++ b/libkmod/libkmod.c @@ -1,22 +1,22 @@ /* - libabc - something with abc - - Copyright (C) 2011 Someone <someone@example.com> - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library 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 - Lesser General Public License for more details.¶ - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * libkmod - interface to kernel module operations + * + * Copyright (C) 2011 ProFUSION embedded systems + * Copyright (C) 2011 Lucas De Marchi <lucas.de.marchi@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ #include <stdio.h> #include <stdlib.h> @@ -27,32 +27,32 @@ #include <string.h> #include <ctype.h> -#include "libabc.h" -#include "libabc-private.h" +#include "libkmod.h" +#include "libkmod-private.h" /** - * SECTION:libabc - * @short_description: libabc context + * SECTION:libkmod + * @short_description: libkmod context * * The context contains the default values for the library user, * and is passed to all library operations. */ /** - * abc_ctx: + * kmod_ctx: * * Opaque object representing the library context. */ -struct abc_ctx { +struct kmod_ctx { int refcount; - void (*log_fn)(struct abc_ctx *ctx, + void (*log_fn)(struct kmod_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, va_list args); void *userdata; int log_priority; }; -void abc_log(struct abc_ctx *ctx, +void kmod_log(struct kmod_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, ...) { @@ -63,24 +63,24 @@ void abc_log(struct abc_ctx *ctx, va_end(args); } -static void log_stderr(struct abc_ctx *ctx, +static void log_stderr(struct kmod_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, va_list args) { - fprintf(stderr, "libabc: %s: ", fn); + fprintf(stderr, "libkmod: %s: ", fn); vfprintf(stderr, format, args); } /** - * abc_get_userdata: - * @ctx: abc library context + * kmod_get_userdata: + * @ctx: kmod library context * * Retrieve stored data pointer from library context. This might be useful * to access from callbacks like a custom logging function. * * Returns: stored userdata **/ -ABC_EXPORT void *abc_get_userdata(struct abc_ctx *ctx) +KMOD_EXPORT void *kmod_get_userdata(struct kmod_ctx *ctx) { if (ctx == NULL) return NULL; @@ -88,13 +88,13 @@ ABC_EXPORT void *abc_get_userdata(struct abc_ctx *ctx) } /** - * abc_set_userdata: - * @ctx: abc library context + * kmod_set_userdata: + * @ctx: kmod library context * @userdata: data pointer * * Store custom @userdata in the library context. **/ -ABC_EXPORT void abc_set_userdata(struct abc_ctx *ctx, void *userdata) +KMOD_EXPORT void kmod_set_userdata(struct kmod_ctx *ctx, void *userdata) { if (ctx == NULL) return; @@ -119,22 +119,22 @@ static int log_priority(const char *priority) } /** - * abc_new: + * kmod_new: * - * Create abc library context. This reads the abc configuration + * Create kmod library context. This reads the kmod configuration * and fills in the default values. * * The initial refcount is 1, and needs to be decremented to - * release the resources of the abc library context. + * release the resources of the kmod library context. * - * Returns: a new abc library context + * Returns: a new kmod library context **/ -ABC_EXPORT int abc_new(struct abc_ctx **ctx) +KMOD_EXPORT int kmod_new(struct kmod_ctx **ctx) { const char *env; - struct abc_ctx *c; + struct kmod_ctx *c; - c = calloc(1, sizeof(struct abc_ctx)); + c = calloc(1, sizeof(struct kmod_ctx)); if (!c) return -ENOMEM; @@ -143,9 +143,9 @@ ABC_EXPORT int abc_new(struct abc_ctx **ctx) c->log_priority = LOG_ERR; /* environment overwrites config */ - env = getenv("ABC_LOG"); + env = getenv("KMOD_LOG"); if (env != NULL) - abc_set_log_priority(c, log_priority(env)); + kmod_set_log_priority(c, log_priority(env)); info(c, "ctx %p created\n", c); dbg(c, "log_priority=%d\n", c->log_priority); @@ -154,14 +154,14 @@ ABC_EXPORT int abc_new(struct abc_ctx **ctx) } /** - * abc_ref: - * @ctx: abc library context + * kmod_ref: + * @ctx: kmod library context * - * Take a reference of the abc library context. + * Take a reference of the kmod library context. * - * Returns: the passed abc library context + * Returns: the passed kmod library context **/ -ABC_EXPORT struct abc_ctx *abc_ref(struct abc_ctx *ctx) +KMOD_EXPORT struct kmod_ctx *kmod_ref(struct kmod_ctx *ctx) { if (ctx == NULL) return NULL; @@ -170,14 +170,14 @@ ABC_EXPORT struct abc_ctx *abc_ref(struct abc_ctx *ctx) } /** - * abc_unref: - * @ctx: abc library context + * kmod_unref: + * @ctx: kmod library context * - * Drop a reference of the abc library context. If the refcount + * Drop a reference of the kmod library context. If the refcount * reaches zero, the resources of the context will be released. * **/ -ABC_EXPORT struct abc_ctx *abc_unref(struct abc_ctx *ctx) +KMOD_EXPORT struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx) { if (ctx == NULL) return NULL; @@ -190,8 +190,8 @@ ABC_EXPORT struct abc_ctx *abc_unref(struct abc_ctx *ctx) } /** - * abc_set_log_fn: - * @ctx: abc library context + * kmod_set_log_fn: + * @ctx: kmod library context * @log_fn: function to be called for logging messages * * The built-in logging writes to stderr. It can be @@ -199,8 +199,8 @@ ABC_EXPORT struct abc_ctx *abc_unref(struct abc_ctx *ctx) * into the user's logging functionality. * **/ -ABC_EXPORT void abc_set_log_fn(struct abc_ctx *ctx, - void (*log_fn)(struct abc_ctx *ctx, +KMOD_EXPORT void kmod_set_log_fn(struct kmod_ctx *ctx, + void (*log_fn)(struct kmod_ctx *ctx, int priority, const char *file, int line, const char *fn, const char *format, va_list args)) @@ -210,40 +210,40 @@ ABC_EXPORT void abc_set_log_fn(struct abc_ctx *ctx, } /** - * abc_get_log_priority: - * @ctx: abc library context + * kmod_get_log_priority: + * @ctx: kmod library context * * Returns: the current logging priority **/ -ABC_EXPORT int abc_get_log_priority(struct abc_ctx *ctx) +KMOD_EXPORT int kmod_get_log_priority(struct kmod_ctx *ctx) { return ctx->log_priority; } /** - * abc_set_log_priority: - * @ctx: abc library context + * kmod_set_log_priority: + * @ctx: kmod library context * @priority: the new logging priority * * Set the current logging priority. The value controls which messages * are logged. **/ -ABC_EXPORT void abc_set_log_priority(struct abc_ctx *ctx, int priority) +KMOD_EXPORT void kmod_set_log_priority(struct kmod_ctx *ctx, int priority) { ctx->log_priority = priority; } -struct abc_list_entry; -struct abc_list_entry *abc_list_entry_get_next(struct abc_list_entry *list_entry); -const char *abc_list_entry_get_name(struct abc_list_entry *list_entry); -const char *abc_list_entry_get_value(struct abc_list_entry *list_entry); +struct kmod_list_entry; +struct kmod_list_entry *kmod_list_entry_get_next(struct kmod_list_entry *list_entry); +const char *kmod_list_entry_get_name(struct kmod_list_entry *list_entry); +const char *kmod_list_entry_get_value(struct kmod_list_entry *list_entry); -struct abc_thing { - struct abc_ctx *ctx; +struct kmod_thing { + struct kmod_ctx *ctx; int refcount; }; -ABC_EXPORT struct abc_thing *abc_thing_ref(struct abc_thing *thing) +KMOD_EXPORT struct kmod_thing *kmod_thing_ref(struct kmod_thing *thing) { if (!thing) return NULL; @@ -251,7 +251,7 @@ ABC_EXPORT struct abc_thing *abc_thing_ref(struct abc_thing *thing) return thing; } -ABC_EXPORT struct abc_thing *abc_thing_unref(struct abc_thing *thing) +KMOD_EXPORT struct kmod_thing *kmod_thing_unref(struct kmod_thing *thing) { if (thing == NULL) return NULL; @@ -263,16 +263,16 @@ ABC_EXPORT struct abc_thing *abc_thing_unref(struct abc_thing *thing) return NULL; } -ABC_EXPORT struct abc_ctx *abc_thing_get_ctx(struct abc_thing *thing) +KMOD_EXPORT struct kmod_ctx *kmod_thing_get_ctx(struct kmod_thing *thing) { return thing->ctx; } -ABC_EXPORT int abc_thing_new_from_string(struct abc_ctx *ctx, const char *string, struct abc_thing **thing) +KMOD_EXPORT int kmod_thing_new_from_string(struct kmod_ctx *ctx, const char *string, struct kmod_thing **thing) { - struct abc_thing *t; + struct kmod_thing *t; - t = calloc(1, sizeof(struct abc_thing)); + t = calloc(1, sizeof(struct kmod_thing)); if (!t) return -ENOMEM; @@ -282,7 +282,7 @@ ABC_EXPORT int abc_thing_new_from_string(struct abc_ctx *ctx, const char *string return 0; } -ABC_EXPORT struct abc_list_entry *abc_thing_get_some_list_entry(struct abc_thing *thing) +KMOD_EXPORT struct kmod_list_entry *kmod_thing_get_some_list_entry(struct kmod_thing *thing) { return NULL; } diff --git a/libkmod/libkmod.h b/libkmod/libkmod.h new file mode 100644 index 0000000..19e29b1 --- /dev/null +++ b/libkmod/libkmod.h @@ -0,0 +1,79 @@ +/* + * libkmod - interface to kernel module operations + * + * Copyright (C) 2011 ProFUSION embedded systems + * Copyright (C) 2011 Lucas De Marchi <lucas.de.marchi@gmail.com> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation version 2.1. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _LIBABC_H_ +#define _LIBABC_H_ + +#include <stdarg.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * kmod_ctx + * + * library user context - reads the config and system + * environment, user variables, allows custom logging + */ +struct kmod_ctx; +struct kmod_ctx *kmod_ref(struct kmod_ctx *ctx); +struct kmod_ctx *kmod_unref(struct kmod_ctx *ctx); +int kmod_new(struct kmod_ctx **ctx); +void kmod_set_log_fn(struct kmod_ctx *ctx, + void (*log_fn)(struct kmod_ctx *ctx, + int priority, const char *file, int line, const char *fn, + const char *format, va_list args)); +int kmod_get_log_priority(struct kmod_ctx *ctx); +void kmod_set_log_priority(struct kmod_ctx *ctx, int priority); +void *kmod_get_userdata(struct kmod_ctx *ctx); +void kmod_set_userdata(struct kmod_ctx *ctx, void *userdata); + +/* + * kmod_list + * + * access to kmod generated lists + */ +struct kmod_list_entry; +struct kmod_list_entry *kmod_list_entry_get_next(struct kmod_list_entry *list_entry); +const char *kmod_list_entry_get_name(struct kmod_list_entry *list_entry); +const char *kmod_list_entry_get_value(struct kmod_list_entry *list_entry); +#define kmod_list_entry_foreach(list_entry, first_entry) \ + for (list_entry = first_entry; \ + list_entry != NULL; \ + list_entry = kmod_list_entry_get_next(list_entry)) + +/* + * kmod_thing + * + * access to things of kmod + */ +struct kmod_thing; +struct kmod_thing *kmod_thing_ref(struct kmod_thing *thing); +struct kmod_thing *kmod_thing_unref(struct kmod_thing *thing); +struct kmod_ctx *kmod_thing_get_ctx(struct kmod_thing *thing); +int kmod_thing_new_from_string(struct kmod_ctx *ctx, const char *string, struct kmod_thing **thing); +struct kmod_list_entry *kmod_thing_get_some_list_entry(struct kmod_thing *thing); + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/libabc/libabc.pc.in b/libkmod/libkmod.pc.in index 2fc7b76..b02e74a 100644 --- a/libabc/libabc.pc.in +++ b/libkmod/libkmod.pc.in @@ -3,9 +3,9 @@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@ -Name: libabc -Description: Library for something with abc +Name: libkmod +Description: Library to deal with kernel modules Version: @VERSION@ -Libs: -L${libdir} -labc +Libs: -L${libdir} -lkmod Libs.private: Cflags: -I${includedir} diff --git a/libkmod/libkmod.sym b/libkmod/libkmod.sym new file mode 100644 index 0000000..32807a6 --- /dev/null +++ b/libkmod/libkmod.sym @@ -0,0 +1,6 @@ +LIBKMOD_0_1 { +global: + kmod_*; +local: + *; +}; diff --git a/test-libabc.c b/test-libabc.c deleted file mode 100644 index 64e7100..0000000 --- a/test-libabc.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - libabc - something with abc - - Copyright (C) 2011 Someone <someone@example.com> - - 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 2 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include <stdio.h> -#include <stddef.h> -#include <stdlib.h> -#include <string.h> -#include <fcntl.h> -#include <ctype.h> -#include <errno.h> -#include <unistd.h> - -#include <libabc.h> - -int main(int argc, char *argv[]) -{ - struct abc_ctx *ctx; - struct abc_thing *thing = NULL; - int err; - - err = abc_new(&ctx); - if (err < 0) - exit(EXIT_FAILURE); - - printf("version %s\n", VERSION); - - err = abc_thing_new_from_string(ctx, "foo", &thing); - if (err >= 0) - abc_thing_unref(thing); - - abc_unref(ctx); - return EXIT_SUCCESS; -} |