]> git.ipfire.org Git - thirdparty/freeradius-server.git/commitdiff
use cf_log_err() instead of ERROR()
authorAlan T. DeKok <aland@freeradius.org>
Sat, 7 Feb 2026 16:06:26 +0000 (11:06 -0500)
committerAlan T. DeKok <aland@freeradius.org>
Sat, 7 Feb 2026 16:45:42 +0000 (11:45 -0500)
which prints out more descriptive messages

We should really look at moving to the BIOs.  There is a lot of
code duplication here. :(

20 files changed:
src/lib/io/master.c
src/lib/server/virtual_servers.c
src/listen/arp/proto_arp.c
src/listen/arp/proto_arp_ethernet.c
src/listen/bfd/proto_bfd_udp.c
src/listen/control/proto_control_unix.c
src/listen/cron/proto_cron_crontab.c
src/listen/detail/proto_detail.c
src/listen/detail/proto_detail_file.c
src/listen/detail/proto_detail_work.c
src/listen/dhcpv4/proto_dhcpv4_udp.c
src/listen/dhcpv6/proto_dhcpv6_udp.c
src/listen/dns/proto_dns_udp.c
src/listen/ldap_sync/proto_ldap_sync.c
src/listen/ldap_sync/proto_ldap_sync_ldap.c
src/listen/load/proto_load_step.c
src/listen/radius/proto_radius_tcp.c
src/listen/radius/proto_radius_udp.c
src/listen/tacacs/proto_tacacs_tcp.c
src/listen/vmps/proto_vmps_udp.c

index d843d078191fa4c5ce735431f73e7762199b085b..d0e9743c2129bc3f340755c9088fb5a67519fa70 100644 (file)
@@ -3231,7 +3231,6 @@ int fr_master_io_listen(fr_io_instance_t *inst, fr_schedule_t *sc,
         *      socket for us.
         */
        if (inst->app_io->open(child) < 0) {
-               cf_log_err(inst->app_io_conf, "Failed opening %s interface", inst->app_io->common.name);
                talloc_free(li);
                return -1;
        }
@@ -3253,10 +3252,8 @@ int fr_master_io_listen(fr_io_instance_t *inst, fr_schedule_t *sc,
 
                other = listen_find_any(thread->child);
                if (other) {
-                       ERROR("Failed opening %s - that port is already in use by another listener in server %s { ... } - %s",
-                             child->name, cf_section_name2(other->server_cs), other->name);
-
-                       ERROR("got socket %d %d\n", child->app_io_addr->inet.src_port, other->app_io_addr->inet.src_port);
+                       cf_log_err(other->cs, "Already opened socket %s", other->name);
+                       cf_log_err(li->cs, "Failed opening duplicate socket - cannot use the same configuration for two different listen sections");
 
                        talloc_free(li);
                        return -1;
index 12356b203f836a8522632aebd052e6542770480e..6226c79fd1c75dec8f2d96bbd27fdd3145382138 100644 (file)
@@ -1853,9 +1853,6 @@ int virtual_servers_open(fr_schedule_t *sc)
                                                           listener->proto_mi->conf);
                        module_instance_data_protect(listener->proto_mi);
                        if (unlikely(ret < 0)) {
-                               cf_log_err(listener->proto_mi->conf,
-                                          "Failed opening listener %s",
-                                          listener->proto_module->common.name);
                                return -1;
                        }
 
index a1bd248f314986df9cdcc75db6763379fef83314..36e49b64a01eeede612b527e531ac402e94e653c 100644 (file)
@@ -151,7 +151,7 @@ static ssize_t mod_encode(void const *instance, request_t *request, uint8_t *buf
  *     - 0 on success.
  *     - -1 on failure.
  */
-static int mod_open(void *instance, fr_schedule_t *sc, UNUSED CONF_SECTION *conf)
+static int mod_open(void *instance, fr_schedule_t *sc, CONF_SECTION *conf)
 {
        fr_listen_t     *li;
        proto_arp_t     *inst = talloc_get_type_abort(instance, proto_arp_t);
@@ -164,6 +164,7 @@ static int mod_open(void *instance, fr_schedule_t *sc, UNUSED CONF_SECTION *conf
        li = talloc_zero(inst, fr_listen_t);
        talloc_set_destructor(li, fr_io_listen_free);
 
+       li->cs = conf;
        li->app = &proto_arp;
        li->app_instance = instance;
        li->server_cs = inst->server_cs;
index 63b09eddaf43fa36efcf0f75215eaffdc43a7312..b3c971591bf7ab8267add4d0ce2d4c34542fe37d 100644 (file)
@@ -175,12 +175,12 @@ static int mod_open(fr_listen_t *li)
 
        thread->pcap = fr_pcap_init(thread, inst->interface, PCAP_INTERFACE_IN);
        if (!thread->pcap) {
-               PERROR("Failed initializing pcap handle.");
+               cf_log_err(li->cs, "Failed initializing pcap - %s", fr_strerror());
                return -1;
        }
 
        if (fr_pcap_open(thread->pcap) < 0) {
-               PERROR("Failed opening interface %s", inst->interface);
+               cf_log_err(li->cs, "Failed opening interface %s - %s", inst->interface, fr_strerror());
                return -1;
        }
 
@@ -194,7 +194,7 @@ static int mod_open(fr_listen_t *li)
        }
 
        if (fr_pcap_apply_filter(thread->pcap, filter) < 0) {
-               PERROR("Failed applying pcap filter '%s'", filter);
+               cf_log_err(li->cs, "Failed applying pcap filter '%s' - %s", filter, fr_strerror());
                talloc_free(our_filter);
                return -1;
        }
index 51183e7c192c05577e4938d37f6ac4484e197e77..b98bddb310fc274c4f72fe48e42ba8eeaa49a44b 100644 (file)
@@ -253,7 +253,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_udp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening UDP socket");
+               cf_log_err(li->cs, "Failed opening UDP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -268,7 +268,7 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set socket 'reuseport': %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set socket 'reuseport' - %s", fr_syserror(errno));
                        return -1;
                }
        }
@@ -279,7 +279,7 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->recv_buff;
                if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(int)) < 0) {
-                       WARN("Failed setting 'recv_buf': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'recv_buf' - %s", fr_syserror(errno));
                }
        }
 #endif
@@ -290,7 +290,7 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->send_buff;
                if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(int)) < 0) {
-                       WARN("Failed setting 'send_buf': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'send_buf' - %s", fr_syserror(errno));
                }
        }
 #endif
@@ -301,7 +301,7 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->ttl;
                if (setsockopt(sockfd, IPPROTO_IP, IP_TTL, &opt, sizeof(opt)) < 0) {
-                       WARN("Failed setting 'ttl': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'ttl' - %s", fr_syserror(errno));
                }
        }
 #endif
@@ -311,7 +311,7 @@ static int mod_open(fr_listen_t *li)
         */
        if (fr_socket_bind(sockfd, inst->interface, &ipaddr, &port) < 0) {
                close(sockfd);
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding socket - %s", fr_strerror());
                goto error;
        }
 
index 8a2c03c305a9e913557770752f8caed2338e1f77..276838891c849eee33a9758bb663f657e44e0b9e 100644 (file)
@@ -423,7 +423,7 @@ static int mod_open(fr_listen_t *li)
 
        thread->fd_bio = fr_bio_fd_alloc(thread, &cfg, 0);
        if (!thread->fd_bio) {
-               PERROR("Failed allocating UNIX path %s", inst->filename);
+               cf_log_err(li->cs, "Failed opening UNIX path %s - ", inst->filename, fr_strerror());
                return -1;
        }
 
index ec59ec845649c79d73bf03c254036d898b4591b3..e49301978b14b1a2a276eb47bde70f2b5cf8fcf3 100644 (file)
@@ -412,6 +412,9 @@ static int mod_open(fr_listen_t *li)
         */
        if (inst->filename == NULL) return -1;
        li->fd = open(inst->filename, O_RDONLY);
+       if (li->fd < 0) {
+               cf_log_err(li->cs, "Failed opening %s - %s", inst->filename, fr_syserror(errno));
+       }
 
        memset(&ipaddr, 0, sizeof(ipaddr));
        ipaddr.af = AF_INET;
index edfe309cf67f6178e245dbd83a6f5893e5e484c9..32f3ef88134ee52c042ec7d6f6985b5f3fd255f9 100644 (file)
@@ -439,6 +439,7 @@ static int mod_open(void *instance, fr_schedule_t *sc, CONF_SECTION *conf)
        MEM(li = talloc_zero(inst, fr_listen_t));       /* Assigned thread steals the memory */
        talloc_set_destructor(li, fr_io_listen_free);
 
+       li->cs = conf;
        li->app_io = inst->app_io;
        li->thread_instance = talloc_zero_array(li, uint8_t, li->app_io->common.thread_inst_size);
        talloc_set_name(li->thread_instance, "proto_%s_thread_t", inst->app_io->common.name);
index 6dbe41137621bcdf354e647bd7fcef5ec74f949c..aeb23b0338e11cad24d047394f0665823e4eb7ea 100644 (file)
@@ -323,6 +323,7 @@ static int work_exists(proto_detail_file_thread_t *thread, int fd)
         *      This listener is parented from the worker.  So that
         *      when the worker goes away, so does the listener.
         */
+       li->cs = inst->parent->work_io_conf;
        li->app_io = inst->parent->work_io;
 
        li->app = inst->parent->self;
index 20b4696d7b117636d8418145b4cad9975cd41c5e..96b88ae3225bdd93ec093a9d87aa61aa7767fe77 100644 (file)
@@ -703,7 +703,7 @@ static int mod_open(fr_listen_t *li)
                struct stat buf;
 
                if (fstat(thread->fd, &buf) < 0) {
-                       cf_log_err(inst->cs, "Failed examining %s: %s", thread->filename_work, fr_syserror(errno));
+                       cf_log_err(inst->cs, "Failed checking %s: %s", thread->filename_work, fr_syserror(errno));
                        return -1;
                }
 
index a30a5a1ed265b03133f0d54ee1751a30fea7cb2c..61c9cbec1fe63ec557e8ab0881b4d0ce61e262e3 100644 (file)
@@ -670,7 +670,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_udp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening UDP socket");
+               cf_log_err(li->cs, "Failed opening UDP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -685,7 +685,7 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set socket 'reuseport': %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set socket 'reuseport' - %s", fr_syserror(errno));
                        close(sockfd);
                        return -1;
                }
@@ -697,7 +697,7 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->recv_buff;
                if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(int)) < 0) {
-                       WARN("Failed setting 'recv_buf': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'recv_buf' - %s", fr_syserror(errno));
                }
        }
 #endif
@@ -706,16 +706,18 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set broadcast option: %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set 'broadcast' - %s", fr_syserror(errno));
                        close(sockfd);
                        return -1;
                }
        }
 
+       rad_suid_up();
        rcode = fr_socket_bind(sockfd, inst->interface, &ipaddr, &port);
+       rad_suid_down();
        if (rcode < 0) {
                close(sockfd);
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
                goto error;
        }
        if (inst->interface) li->app_io_addr->inet.src_ipaddr.scope_id = ipaddr.scope_id;
index 49302eed29d5481cbb942e073a150e57811ec98f..d4df661a23831558018d5d48c514bba7a7a25892 100644 (file)
@@ -288,7 +288,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_udp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening UDP socket");
+               cf_log_err(li->cs, "Failed opening UDP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -303,7 +303,7 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set socket 'reuseport': %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set socket 'reuseport' - %s", fr_syserror(errno));
                        close(sockfd);
                        return -1;
                }
@@ -315,7 +315,7 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->recv_buff;
                if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(int)) < 0) {
-                       WARN("Failed setting 'recv_buf': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'recv_buf' - %s", fr_syserror(errno));
                }
        }
 #endif
@@ -327,7 +327,7 @@ static int mod_open(fr_listen_t *li)
        rcode = fr_socket_bind(sockfd, inst->interface, &ipaddr, &port);
        rad_suid_down();
        if (rcode < 0) {
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
        close_error:
                close(sockfd);
                goto error;
index 75c0a069014c2535bff9b8cb9019f3acae362a3b..df8df2c1e69adad7a87cd3bf66aee2e854a6ae61 100644 (file)
@@ -266,7 +266,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_udp(&inst->ipaddr, &port, "domain", true);
        if (sockfd < 0) {
-               PERROR("Failed opening UDP socket");
+               cf_log_err(li->cs, "Failed opening UDP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -281,7 +281,7 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set socket 'reuseport': %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set socket 'reuseport' - %s", fr_syserror(errno));
                        close(sockfd);
                        return -1;
                }
@@ -294,7 +294,7 @@ static int mod_open(fr_listen_t *li)
        rcode = fr_socket_bind(sockfd, inst->interface, &ipaddr, &port);
        rad_suid_down();
        if (rcode < 0) {
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
                close(sockfd);
                goto error;
        }
index b9658b95fadf5c039e716db6fea45fae1e314a6d..d4c01b9b7ca03fa3f7aa5991332d880fffc8402e 100644 (file)
@@ -192,7 +192,7 @@ send:
        return fr_dbuff_used(&dbuff);
 }
 
-static int mod_open(void *instance, fr_schedule_t *sc, UNUSED CONF_SECTION *conf)
+static int mod_open(void *instance, fr_schedule_t *sc, CONF_SECTION *conf)
 {
        proto_ldap_sync_t       *inst = talloc_get_type_abort(instance, proto_ldap_sync_t);
        fr_listen_t             *li;
@@ -203,6 +203,7 @@ static int mod_open(void *instance, fr_schedule_t *sc, UNUSED CONF_SECTION *conf
        MEM(li = talloc_zero(inst, fr_listen_t));
        talloc_set_destructor(li, fr_io_listen_free);
 
+       li->cs = conf;
        li->app_io = inst->app_io;
        li->thread_instance = talloc_zero_array(NULL, uint8_t, li->app_io->common.thread_inst_size);
        talloc_set_name(li->thread_instance, "proto_%s_thread_t", inst->app_io->common.name);
index 10db36e787c7e3609de3d6db4f462ee5b42c2873..2368a4651ed228f45e426f05cb1ac75f9fe75850 100644 (file)
@@ -1139,6 +1139,7 @@ static void _proto_ldap_socket_init(connection_t *conn, UNUSED connection_state_
        thread->li = li;
        li->thread_instance = thread;
 
+       li->cs = thread->parent->cs;
        li->app_io = &proto_ldap_sync_child;
        li->name = li->app_io->common.name;
        li->default_message_size = li->app_io->default_message_size;
index 1e1da566b9f340fe121de5d7f4cd852daaa81bc2..d839a3907b005c7d0033de2f5a4c49ad37ceb27e 100644 (file)
@@ -202,6 +202,10 @@ static int mod_open(fr_listen_t *li)
         *      readable FD in order to bootstrap the process.
         */
        li->fd = open(inst->filename, O_RDONLY);
+       if (li->fd < 0) {
+               cf_log_err(li->cs, "Failed opening %s - %s", inst->filename, fr_syserror(errno));
+               return -1;
+       }
 
        memset(&ipaddr, 0, sizeof(ipaddr));
        ipaddr.af = AF_INET;
index 276097d37d4c9a37c372c4acca3185c405d7b523..4d9761320691d8c6cbaf094d4809e2f787581e0a 100644 (file)
@@ -340,7 +340,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_tcp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening TCP socket");
+               cf_log_err(li->cs, "Failed opening TCP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -349,13 +349,13 @@ static int mod_open(fr_listen_t *li)
 
        if (fr_socket_bind(sockfd, inst->interface, &ipaddr, &port) < 0) {
                close(sockfd);
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
                goto error;
        }
 
        if (listen(sockfd, 8) < 0) {
                close(sockfd);
-               PERROR("Failed listening on socket");
+               cf_log_err(li->cs, "Failed listening on socket - %s", fr_syserror(errno));
                goto error;
        }
 
index 69bf13412adde6697ade71a0a2f6b050fe617089..246973b7542540eb9796e11b76a1f89139e6697f 100644 (file)
@@ -310,7 +310,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_udp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening UDP socket");
+               cf_log_err(li->cs, "Failed opening UDP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -325,7 +325,7 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set socket 'reuseport': %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set socket 'reuseport': %s", fr_syserror(errno));
                        return -1;
                }
        }
@@ -336,7 +336,7 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->recv_buff;
                if (setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(int)) < 0) {
-                       WARN("Failed setting 'recv_buf': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'recv_buf': %s", fr_syserror(errno));
                }
        }
 #endif
@@ -347,14 +347,14 @@ static int mod_open(fr_listen_t *li)
 
                opt = inst->send_buff;
                if (setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &opt, sizeof(int)) < 0) {
-                       WARN("Failed setting 'send_buf': %s", fr_syserror(errno));
+                       cf_log_warn(li->cs, "Failed setting 'send_buf': %s", fr_syserror(errno));
                }
        }
 #endif
 
        if (fr_socket_bind(sockfd, inst->interface, &ipaddr, &port) < 0) {
                close(sockfd);
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
                goto error;
        }
 
index ef1188cc295aba40c929fa28449fcc7694e02376..3cc86af98ab3d0a287ae5fe2d91fbb68e1d3e6c3 100644 (file)
@@ -364,7 +364,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_tcp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening TCP socket");
+               cf_log_err(li->cs, "Failed opening TCP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -373,13 +373,13 @@ static int mod_open(fr_listen_t *li)
 
        if (fr_socket_bind(sockfd, inst->interface, &ipaddr, &port) < 0) {
                close(sockfd);
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
                goto error;
        }
 
        if (listen(sockfd, 8) < 0) {
                close(sockfd);
-               PERROR("Failed listening on socket");
+               cf_log_err(li->cs, "Failed listening on socket - %s", fr_syserror(errno));
                goto error;
        }
 
index f58fcb34942d241b1fe7bcb013712eac1e7ba8ee..1d3beda4256616e735244c3645a5a72420898a4f 100644 (file)
@@ -290,7 +290,7 @@ static int mod_open(fr_listen_t *li)
 
        li->fd = sockfd = fr_socket_server_udp(&inst->ipaddr, &port, inst->port_name, true);
        if (sockfd < 0) {
-               PERROR("Failed opening UDP socket");
+               cf_log_err(li->cs, "Failed opening UDP socket - %s", fr_strerror());
        error:
                return -1;
        }
@@ -305,14 +305,14 @@ static int mod_open(fr_listen_t *li)
                int on = 1;
 
                if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEPORT, &on, sizeof(on)) < 0) {
-                       ERROR("Failed to set socket 'reuseport': %s", fr_syserror(errno));
+                       cf_log_err(li->cs, "Failed to set socket 'reuseport' - %s", fr_syserror(errno));
                        return -1;
                }
        }
 
        if (fr_socket_bind(sockfd, inst->interface, &ipaddr, &port) < 0) {
                close(sockfd);
-               PERROR("Failed binding socket");
+               cf_log_err(li->cs, "Failed binding to socket - %s", fr_strerror());
                goto error;
        }