aboutsummaryrefslogtreecommitdiffstats
Commit message (Collapse)AuthorAgeFilesLines
* gpg: Don't assume that strtoul interprets "" as 0.Neal H. Walfield2017-02-021-2/+4
| | | | | | | | | | | | | | | | | | | | | | * g10/tofu.c (show_statistics): If there are not records, return 0 instead of NULL. -- Signed-off-by: Neal H. Walfield <[email protected]> GnuPG-bug-id: 2853 According to SUSv3: If the subject sequence is empty or does not have the expected form, no conversion is performed ... If no conversion could be performed, 0 is returned and errno may be set to [EINVAL]. http://pubs.opengroup.org/onlinepubs/007908799/xsh/strtol.html It appears that MacOS X sets errno to EINVAL, but glibc doesn't. Hence, we map NULL to 0 explicitly.
* tests: Improve description of test.Neal H. Walfield2017-02-021-1/+1
| | | | | | * tests/openpgp/issue2929.scm: Improve description of test. Signed-off-by: Neal H. Walfield <[email protected]>
* Revert "Revert "tests: Add test demonstrating issue2929.""Neal H. Walfield2017-02-022-1/+34
| | | | This reverts commit 59048b0f1aa77313573a1004cd3a9f02692a7521.
* gpg: Ensure TOFU bindings associated with UTKs are registered as usualNeal H. Walfield2017-02-021-6/+13
| | | | | | | | | * g10/tofu.c (get_trust): Call get_policy before short-circuiting the policy lookup for ultimately trusted keys to make sure the binding is added to the bindings table, if necessary. Signed-off-by: Neal H. Walfield <[email protected]> GnuPG-bug-id: 2929
* gpg: If there is a TOFU conflict, elide the too few message warning.Neal H. Walfield2017-02-021-1/+3
| | | | | | | * g10/tofu.c (tofu_get_validity): If there was a conflict, don't also print out a warning about too few messages. Signed-off-by: Neal H. Walfield <[email protected]>
* gpg: Only print out TOFU statistics for conflicts in interactive modeNeal H. Walfield2017-02-021-14/+69
| | | | | | | | | | | | | * g10/tofu.c (get_trust): Add arguments POLICYP and CONFLICT_SETP. If they are not NULL, return the policy and conflict set (if there is one), respectively. Update callers. If MAY_ASK is FALSE, don't print out the statistics. (tofu_register_encryption): If there is a conflict and we haven't yet printed the statistics about the conflicting bindings, do so now. (tofu_get_validity): Likewise. Signed-off-by: Neal H. Walfield <[email protected]> GnuPG-bug-id: 2914
* gpg: Add newline to output.Neal H. Walfield2017-02-021-1/+1
| | | | | | * g10/tofu.c (ask_about_binding): Add newline to output. Signed-off-by: Neal H. Walfield <[email protected]>
* gpg: Remove period at end of warning.Neal H. Walfield2017-02-021-1/+1
| | | | | | | * g10/tofu.c (tofu_register_encryption): Remove period at end of warning. Signed-off-by: Neal H. Walfield <[email protected]>
* dirmngr: New option --no-use-tor and internal changes.Werner Koch2017-02-0111-23/+75
| | | | | | | | | | | | | | | | | | | | | | * dirmngr/dns-stuff.c (disable_dns_tormode): New. * dirmngr/dirmngr.c (oNoUseTor): New const. (opts): New option --no-use-tor. (tor_mode): New var. (parse_rereadable_options): Change to use TOR_MODE. (dirmngr_use_tor): New. (set_tor_mode): Call disable_dns_tormode. Implement oNoUseTor. * dirmngr/dirmngr.h (opt): Remove field 'use_tor'. Replace all references by a call to dirmngr_use_tor(). * dirmngr/server.c (cmd_getinfo): Distinguish between default and enforced TOR_MODE. -- This patch replaces the global variable opt.use_tar by a function testing a file local mode flag. This patch prepares for a use-tor-if-available mode. GnuPG-bug-id: 2935 Signed-off-by: Werner Koch <[email protected]>
* Fix explanation of commit e175152ef7515921635bf1e00383e812668d13fc.Werner Koch2017-02-012-4/+6
| | | | --
* scd: Fix regression tracking the connection count.NIIBE Yutaka2017-01-313-24/+41
| | | | | | | | | | | | | | | | * scd/scdaemon.c (get_active_connection_count): New. (start_connection_thread): Bump ACTIVE_CONNECTIONS up and down. * scd/command.c (cmd_getinfo): Add subcommand "connections". -- Apply gpg-agent change to scdaemon. See the commit in 2016-08-06: 40d16029ed8b334c371fa7f24ac762d47302826e Then, add kicking the loop, so that main loop can notice the change of the connection. Signed-off-by: NIIBE Yutaka <[email protected]>
* gpgscm: Tune the hash tables.Justus Winter2017-01-311-3/+5
| | | | | | | | | | * tests/gpgscm/scheme.c (oblist_initial_value): Increase the size of the hash table based on the number of symbols used after initializing the interpreter. (new_frame_in_env): Increase the size of the hash table based on the number of variables in the global environement. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Optimize environment lookups and insertions.Justus Winter2017-01-311-50/+116
| | | | | | | | | | | | | | | | | | * tests/gpgscm/scheme.c (pointercmp): New function. (new_slot_spec_in_env): Add and use slot for insertions. (find_slot_spec_in_env): New variant of 'find_slot_in_env' that returns the slot on failures. (find_slot_in_env): Express using the new function. (new_slot_in_env): Update callsite. (opexe_0): Optimize lookup-or-insert. (opexe_1): Likewise. (scheme_define): Likewise. -- Optimize environment lookups by keeping the lists in the hash table or the list sorted. Optimize the insertions by passing the slot computed by the lookup to the insertion. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Fix build with list environments.Justus Winter2017-01-311-0/+1
| | | | | | | * tests/gpgscm/scheme.c (new_slot_spec_in_env): Provide preallocation inforomation if USE_ALIST_ENV. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Optimize symbol lookups and insertions.Justus Winter2017-01-311-23/+61
| | | | | | | | | | | | | | | | | * tests/gpgscm/scheme.c (oblist_find_by_name): Keep the list of symbols sorted, return the slot where a new symbol must be inserted on lookup failures. (oblist_add_by_name): Add the new symbol at the given slot. (mk_symbol): Adjust callsite. (gensym): Likewise. (assign_syntax): Likewise. -- Optimize symbol lookups by keeping the lists in the hash table (or the list if compiled with USE_OBJECT_LIST) sorted by the symbol names. Optimize the insertions by passing the slot computed by the lookup to the insertion. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Fix build with object list.Justus Winter2017-01-311-0/+1
| | | | | | | * tests/gpgscm/scheme.c (oblist_add_by_name): Provide preallocation information if USE_OBJECT_LIST. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Remove unused functions.Justus Winter2017-01-311-24/+0
| | | | | | | * tests/gpgscm/scheme.c (check_cell_alloced): Remove function. (check_range_alloced): Likewise. Signed-off-by: Justus Winter <[email protected]>
* dirmngr: Require --allow-version-check even if --use-tor is used.Werner Koch2017-01-312-3/+3
| | | | | | | * dirmngr/dirmngr.c (housekeeping_thread): Load swdb only if the option is set. Signed-off-by: Werner Koch <[email protected]>
* scd: Remove --debug-disable-ticker option.NIIBE Yutaka2017-01-312-34/+14
| | | | | | | | | | | | | * scd/scdaemon.c (ticker_disabled): Remove. (handle_tick, need_tick): Remove. (handle_connections): Don't check ticker_disabled. -- Now, removal of device/card is only done by the function scd_update_reader_status_file, it should be called if needed. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Fix SERIALNO for multiple devices.NIIBE Yutaka2017-01-315-76/+71
| | | | | | | | | | | | | | * scd/app.c (select_application): Fix the logic if periodical check is needed. If it is needed for newly found device(s), kick the loop. (scd_update_reader_status_file): Return value if select(2) should be called with timeout. * scd/ccid-driver.c (ccid_require_get_status): Don't return 0 for token with no interrupt transfer for now. * scd/command.c (open_card_with_request): Fix scan by SERIALNO. * scd/scdaemon.c (update_usb): Remove. (handle_connections): Evaluate need_tick after handle_tick. Signed-off-by: NIIBE Yutaka <[email protected]>
* gpgscm: Use a compact vector representation.Justus Winter2017-01-302-27/+36
| | | | | | | | | | | | | | | | | | | | | | | | | * tests/gpgscm/scheme-private.h (struct cell): Add a compact vector representation. * tests/gpgscm/scheme.c (vector_length): Use new representation. (vector_size): New macro. (get_vector_object): Use the new representation. (fill_vector): Likewise. (vector_elem): Likewise. (set_vector_elem): Likewise. (mark): Likewise. (gc): Likewise. Be careful not to confuse immediate values for type flags. (finalize_cell): Vectors now require finalization. -- Previously, vectors were represented using consecutive cons cells, wasting one word per cell for the type information. Fix that by using a flat array. Previously, a vector of size N required 1 + (n + 1) / 2 cells. Now it uses 1 + (n - 1 + 2) / 3 cells. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Provide framework for immediate values.Justus Winter2017-01-301-23/+39
| | | | | | | | | | | | | * tests/gpgscm/scheme.c (IMMEDIATE_TAG): New macro. ({is,set,clr}_immediate): Likewise. (enum scheme_types): Make type tags disjoint from immediate values. (TYPE_BITS): We need one more bit now. (ADJ,T_MASKTYPE): Compute values. -- Immediate values are disjoint from all type tags and pointers, allowing us to store immediate values in all memory locations. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Fix setting the line of the first gc reservation.Justus Winter2017-01-301-1/+1
| | | | | | * tests/gpgscm/scheme.c (_gc_disable): Negate guard. Signed-off-by: Justus Winter <[email protected]>
* gpgscm: Introduce macro for the vector length.Justus Winter2017-01-301-12/+13
| | | | | | | | | | | | | | | | | | | | * tests/gpgscm/scheme.c (vector_length): New macro. (get_vector_object): Use the new macro. (oblist_add_by_name): Likewise. (oblist_find_by_name): Likewise. (oblist_all_symbols): Likewise. (mk_vector): Likewise. (mark): Likewise. (new_slot_spec_in_env): Likewise. (find_slot_spec_in_env): Likewise. (opexe_2): Likewise. (opexe_5): Likewise. -- Introducing an abstraction reduces the coupling between code using vectors and the implementation of vectors. Signed-off-by: Justus Winter <[email protected]>
* Revert "tests: Add test demonstrating issue2929."Justus Winter2017-01-302-34/+1
| | | | This reverts commit 5aafa56dffefe3fac55b9d0555c7c86e8a07f072.
* Explain commit e175152ef7515921635bf1e00383e812668d13fc.Werner Koch2017-01-301-1/+9
| | | | --
* scd: Fix GetSlotStatus.NIIBE Yutaka2017-01-303-29/+31
| | | | | | | | | | | | | | | * scd/apdu.c (get_status_reader): Add ON_WIRE arg, here. (ct_get_status, pcsc_get_status_direct, pcsc_get_status_wrapped) (pcsc_get_status, get_status_ccid, my_rapdu_get_status): Likewise. (reset_pcsc_reader_wrapped, open_pcsc_reader_wrapped): Follow the change. (apdu_get_status_internal): It's lower-level driver which judge it's not needed. Otherwise, it can't detect the removal. * scd/ccid-driver.c (ccid_slot_status): After the POWERED_OFF check, we can skip sending GetSlotStatus packet on wire, when no need. Signed-off-by: NIIBE Yutaka <[email protected]> Fixes-commit: c8eee4d396a751d41fd1ee1e1b87b851fca172a
* scd: Don't send GET_STATUS packet if not needed.NIIBE Yutaka2017-01-301-8/+19
| | | | | | | | | * scd/apdu.c (apdu_get_status_internal): Add ON_WIRE arg. (apdu_connect): Call apdu_get_status_internal with ON_WIRE enabled. (apdu_get_status): For periodical check, call apdu_get_status_internal with ON_WIRE disabled. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Fix cancel INTERRUPT transfer.NIIBE Yutaka2017-01-291-19/+10
| | | | | | | * scd/ccid-driver.c (do_close_reader): Don't lock events, but check the return value of libusb_cancel_transfer. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: More changes on watching removal of card/reader.NIIBE Yutaka2017-01-275-113/+189
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * scd/app-common.h (struct app_ctx_s): Rename field to periodical_check_needed. * scd/scdaemon.c (update_usb): Rename from update_fdset_for_usb. Don't use libusb_get_pollfds any more. (scd_kick_the_loop): New. (need_tick): Follow the rename. (handle_connections): No libusb event handling here. * scd/app.c (app_new_register): Follow the change of rename. (select_application, scd_update_reader_status_file): Likewise. * scd/ccid-driver.c (ccid_usb_thread_is_alive): New. (intr_cb): Call scd_kick_the_loop. (ccid_usb_thread): New. Thread to invoke INTERRUPT callback. (ccid_open_usb_reader): Add thread invocation. (ccid_require_get_status): Remove LIBUSB_WORKS_EXPECTED_FOR_INTERRUPT_ENDP. (do_close_reader): Carefully handle handle->transfer. (get_escaped_usb_string): Insert npth_unprotect/npth_protect. (do_close_reader, bulk_out, bulk_in, abort_cmd, ccid_slot_status) (ccid_transceive, ccid_transceive_secure): Likewise. -- It found that libusb_get_pollfds is not supported on Windows. Besides, it's a bit difficult to use for the select loop. Thus, we use the thread named ccid_usb_thread, instead. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Fix release of transfer object.NIIBE Yutaka2017-01-271-17/+28
| | | | | | | | * scd/ccid-driver.c (intr_cb): Handle LIBUSB_TRANSFER_CANCELLED. (do_close_reader): When callback is active, call libusb_cancel_transfer and wait callback is fired off. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Improve watching USB device removal.NIIBE Yutaka2017-01-278-106/+127
| | | | | | | | | | | | | | | | | | | | | | | * scd/apdu.c(struct reader_table_s): Add require_get_status. (apdu_connect): Change return value meaning. Call apdu_reset here. * scd/app.c (app_new_register): Add require_get_status. (select_application): Use the return value of apdu_connect. (scd_update_reader_status_file): Call update_fdset_for_usb with checking all_have_intr_endp. (app_list_start, app_list_finish): Remove. * scd/ccid-driver.c (struct ccid_driver_s): Add transfer. (intr_cb): Don't call libusb_transfer in this callback. (ccid_require_get_status): New. (do_close_reader): Call libusb_transfer here. * scd/scdaemon.c (update_fdset_for_usb): Remove the first argument. -- With Gnuk Token, it works fine as expected. With Gemalto reader, intr_cb is not called when card is removed. So, the macro LIBUSB_WORKS_EXPECTED_FOR_INTERRUPT_ENDP is not defined yet. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Wake up the select when new USB scan.NIIBE Yutaka2017-01-271-6/+45
| | | | | | | | | | | | | | | * scd/scdaemon.c (update_fdset_for_usb): Wake up the select(2). (handle_connections): Use a kind of "self-pipe" technique. -- Use pipe to wake up select(2). If UNIX-only, signal could be used. For portability, "self-pipe" is better, here. Setup for non-blocking for pipe fds are not needed, because speed of USB device insertion is limited by human physical interaction; No one can do hundreds of device insertion/removal-s per second. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Only submit apdu_get_status when needed.NIIBE Yutaka2017-01-267-42/+145
| | | | | | | | | | | | | | | * scd/apdu.c (apdu_dev_list_finish): Return Boolean value if all device support INTERRUPT transfer. * scd/ccid-driver.c (ccid_dev_scan_finish): Likewise. * scd/app.c (app_new_register): Fix initial value of card_status. (select_application): Call update_fdset_for_usb. (scd_update_reader_status_file): Ditto. * scd/scdaemon.c (update_fdset_for_usb, need_tick): New. (handle_connections): Call handle_tick when select returns. Let select watch USB file descriptors, too. Call libusb_handle_events_timeout_completed for INTERRUPT transfer. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Fix APP reference counting.NIIBE Yutaka2017-01-262-2/+1
| | | | | | | | | * scd/app.c (scd_update_reader_status_file): Don't call another release_application_internal. * scd/command.c (open_card_with_request): Don't require APPTYPE != NULL. Signed-off-by: NIIBE Yutaka <[email protected]>
* scd: Add INTERRUPT endp support to CCID driver.NIIBE Yutaka2017-01-262-4/+70
| | | | | | | | | | * scd/app.c (scd_update_reader_status_file): Fix releas of APP. * scd/ccid-driver.c (struct ccid_driver_s): Add INTR_BUF. (intr_cb, ccid_setup_intr): New. (ccid_open_usb_reader): Call ccid_setup_intr. (ccid_slot_status): Return CCID_DRIVER_ERR_NO_READER when removed. Signed-off-by: NIIBE Yutaka <[email protected]>
* gpg: Fix searching for mail addresses in keyrings.Justus Winter2017-01-251-4/+18
| | | | | | | | | | | | * g10/keyring.c (compare_name): Fix KEYDB_SEARCH_MODE_MAIL* searches in keyrings when the UID is a plain addr-spec. -- Previously, 'gpg --list-key "<[email protected]>"' failed if 1/ the keyring format is used and 2/ the key's UID is a plain addr-spec (cf. RFC2822 section 4.3), e.g. '[email protected]'. GnuPG-bug-id: 2930 Signed-off-by: Justus Winter <[email protected]>
* tests,w32: Fix GPGME tests requiring a pinentry.Justus Winter2017-01-251-2/+4
| | | | | | | | | | | * tests/gpgme/gpgme-defs.scm: Use our fake pinentry, and configure it to supply the correct passphrase. -- Previously, the GPGME tests used the fake pinentry distributed with GPGME which is a Bourne shell script. Use the fake pinentry from GnuPG instead. Signed-off-by: Justus Winter <[email protected]>
* tests,w32: Fix gpgsm signature verification test.Justus Winter2017-01-251-4/+4
| | | | | | | | | | | * tests/gpgsm/verify.scm: Use 'call-with-binary-output-file' to avoid automatic line-ending conversion. -- Previously, Windows' automatic line-ending conversion turned '\n' into '\r\n' when writing the sample to a file, making the signature invalid. Signed-off-by: Justus Winter <[email protected]>
* agent: Fix double free.Justus Winter2017-01-251-2/+15
| | | | | | | | | | | | | | | | | * agent/cache.c (agent_store_cache_hit): Make sure the update is atomic. -- Previously, the function freed the last key, and duplicated the new key after doing that. There is a chance, however, that calling the allocator surrenders control to a different thread, causing a double free if a different thread also calls this function. To make sure the update is atomic under the non-preemptive thread model, we must make sure not to surrender control to a different thread. Therefore, we avoid calling the allocator during the update. Signed-off-by: Justus Winter <[email protected]>
* tests: Skip GPGME tests that are not built.Justus Winter2017-01-251-2/+5
| | | | | | | | | | * tests/gpgme/wrap.scm: Skip tests that are not built. -- Previously, all tests from GPGME's test suite that were not built (e.g. because GPGME was not configured with QT) were marked as failures. Signed-off-by: Justus Winter <[email protected]>
* tests,w32: Fix locating GPGME's tests on Windows.Justus Winter2017-01-251-1/+1
| | | | | | | | | | * tests/gpgme/run-tests.scm: Qualify the test with the executable extension. -- Previously, the test suite could not locate the test executables on Windows because the Windows-specific file extension was missing. Signed-off-by: Justus Winter <[email protected]>
* gpg: Print a warning on Tor problems.Werner Koch2017-01-242-16/+70
| | | | | | | | | | | | * dirmngr/ks-engine-hkp.c (tor_not_running_p): New. (map_host): Call that to print a warning. (handle_send_request_error): Ditto and avoid marking the host dead. Also print a tor_config_problem warning. Add arg CTRL; adjust callers to pass that new arg. * g10/call-dirmngr.c (ks_status_cb): Detect and print the new warnings. Signed-off-by: Werner Koch <[email protected]>
* dirmngr: Simplify error returning inside http.c.Werner Koch2017-01-241-51/+50
| | | | | | | | | | | | * dirmngr/http.c (connect_server): Change to return an gpg_error_t and to store socket at the passed address. (http_raw_connect, send_request): Adjust accordingly. -- This change removes cruft from the code and allows to return the error code from the name lookup. Signed-off-by: Werner Koch <[email protected]>
* dirmngr: New option --disable-ipv4.Werner Koch2017-01-2410-6/+46
| | | | | | | | | | | | | | | | | | | * dirmngr/dirmngr.c (oDisableIPv4): New const. (opts): New option --disable-ipv4. (parse_rereadable_options): Set that option. * dirmngr/dirmngr.h (opt): New field 'disable_ipv4'. * dirmngr/dns-stuff.c (opt_disable_ipv4): bew var. (set_dns_disable_ipv4): New. (resolve_name_standard): Skip v4 addresses when OPT_DISABLE_IPV4 is set. * dirmngr/ks-engine-hkp.c (map_host): Ditto. (send_request): Pass HTTP_FLAG_IGNORE_IPv4 if opt.disable_v4 is set. * dirmngr/crlfetch.c (crl_fetch): Ditto. * dirmngr/ks-engine-finger.c (ks_finger_fetch): Ditto. * dirmngr/ks-engine-http.c (ks_http_fetch): Ditto. * dirmngr/ocsp.c (do_ocsp_request): Ditto. Signed-off-by: Werner Koch <[email protected]>
* tools: Use platform abstraction for I/O.Justus Winter2017-01-241-10/+10
| | | | | | | | | | | | * tools/gpg-connect-agent.c (main): Use a gpgrt_stream_t for 'script_fp'. Adapt accordingly. -- Werner asked me to make gpgconf use the platform abstractions that were introduced after gpgconf's inception. After doing that, I realized that 'read_line' is only used in two more places, one of which this patch takes care of. Signed-off-by: Justus Winter <[email protected]>
* tools: Use platform abstraction for I/O.Justus Winter2017-01-241-96/+95
| | | | | | | | | | | | | | * tools/gpgconf-comp.c (retrieve_options_from_file): Use a gpgrt_stream_t for 'list_file'. Adapt accordingly. (copy_file): Likewise for 'src' and 'dst'. (change_options_file): Likewise for 'src_file' and 'dest_file'. (change_options_program): Likewise for 'src_file' and 'dest_file'. (gc_process_gpgconf_conf): Likewise for 'config'. -- Werner asked me to make gpgconf use the platform abstractions that were introduced after gpgconf's inception. Signed-off-by: Justus Winter <[email protected]>
* tools: Use platform abstraction for renaming files.Justus Winter2017-01-241-22/+16
| | | | | | | | | | | * tools/gpgconf-comp.c (gc_component_change_options): Use 'gnupg_rename_file'. Also, block signals across all renames in an attempt to make the whole process atomic. -- Werner asked me to make gpgconf use the platform abstractions that were introduced after gpgconf's inception. Signed-off-by: Justus Winter <[email protected]>
* tools: Add comments explaining the functions parameters.Justus Winter2017-01-241-2/+27
| | | | | | | | | | | | | | | | * tools/gpgconf-comp.c (change_options_file): Add comments explaining the functions parameters. (change_options_program): Likewise. -- From reading those two functions it is not clear why we write the new configuration to the source file, and read the current configuration from the destination file. The identifiers are named for the benefit of the callee. Note that identifiers that require that much explanation are poorly chosen. Signed-off-by: Justus Winter <[email protected]>
* tools: Improve error handling.Justus Winter2017-01-241-0/+2
| | | | | | | | | | * tools/gpgconf-comp.c (gp_component_change_options): Improve error handling when reading from stdin. -- Previously, errors encountered while reading the configuration changes were ignored. Signed-off-by: Justus Winter <[email protected]>