Merge branch 'collectd-5.2' into collectd-5.3
src/configfile.c: Let errors in included files propagate up to cf_read().
cf_read_generic() returned NULL in two cases: Unable to read file and
file was empty. Since we wanted to allow empty includes, the "include
file with errors" case was not handled properly.
Github: #323
cf_read_generic() returned NULL in two cases: Unable to read file and
file was empty. Since we wanted to allow empty includes, the "include
file with errors" case was not handled properly.
Github: #323
Merge branch 'collectd-4.10' into collectd-5.2
Don't notify continuously when MySQL slave SQL thread is running
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
Add "=encoding" header to all manual pages.
http://bugs.debian.org/708718
http://bugs.debian.org/708718
exec plugin: Document that defaulting to PUTVAL is no longer done
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
Merge branch 'document-varnish-instance-block' into collectd-5.2
modbus plugin: Refactor the new reconnection code.
Avoid the goto() and switch() statements.
Github: #294
Avoid the goto() and switch() statements.
Github: #294
Cleanup modbus connection if wrong result
Change-Id: I1b7520442d7663d5bc2529369e27e3e858fe2168
Signed-off-by: Florian Forster <octo@collectd.org>
Change-Id: I1b7520442d7663d5bc2529369e27e3e858fe2168
Signed-off-by: Florian Forster <octo@collectd.org>
Fix modbus segfault / New strategy for connecting
The previous implementation had a reconnection loop which should not
really be necessary. Idea tried here is to check if connection is alive,
and establish it if not. Change was begun because previously connection
would only be attempted as a retry, so on first pass a NULL was handed to
libmodbus which caused segmentation faults reproducibly.
Signed-off-by: Florian Forster <octo@collectd.org>
The previous implementation had a reconnection loop which should not
really be necessary. Idea tried here is to check if connection is alive,
and establish it if not. Change was begun because previously connection
would only be attempted as a retry, so on first pass a NULL was handed to
libmodbus which caused segmentation faults reproducibly.
Signed-off-by: Florian Forster <octo@collectd.org>
varnish: hint about missing <Instance> block
The warning when the Collect* configuration options where used outside
of an <Instance> block was confusing. This patch warns the user the same
way the apache plugin does.
The warning when the Collect* configuration options where used outside
of an <Instance> block was confusing. This patch warns the user the same
way the apache plugin does.
Improve varnish section in manpage.
There previously was no mention of the mandatory <Instance> block.
There previously was no mention of the mandatory <Instance> block.
collectd.conf(5): Fixed documentation for include filter patterns.
The syntax has been changed from a positional argument to using an <Include>
block with additional arguments.
The syntax has been changed from a positional argument to using an <Include>
block with additional arguments.
dns plugin: Sleep for an interval before re-trying to read from interface.
Otherwise we'd just have the CPU hogging behavior shifted from libpcap
to collectd …
Github: #308
Otherwise we'd just have the CPU hogging behavior shifted from libpcap
to collectd …
Github: #308
dns plugin: Resume after receiving a PCAP_ERROR from pcap_loop().
If an interface goes down while capturing, libpcap returns PCAP_ERROR.
Handle this case gracefully.
Github: #308
If an interface goes down while capturing, libpcap returns PCAP_ERROR.
Handle this case gracefully.
Github: #308
write_riemann plugin: Really fix a memory leak.
Github: #307
Github: #307
write_riemann plugin: Fix a memory leak.
Attributes were allocated and added to the event but not freed. D'oh!
Thanks to @dch for reporting this!
Github: #307
Attributes were allocated and added to the event but not freed. D'oh!
Thanks to @dch for reporting this!
Github: #307
src/utils_mount.h: Add <stdio.h>.
This is required on Solaris 10. Thanks to dannypoo@ for reporting this
problem.
Github: #306
This is required on Solaris 10. Thanks to dannypoo@ for reporting this
problem.
Github: #306
Record load averages over 100
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
snmp plugin: Removed "mixed delaration".
This should fix this warning Fabien Wernli reported:
snmp.c:1381: warning: ISO C90 forbids mixed declarations and code
This should fix this warning Fabien Wernli reported:
snmp.c:1381: warning: ISO C90 forbids mixed declarations and code
src/Makefile.am: Really don't distribute *.pb-c.[ch].
src/Makefile.am: Add *.proto to EXTRA_DIST. D'oh!
Build system: Don't ship the generated *.pb-c.[ch] files.
They depend on specific versions of the protobuf-c.h header file, so
shipping this will cause problems for people having a different version
of protoc-c installed. This reverts some of the work done in #269, but
distcheck should still work. Meh.
They depend on specific versions of the protobuf-c.h header file, so
shipping this will cause problems for people having a different version
of protoc-c installed. This reverts some of the work done in #269, but
distcheck should still work. Meh.
RedHat RPM spec: updated for 5.3.0
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
configure.in: Fix libgcrypt flags on FreeBSD.
On FreeBSD, AM_PATH_LIBGCRYPT sets LIBGCRYPT_CFLAGS but not
LIBGCRYPT_CPPFLAGS. Use both variables to be on the save side.
On FreeBSD, AM_PATH_LIBGCRYPT sets LIBGCRYPT_CFLAGS but not
LIBGCRYPT_CPPFLAGS. Use both variables to be on the save side.
Bump version to 5.3.0; Update ChangeLog.
Merge branch 'collectd-5.2'
Bump version to 5.2.2; Update ChangeLog.
Merge branch 'collectd-5.1' into collectd-5.2
Conflicts:
ChangeLog
version-gen.sh
Conflicts:
ChangeLog
version-gen.sh
Bump version to 5.1.3; Update ChangeLog.
Merge remote-tracking branch 'origin/collectd-4.10' into collectd-5.1
Conflicts:
ChangeLog
version-gen.sh
Conflicts:
ChangeLog
version-gen.sh
Bump version to 4.10.9; Update ChangeLog.
netapp plugin: Fix the interval used by the SnapVault and quota metrics.
Additional fix for Github issue #288.
Additional fix for Github issue #288.
Merge branch 'collectd-5.2'
Merge branch 'collectd-5.1' into collectd-5.2
Merge branch 'jk/snmp' into collectd-5.1
write_riemann plugin: Reorder the functions to get rid or prototypes.
write_riemann plugin: Use the "Attributes" of an Event rather than abuse the "Tags".
Riemann 0.2.0 provides "Attributes", which are key-value pairs. Since
the plugin previously basically abused the tag system for adding this
kind of data, switch to the new and shiny thing :)
Riemann 0.2.0 provides "Attributes", which are key-value pairs. Since
the plugin previously basically abused the tag system for adding this
kind of data, switch to the new and shiny thing :)
src/riemann.proto: Import the protocol buffer for Riemann 0.2.0.
Merge remote-tracking branch 'github-octo/ff/netapp' into collectd-5.1
Merge branch 'collectd-5.2'
Merge branch 'collectd-5.1' into collectd-5.2
Conflicts:
configure.in
Conflicts:
configure.in
Merge branch 'collectd-4.10' into collectd-5.1
Conflicts:
configure.in
src/mysql.c
src/network.c
src/thermal.c
Conflicts:
configure.in
src/mysql.c
src/network.c
src/thermal.c
.gitignore: Add src/*.pb-c.[ch]
configure.in: Fix dependency of the pinba and write_riemann plugins.
Since the generated *.pb-c.[ch] files are now included in the
distribution, they only depend on the <google/protobuf-c/protobuf-c.h>
header file, not the protobuf compiler.
Since the generated *.pb-c.[ch] files are now included in the
distribution, they only depend on the <google/protobuf-c/protobuf-c.h>
header file, not the protobuf compiler.
src/Makefile.am: Move *.pb-c.[ch] to MAINTAINERCLEANFILES.
Only generate build rules for these files if protoc-c is available and
use the provided files from the distribution if it is not.
Only generate build rules for these files if protoc-c is available and
use the provided files from the distribution if it is not.
11 years agosrc/Makefile.am: Include .c and .h files generated from Protocol Buffers in the distr...
src/Makefile.am: Include .c and .h files generated from Protocol Buffers in the distribution.
Fixes Github issue #269.
Signed-off-by: Florian Forster <octo@collectd.org>
Fixes Github issue #269.
Signed-off-by: Florian Forster <octo@collectd.org>
bindings/Makefile: Hint the user at --with-perl-bindings.
… in case 'perl Makefile.PL' fails.
Fixes Github issue #290.
Signed-off-by: Florian Forster <octo@collectd.org>
… in case 'perl Makefile.PL' fails.
Fixes Github issue #290.
Signed-off-by: Florian Forster <octo@collectd.org>
build system (Perl bindings): Make Makefile.PL's PREFIX/INSTALL_BASE optional.
Both options may cause problems:
- PREFIX might clash with INSTALL_BASE being set in $PERL_MM_OPT.
- INSTALL_BASE without any further options set will install into non-standard
directories in many cases.
Rather, use PREFIX=${prefix} as default but overwrite that if
--with-perl-bindings=... has been used.
Thanks to faxm0dem for reporting the INSTALL_BASE problems on IRC and
bvarner and nirik for reporting this in GH #177 and #196.
This is a follow-up / fix for 97e8f346a88eccf4d1608c21d5cc6ee9620c1c41.
Fixes Github issue #290.
Signed-off-by: Florian Forster <octo@collectd.org>
Both options may cause problems:
- PREFIX might clash with INSTALL_BASE being set in $PERL_MM_OPT.
- INSTALL_BASE without any further options set will install into non-standard
directories in many cases.
Rather, use PREFIX=${prefix} as default but overwrite that if
--with-perl-bindings=... has been used.
Thanks to faxm0dem for reporting the INSTALL_BASE problems on IRC and
bvarner and nirik for reporting this in GH #177 and #196.
This is a follow-up / fix for 97e8f346a88eccf4d1608c21d5cc6ee9620c1c41.
Fixes Github issue #290.
Signed-off-by: Florian Forster <octo@collectd.org>
network plugin: Make sure gcrypt is initialized before using any of its functions.
@marekbecka found that sockent_open() is called during the configuration
phase, but gcrypt is initialized later, during the initialization phase.
This patch will initialize gcrypt in sockent_open() if any sockets with
security are configured.
Fixes Github issue #273.
@marekbecka found that sockent_open() is called during the configuration
phase, but gcrypt is initialized later, during the initialization phase.
This patch will initialize gcrypt in sockent_open() if any sockets with
security are configured.
Fixes Github issue #273.
Don't clobber TMPDIR during Java detection
- Java detection used TMPDIR as var to parse command output
- TMPDIR is used in libltdl later on in ./configure
- alternative fix is local var or subshell
- fixes issue introduced via #33163ee
Conflicts:
configure.in
Signed-off-by: Florian Forster <octo@collectd.org>
- Java detection used TMPDIR as var to parse command output
- TMPDIR is used in libltdl later on in ./configure
- alternative fix is local var or subshell
- fixes issue introduced via #33163ee
Conflicts:
configure.in
Signed-off-by: Florian Forster <octo@collectd.org>
notify_email: Add charset in Content-Type header (seems required by some picky spam filters)
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
configure.in: Check for protobuf-c.h.
Thanks to Yves Mettier pointing this out in #269 and for providing an
initial patch.
Thanks to Yves Mettier pointing this out in #269 and for providing an
initial patch.
netapp plugin: Fix intervals used when dispatching values.
It used to use the interval of the <Host /> block when in fact it should
have used the interval of the data blocks.
Fixes Github issue #288.
It used to use the interval of the <Host /> block when in fact it should
have used the interval of the data blocks.
Fixes Github issue #288.
snmp plugin: Fix compilation issue.
Thanks to Magnus for pointing this out.
Thanks to Magnus for pointing this out.
nfs plugin: Copy the name before calling the non-const lookup function.
Fixes Github issue #70. Thanks to Jeff for reporting this issue.
Fixes Github issue #70. Thanks to Jeff for reporting this issue.
rrdcached plugin: Connect to the daemon in the read() callback.
Fixes Github issue #275. Thanks to Yves Mettier for reporting this bug!
Fixes Github issue #275. Thanks to Yves Mettier for reporting this bug!
Merge branch 'collectd-5.1' into collectd-5.2
src/libcollectdclient/network_buffer.c check for htonll exitence
before defining it. I have to to this to get it compiled on AIX6
Signed-off-by: Florian Forster <octo@collectd.org>
before defining it. I have to to this to get it compiled on AIX6
Signed-off-by: Florian Forster <octo@collectd.org>
snmp plugin: Allocate "oid_list" on the stack.
snmp plugin: Some coding style fixes.
* Rename "oid_todo_list" to "oid_list_todo".
* Rename "j" to "oid_list_todo_num".
* Fix indentation.
* Declare variables at beginning of block.
* Rename "oid_todo_list" to "oid_list_todo".
* Rename "j" to "oid_list_todo_num".
* Fix indentation.
* Declare variables at beginning of block.
csnmp_read_table: Change GETNEXT request behaviour (+ bugfix 235)
This patch changes the snmp GETNEXT request behaviour implemented in snmp.c.
The old implementation requested all OIDs using GETNEXT requests until all OIDs
left their own subtree. In cases were trees in a Data template are much longer
than other trees the shorter subtrees were re-requested over and over again.
The new implementation will only request OIDs that did not already leave their
subtrees (see the oid_todo_list implementation for details). This renders the
function csnmp_check_res_left_subtree useless as the oid_todo_list keeps track
if all OIDs have finished.
During tests against Cat6500 (CatOS/IOS) as well as Nexus5k (NX-OS) it looks as
though GETNEXT requests (when requesting multiple OIDs like all 14 dot3Stats
errors from Etherlike-MIB) can take about 5-10ms (CatOS 30ms) longer if they wrap
to the next OID.
This does not sound much but when collecting data for the Etherlike-MIB (that only
has entries for physical interfaces) with a collectd "Instance" variable in IF-MIB
(that has entries for all physical as well as pseudo [SVIs, VLANs, ...] interfaces)
this can make a notable difference (e.g. for core routers that have all SVIs and
VLANs but only some switches attached):
IOS-Core-Router ifName 550 entries
dot3StatsFCSErrors 70 entries
------------
480 entries * 10ms = 4.8s overhead
CatOS-Access-Sw. ifName 840 entries
dot3StatsFCSErrors 490 entries
------------
350 entries * 30ms = 10.5s overhead
After refactoring csnmp_read_table "Instance" and "Value" OIDs are now handled
consistently (so no pointer-forward foo needed). It doesn't change any logic
and data structures, though - so there should not be any impact to other
functions.
The refactored code also fixes GitHub bugs #235 and #258. This bug is due to
reusing the status variable in following code section which might lead to errors
if the subtrees are of different length:
1436 /* Calculate the current suffix. This is later used to check that the
1437 * suffix is increasing. This also checks if we left the subtree */
1438 status = csnmp_oid_suffix (&suffix, &vb_name, data->values + i);
Signed-off-by: Florian Forster <octo@collectd.org>
This patch changes the snmp GETNEXT request behaviour implemented in snmp.c.
The old implementation requested all OIDs using GETNEXT requests until all OIDs
left their own subtree. In cases were trees in a Data template are much longer
than other trees the shorter subtrees were re-requested over and over again.
The new implementation will only request OIDs that did not already leave their
subtrees (see the oid_todo_list implementation for details). This renders the
function csnmp_check_res_left_subtree useless as the oid_todo_list keeps track
if all OIDs have finished.
During tests against Cat6500 (CatOS/IOS) as well as Nexus5k (NX-OS) it looks as
though GETNEXT requests (when requesting multiple OIDs like all 14 dot3Stats
errors from Etherlike-MIB) can take about 5-10ms (CatOS 30ms) longer if they wrap
to the next OID.
This does not sound much but when collecting data for the Etherlike-MIB (that only
has entries for physical interfaces) with a collectd "Instance" variable in IF-MIB
(that has entries for all physical as well as pseudo [SVIs, VLANs, ...] interfaces)
this can make a notable difference (e.g. for core routers that have all SVIs and
VLANs but only some switches attached):
IOS-Core-Router ifName 550 entries
dot3StatsFCSErrors 70 entries
------------
480 entries * 10ms = 4.8s overhead
CatOS-Access-Sw. ifName 840 entries
dot3StatsFCSErrors 490 entries
------------
350 entries * 30ms = 10.5s overhead
After refactoring csnmp_read_table "Instance" and "Value" OIDs are now handled
consistently (so no pointer-forward foo needed). It doesn't change any logic
and data structures, though - so there should not be any impact to other
functions.
The refactored code also fixes GitHub bugs #235 and #258. This bug is due to
reusing the status variable in following code section which might lead to errors
if the subtrees are of different length:
1436 /* Calculate the current suffix. This is later used to check that the
1437 * suffix is increasing. This also checks if we left the subtree */
1438 status = csnmp_oid_suffix (&suffix, &vb_name, data->values + i);
Signed-off-by: Florian Forster <octo@collectd.org>
configure.in: Yet another attempt at fixing the mess that is AC_LANG_PROGRAM().
thermal plugin: set the hostname
Signed-off-by: Markus Knetschke <markus.knetschke@gmail.com>
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Markus Knetschke <markus.knetschke@gmail.com>
Signed-off-by: Florian Forster <octo@collectd.org>
thermal plugin: fixed value submitting
Signed-off-by: Markus Knetschke <markus.knetschke@gmail.com>
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Markus Knetschke <markus.knetschke@gmail.com>
Signed-off-by: Florian Forster <octo@collectd.org>
Allow parsing plugin_instance in parse_option().
isalnum() is not enough to catch the underscore.
Signed-off-by: Florian Forster <octo@collectd.org>
isalnum() is not enough to catch the underscore.
Signed-off-by: Florian Forster <octo@collectd.org>
mysql plugin: Call mysql_init() only once.
Apparently, if you call it with a structure allocated by mysql_init()
itself, it leaks memory. Thanks to Yves Mettier for pointing this out!
Fixes Github issue #274.
Apparently, if you call it with a structure allocated by mysql_init()
itself, it leaks memory. Thanks to Yves Mettier for pointing this out!
Fixes Github issue #274.
configure.in: Fix quoting of AC_LANG_PROGRAM().
Autoconf 2.68 complains about that and aborts building the configure
script. *sigh*
Autoconf 2.68 complains about that and aborts building the configure
script. *sigh*
rrdtool plugin: Use cdrand_range() for the random variation.
src/utils_random.[ch]: Provide thread-safe random numbers.
write_mongodb plugin: Add authentication options.
Fixes Github issue #282.
Fixes Github issue #282.
Increase MAX_NUMDISKS
On large systems (particularly ZFS systems using large JBODs), it's
quite possible to have more than 256 disks.
Signed-off-by: Florian Forster <octo@collectd.org>
On large systems (particularly ZFS systems using large JBODs), it's
quite possible to have more than 256 disks.
Signed-off-by: Florian Forster <octo@collectd.org>
respect riemann's terminology
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
Get rid of a compiler warning with gcc 4.6.3
...a futile warning that nevertheless kills the build thanks
to -Werror: "variable 'status' set but not used"
Signed-off-by: Florian Forster <octo@collectd.org>
...a futile warning that nevertheless kills the build thanks
to -Werror: "variable 'status' set but not used"
Signed-off-by: Florian Forster <octo@collectd.org>
curl_xml plugin: Fixed typo in documentation
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
Merge branch 'collectd-5.2'
Conflicts:
configure.in
Conflicts:
configure.in
Merge branch 'collectd-5.1' into collectd-5.2
Merge branch 'kn/snort'
src/plugin.c: Assert that "data_sets" is non-NULL.
Otherwise we might run into an assertion in the AVL tree. This can be
triggered e.g. when calling plugin_get_ds() from within a config
callback.
Otherwise we might run into an assertion in the AVL tree. This can be
triggered e.g. when calling plugin_get_ds() from within a config
callback.
tail_csv plugin: Implement the "TimeFrom" option.
tail_csv plugin: Rename the "Index" option to "ValueFrom".
tail_csv plugin: Some bug fixes.
* Query types in the init-phase rather than the config-phase. The
types.db is not guaranteed to be available at that time.
* Make sure the "Instance" option in the <File /> blocks is optional.
* Query types in the init-phase rather than the config-phase. The
types.db is not guaranteed to be available at that time.
* Make sure the "Instance" option in the <File /> blocks is optional.
Merge branch 'jw/libvirt'
tail_csv plugin: Rename "Instance" blocks to "File".
This way the syntax of tail_csv's configuration is closer to that of the
csv plugin.
This way the syntax of tail_csv's configuration is closer to that of the
csv plugin.
tail_csv plugin: Rename the "snort" plugin to "tail_csv".
It's actually much more generic than just Snort, so give it an
appropriately generic name.
It's actually much more generic than just Snort, so give it an
appropriately generic name.
configure.in: Quote AC_LANG_PROGRAM and remove AC_INCLUDES_DEFAULT.
The latter isn't expanded anymore when quoted. There's no easy way
around this :\
The latter isn't expanded anymore when quoted. There's no easy way
around this :\
Added instance type "total"
Reports memory allocation in bytes, not kilobytes.
Applied the suggested changes.
uuid plugin: Improve parsing of the dmidecode output.
The entire business of dividing by sizeof(char) only made the code
unreadable, because by specification sizeof(char) evaluates to 1. The
defines were expanded and the parsing is now less sensitive to
formatting changes in the dmidecode output. Module global variables have
been moved to the top.
Fixes Github issue #267 in the process.
The entire business of dividing by sizeof(char) only made the code
unreadable, because by specification sizeof(char) evaluates to 1. The
defines were expanded and the parsing is now less sensitive to
formatting changes in the dmidecode output. Module global variables have
been moved to the top.
Fixes Github issue #267 in the process.
Merge remote branch 'origin/master'
curl_xml plugin: Change the "Namespace" config option …
… to expect two strings: prefix and URL separately. This way the parsing
is done in the config parser and we don't have to interpret special
characters in a string.
… to expect two strings: prefix and URL separately. This way the parsing
is done in the config parser and we don't have to interpret special
characters in a string.
src/filter_chain.c: Fixed typos in error messages
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
Fix automatic link flags with libgcrypt 1.5.0
AM_PATH_LIBGCRYPT from libgcrypt 1.5.0 sets the variables
LIBGCRYPT_CPPFLAGS and LIBGCRYPT_LIBS with their proper
values, not GCRYPT_CPPFLAGS and GCRYPT_LIBS.
Signed-off-by: Florian Forster <octo@collectd.org>
AM_PATH_LIBGCRYPT from libgcrypt 1.5.0 sets the variables
LIBGCRYPT_CPPFLAGS and LIBGCRYPT_LIBS with their proper
values, not GCRYPT_CPPFLAGS and GCRYPT_LIBS.
Signed-off-by: Florian Forster <octo@collectd.org>
curl_xml plugin: Added support for XML namespaces
Signed-off-by: Florian Forster <octo@collectd.org>
Signed-off-by: Florian Forster <octo@collectd.org>
curl_xml plugin: Allow XML element nodes to be selected for text
This is a pretty basic use case, namely to select text within an XML
element, instead of just attribute values.
Signed-off-by: Florian Forster <octo@collectd.org>
This is a pretty basic use case, namely to select text within an XML
element, instead of just attribute values.
Signed-off-by: Florian Forster <octo@collectd.org>
curl* plugins: Added support for POST and arbitrary headers
These plugins can now be used for things like SOAP or XML-RPC calls.
Signed-off-by: Florian Forster <octo@collectd.org>
These plugins can now be used for things like SOAP or XML-RPC calls.
Signed-off-by: Florian Forster <octo@collectd.org>
Merge branch 'collectd-5.2'
Conflicts:
src/plugin.c
Conflicts:
src/plugin.c
Merge branch 'collectd-5.1' into collectd-5.2
Merge branch 'collectd-4.10' into collectd-5.1
Conflicts:
src/curl_json.c
Conflicts:
src/curl_json.c