vlog: Add INFO level and apply it to messages for "normal" behavior.
authorBen Pfaff <blp@nicira.com>
Thu, 15 Jan 2009 22:57:59 +0000 (14:57 -0800)
committerBen Pfaff <blp@nicira.com>
Thu, 15 Jan 2009 22:57:59 +0000 (14:57 -0800)
Fixes bug #246.

17 files changed:
lib/dhcp-client.c
lib/learning-switch.c
lib/rconn.c
lib/vconn-ssl.c
lib/vlog.c
lib/vlog.h
lib/vlog.man
secchan/discovery.c
secchan/executer.c
secchan/fail-open.c
secchan/port-watcher.c
secchan/secchan.c
secchan/stp-secchan.c
utilities/vlogconf.8.in
utilities/vlogconf.c
vswitchd/bridge.c
vswitchd/cfg.c

index 4c12b4eb43e0b4917f5a2cf27196d36adabc2629..5cbd29712deb702b4b82f9fe3b7d0f93bf67176f 100644 (file)
@@ -851,11 +851,11 @@ state_transition(struct dhclient *cli, enum dhclient_state state)
         cli->changed = true;
         if (am_bound) {
             assert(cli->binding != NULL);
-            VLOG_WARN("%s: obtained address "IP_FMT", netmask "IP_FMT,
+            VLOG_INFO("%s: obtained address "IP_FMT", netmask "IP_FMT,
                       netdev_get_name(cli->netdev),
                       IP_ARGS(&cli->ipaddr), IP_ARGS(&cli->netmask));
             if (cli->router) {
-                VLOG_WARN("%s: obtained default gateway "IP_FMT,
+                VLOG_INFO("%s: obtained default gateway "IP_FMT,
                           netdev_get_name(cli->netdev), IP_ARGS(&cli->router));
             }
         } else {
@@ -863,7 +863,7 @@ state_transition(struct dhclient *cli, enum dhclient_state state)
             free(cli->binding);
             cli->binding = NULL;
 
-            VLOG_WARN("%s: network address unbound",
+            VLOG_INFO("%s: network address unbound",
                       netdev_get_name(cli->netdev));
         }
     }
@@ -967,7 +967,7 @@ do_receive_msg(struct dhclient *cli, struct dhcp_msg *msg)
                 VLOG_DBG_RL(&rl, "received %s",
                             dhcp_msg_to_string(msg, false, &cli->s)); 
             } else {
-                VLOG_WARN_RL(&rl, "received %s", dhcp_type_name(msg->type));
+                VLOG_INFO_RL(&rl, "received %s", dhcp_type_name(msg->type));
             }
             ofpbuf_uninit(&b);
             return true;
@@ -1046,7 +1046,7 @@ do_send_msg(struct dhclient *cli, const struct dhcp_msg *msg)
         if (VLOG_IS_DBG_ENABLED()) {
             VLOG_DBG("sending %s", dhcp_msg_to_string(msg, false, &cli->s)); 
         } else {
-            VLOG_WARN("sending %s", dhcp_type_name(msg->type));
+            VLOG_INFO("sending %s", dhcp_type_name(msg->type));
         }
         error = netdev_send(cli->netdev, &b);
         if (error) {
index 22838120849385e83635d273e31cdf2651d4cd01..377882344aa0f3bcef0d9315abf06f3cd10d2eca 100644 (file)
@@ -361,7 +361,7 @@ queue_tx(struct lswitch *sw, struct rconn *rconn, struct ofpbuf *b)
     int retval = rconn_send_with_limit(rconn, b, &sw->n_queued, 10);
     if (retval && retval != ENOTCONN) {
         if (retval == EAGAIN) {
-            VLOG_WARN_RL(&rl, "%012llx: %s: tx queue overflow",
+            VLOG_INFO_RL(&rl, "%012llx: %s: tx queue overflow",
                          sw->datapath_id, rconn_get_name(rconn));
         } else {
             VLOG_WARN_RL(&rl, "%012llx: %s: send: %s",
index 910c1ced4e7d1425ce86fc237b37acbe211edec8..96e413466d4d4bc8690973f58537b1cbbd0c5303 100644 (file)
@@ -296,7 +296,7 @@ reconnect(struct rconn *rc)
 {
     int retval;
 
-    VLOG_WARN("%s: connecting...", rc->name);
+    VLOG_INFO("%s: connecting...", rc->name);
     rc->n_attempted_connections++;
     retval = vconn_open(rc->name, OFP_VERSION, &rc->vconn);
     if (!retval) {
@@ -338,15 +338,15 @@ run_CONNECTING(struct rconn *rc)
 {
     int retval = vconn_connect(rc->vconn);
     if (!retval) {
-        VLOG_WARN("%s: connected", rc->name);
+        VLOG_INFO("%s: connected", rc->name);
         rc->n_successful_connections++;
         state_transition(rc, S_ACTIVE);
         rc->last_connected = rc->state_entered;
     } else if (retval != EAGAIN) {
-        VLOG_WARN("%s: connection failed (%s)", rc->name, strerror(retval));
+        VLOG_INFO("%s: connection failed (%s)", rc->name, strerror(retval));
         disconnect(rc, retval);
     } else if (timed_out(rc)) {
-        VLOG_WARN("%s: connection timed out", rc->name);
+        VLOG_INFO("%s: connection timed out", rc->name);
         rc->backoff_deadline = TIME_MAX; /* Prevent resetting backoff. */
         disconnect(rc, 0);
     }
@@ -565,7 +565,7 @@ void
 rconn_add_monitor(struct rconn *rc, struct vconn *vconn)
 {
     if (rc->n_monitors < ARRAY_SIZE(rc->monitors)) {
-        VLOG_WARN("new monitor connection from %s", vconn_get_name(vconn));
+        VLOG_INFO("new monitor connection from %s", vconn_get_name(vconn));
         rc->monitors[rc->n_monitors++] = vconn;
     } else {
         VLOG_DBG("too many monitor connections, discarding %s",
@@ -746,10 +746,10 @@ disconnect(struct rconn *rc, int error)
                           rc->name, strerror(error));
             } else if (error == EOF) {
                 if (rc->reliable) {
-                    VLOG_WARN("%s: connection closed by peer", rc->name);
+                    VLOG_INFO("%s: connection closed by peer", rc->name);
                 }
             } else {
-                VLOG_WARN("%s: connection dropped", rc->name);
+                VLOG_INFO("%s: connection dropped", rc->name);
             }
             vconn_close(rc->vconn);
             rc->vconn = NULL;
@@ -760,7 +760,7 @@ disconnect(struct rconn *rc, int error)
             rc->backoff = 1;
         } else {
             rc->backoff = MIN(rc->max_backoff, MAX(1, 2 * rc->backoff));
-            VLOG_WARN("%s: waiting %d seconds before reconnect\n",
+            VLOG_INFO("%s: waiting %d seconds before reconnect\n",
                       rc->name, rc->backoff);
         }
         rc->backoff_deadline = now + rc->backoff;
index c5a16250d975db1d97154dee3cf7d1f2e98a926b..7f415a09a3b3f40bf100c35ce888e6a11c80d849 100644 (file)
@@ -404,7 +404,7 @@ do_ca_cert_bootstrap(struct vconn *vconn)
         return error;
     }
 
-    VLOG_WARN("successfully bootstrapped CA cert to %s", ca_cert_file);
+    VLOG_INFO("successfully bootstrapped CA cert to %s", ca_cert_file);
     log_ca_cert(ca_cert_file, ca_cert);
     bootstrap_ca_cert = false;
     has_ca_cert = true;
@@ -423,7 +423,7 @@ do_ca_cert_bootstrap(struct vconn *vconn)
                  ERR_error_string(ERR_get_error(), NULL));
         return EPROTO;
     }
-    VLOG_WARN("killing successful connection to retry using CA cert");
+    VLOG_INFO("killing successful connection to retry using CA cert");
     return EPROTO;
 }
 
@@ -1155,7 +1155,7 @@ log_ca_cert(const char *file_name, X509 *cert)
         }
     }
     subject = X509_NAME_oneline(X509_get_subject_name(cert), NULL, 0);
-    VLOG_WARN("Trusting CA cert from %s (%s) (fingerprint %s)", file_name,
+    VLOG_INFO("Trusting CA cert from %s (%s) (fingerprint %s)", file_name,
               subject ? subject : "<out of memory>", ds_cstr(&fp));
     free(subject);
     ds_destroy(&fp);
index 0ebe890f454ff62ce0a906dd4fd38a514a7ed3be..e23d0173993e8ba7cad76ad53c87efea911f6604 100644 (file)
@@ -277,7 +277,7 @@ vlog_set_log_file(const char *file_name)
 
     /* Close old log file. */
     if (log_file) {
-        VLOG_WARN("closing log file");
+        VLOG_INFO("closing log file");
         fclose(log_file);
         log_file = NULL;
     }
@@ -304,7 +304,7 @@ vlog_set_log_file(const char *file_name)
                   log_file_name, strerror(errno));
         error = errno;
     } else {
-        VLOG_WARN("opened log file %s", log_file_name);
+        VLOG_INFO("opened log file %s", log_file_name);
         error = 0;
     }
 
@@ -407,7 +407,7 @@ vlog_init(void)
     time_t now;
 
     openlog(program_name, LOG_NDELAY, LOG_DAEMON);
-    vlog_set_levels(VLM_ANY_MODULE, VLF_ANY_FACILITY, VLL_WARN);
+    vlog_set_levels(VLM_ANY_MODULE, VLF_ANY_FACILITY, VLL_INFO);
 
     boot_time = time_msec();
     now = time_now();
index cd832a713d80216601a383442764815f8fda4664..8785851cb495293e0b1ae8be5b68f26af3b07910 100644 (file)
@@ -45,6 +45,7 @@
     VLOG_LEVEL(EMER, LOG_ALERT)                 \
     VLOG_LEVEL(ERR, LOG_ERR)                    \
     VLOG_LEVEL(WARN, LOG_WARNING)               \
+    VLOG_LEVEL(INFO, LOG_NOTICE)                \
     VLOG_LEVEL(DBG, LOG_DEBUG)
 enum vlog_level {
 #define VLOG_LEVEL(NAME, SYSLOG_LEVEL) VLL_##NAME,
@@ -148,6 +149,7 @@ void vlog_rate_limit(enum vlog_module, enum vlog_level,
 #define VLOG_EMER(...) VLOG(VLL_EMER, __VA_ARGS__)
 #define VLOG_ERR(...) VLOG(VLL_ERR, __VA_ARGS__)
 #define VLOG_WARN(...) VLOG(VLL_WARN, __VA_ARGS__)
+#define VLOG_INFO(...) VLOG(VLL_INFO, __VA_ARGS__)
 #define VLOG_DBG(...) VLOG(VLL_DBG, __VA_ARGS__)
 
 /* More convenience macros, for testing whether a given level is enabled in
@@ -156,6 +158,7 @@ void vlog_rate_limit(enum vlog_module, enum vlog_level,
 #define VLOG_IS_EMER_ENABLED() true
 #define VLOG_IS_ERR_ENABLED() vlog_is_enabled(THIS_MODULE, VLL_EMER)
 #define VLOG_IS_WARN_ENABLED() vlog_is_enabled(THIS_MODULE, VLL_WARN)
+#define VLOG_IS_INFO_ENABLED() vlog_is_enabled(THIS_MODULE, VLL_INFO)
 #define VLOG_IS_DBG_ENABLED() vlog_is_enabled(THIS_MODULE, VLL_DBG)
 
 /* Convenience macros.  To use these, define THIS_MODULE as a macro that
@@ -166,6 +169,7 @@ void vlog_rate_limit(enum vlog_module, enum vlog_level,
  */
 #define VLOG_ERR_RL(RL, ...) VLOG_RL(RL, VLL_ERR, __VA_ARGS__)
 #define VLOG_WARN_RL(RL, ...) VLOG_RL(RL, VLL_WARN, __VA_ARGS__)
+#define VLOG_INFO_RL(RL, ...) VLOG_RL(RL, VLL_INFO, __VA_ARGS__)
 #define VLOG_DBG_RL(RL, ...) VLOG_RL(RL, VLL_DBG, __VA_ARGS__)
 
 /* Command line processing. */
index f6d2acc6a929418a3751c69d9b0468f9e5016076..0e439f86160ee6dd2d54daa8509764ec0a2c3fb5 100644 (file)
@@ -21,7 +21,8 @@ will not take place unless \fB--log-file\fR is also specified (see
 below).
 
 .IP \(bu 
-\fIlevel\fR must be one of \fBemer\fR, \fBerr\fR, \fBwarn\fR, or
+\fIlevel\fR must be one of \fBemer\fR, \fBerr\fR, \fBwarn\fR,
+\fBinfo\fR, or
 \fBdbg\fR, designating the minimum severity of a message for it to be
 logged.  If it is omitted, \fIlevel\fR defaults to \fBdbg\fR.
 .RE
index cb39a37d750999e525e86c84ceac356fd5bb6d7a..feb9c338729ac06a3692e06a6e04daee7f8e3b75 100644 (file)
@@ -203,12 +203,12 @@ discovery_run(struct discovery *d, char **controller_name)
     if (dhclient_is_bound(d->dhcp)) {
         *controller_name = dhcp_msg_get_string(dhclient_get_config(d->dhcp),
                                                DHCP_CODE_OFP_CONTROLLER_VCONN);
-        VLOG_WARN("%s: discovered controller", *controller_name);
+        VLOG_INFO("%s: discovered controller", *controller_name);
         d->n_changes++;
     } else {
         *controller_name = NULL;
         if (d->n_changes) {
-            VLOG_WARN("discovered controller no longer available");
+            VLOG_INFO("discovered controller no longer available");
             d->n_changes++;
         }
     }
index 008d2cc1c1db5e0702e5cb5774b1f3e40dba4692..964a8b94c00ad12c1c819e8e3acc49582f785c85 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2009 The Board of Trustees of The Leland Stanford
  * Junior University
  *
  * We are making the OpenFlow specification and associated documentation
@@ -126,7 +126,7 @@ executer_is_permitted(const char *acl_, const char *cmd)
 
     /* Check the command white/blacklisted state. */
     if (allowed && !denied) {
-        VLOG_WARN("permitting command execution: \"%s\" is whitelisted", cmd);
+        VLOG_INFO("permitting command execution: \"%s\" is whitelisted", cmd);
     } else if (allowed && denied) {
         VLOG_WARN("denying command execution: \"%s\" is both blacklisted "
                   "and whitelisted", cmd);
@@ -252,7 +252,7 @@ executer_remote_packet_cb(struct relay *r, void *e_)
         /* Running in parent. */
         struct child *child;
 
-        VLOG_WARN("started \"%s\" subprocess", argv[0]);
+        VLOG_INFO("started \"%s\" subprocess", argv[0]);
         send_child_status(r, request->header.xid, NXT_STATUS_STARTED, NULL, 0);
         child = &e->children[e->n_children++];
         child->name = xstrdup(argv[0]);
@@ -330,7 +330,7 @@ child_terminated(struct child *child, int status)
     if (WCOREDUMP(status)) {
         ds_put_cstr(&ds, " (core dumped)");
     }
-    VLOG_WARN("child process \"%s\" with pid %ld terminated %s",
+    VLOG_INFO("child process \"%s\" with pid %ld terminated %s",
               child->name, (long int) child->pid, ds_cstr(&ds));
     ds_destroy(&ds);
 
index 06e1c31ee5e8a883a851923129fdf0d5f2623269..eb28bc38b4a64eb93af69d6cc912dffe1a42ba78 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008 The Board of Trustees of The Leland Stanford
+/* Copyright (c) 2008, 2009 The Board of Trustees of The Leland Stanford
  * Junior University
  *
  * We are making the OpenFlow specification and associated documentation
@@ -84,7 +84,7 @@ fail_open_periodic_cb(void *fail_open_)
             fail_open->last_disconn_secs = disconn_secs;
         }
     } else if (open && disconn_secs > fail_open->last_disconn_secs + 60) {
-        VLOG_WARN("Still in fail-open mode after %d seconds disconnected "
+        VLOG_INFO("Still in fail-open mode after %d seconds disconnected "
                   "from controller", disconn_secs);
         fail_open->last_disconn_secs = disconn_secs;
     }
index dcc4e31c726a47a3766200f7795cb6266d15b135..97e5a9ffa4f885b23681d320a436ddb4a5aebf07 100644 (file)
@@ -157,7 +157,7 @@ call_local_port_changed_callbacks(struct port_watcher *pw)
     }
     if (strcmp(pw->local_port_name, name)) {
         if (name[0]) {
-            VLOG_WARN("Identified data path local port as \"%s\".", name);
+            VLOG_INFO("Identified data path local port as \"%s\".", name);
         } else {
             VLOG_WARN("Data path has no local port.");
         }
@@ -222,7 +222,7 @@ port_watcher_local_packet_cb(struct relay *r, void *pw_)
         pw->got_feature_reply = true;
         if (pw->datapath_id != osf->datapath_id) {
             pw->datapath_id = osf->datapath_id;
-            VLOG_WARN("Datapath id is %012"PRIx64, ntohll(pw->datapath_id));
+            VLOG_INFO("Datapath id is %012"PRIx64, ntohll(pw->datapath_id));
         }
 
         /* Update each port included in the message. */
index 03a5b7915d51fc8da5ee8a8de65dd0cda470b73c..c17d02cac0bb9614ebbbcb795d0dea4369997ef6 100644 (file)
@@ -154,8 +154,8 @@ main(int argc, char *argv[])
         ofp_fatal(retval, "Could not listen for vlog connections");
     }
 
-    VLOG_WARN("OpenFlow reference implementation version %s", VERSION BUILDNR);
-    VLOG_WARN("OpenFlow protocol version 0x%02x", OFP_VERSION);
+    VLOG_INFO("OpenFlow reference implementation version %s", VERSION BUILDNR);
+    VLOG_INFO("OpenFlow protocol version 0x%02x", OFP_VERSION);
 
     /* Check datapath name, to try to catch command-line invocation errors. */
     if (strncmp(s.dp_name, "nl:", 3) && strncmp(s.dp_name, "unix:", 5)
index 917cea45f781898863c89eac63965566d8fef99f..152595e9100dbe546c93fc4d1aa1e0968bc9ad82 100644 (file)
@@ -151,7 +151,7 @@ stp_periodic_cb(void *stp_)
         enum stp_state s_state = stp_port_get_state(p);
 
         if (s_state != STP_DISABLED) {
-            VLOG_WARN("STP: Port %d entered %s state",
+            VLOG_INFO("STP: Port %d entered %s state",
                       port_no, stp_state_name(s_state));
         }
         if (!(port_watcher_get_config(stp->pw, port_no) & OFPPC_NO_STP)) {
index b120a3874a9352f751b8919c9c55a9bf19939756..65c9857fd51634194d781155645ccdeecbac462a 100644 (file)
@@ -76,7 +76,7 @@ set the logging levels for all modules.  The \fIfacility\fR may be
 system log or to the console, respectively, or \fBANY\fR to set the
 logging levels for both facilities.  If it is omitted,
 \fIfacility\fR defaults to \fBANY\fR.  The \fIlevel\fR must be one of
-\fBemer\fR, \fBerr\fR, \fBwarn\fR, or \fBdbg\fR, designating the
+\fBemer\fR, \fBerr\fR, \fBwarn\fR, \fBinfo\fR, or \fBdbg\fR, designating the
 minimum severity of a message for it to be logged.  If it is omitted,
 \fIlevel\fR defaults to \fBdbg\fR.
 
index 1187dcc21f54fd3d60fb0ef11cbd5a3c82a5f9a6..5c48f724549e8ec1d83bb7e4c85f467ab83b64da 100644 (file)
@@ -62,7 +62,7 @@ usage(char *prog_name, int exit_code)
            "        Set MODULE and FACILITY log level to LEVEL\n"
            "        MODULE may be any valid module name or 'ANY'\n"
            "        FACILITY may be 'syslog', 'console', 'file', or 'ANY' (default)\n"
-           "        LEVEL may be 'emer', 'err', 'warn', or 'dbg' (default)\n"
+           "        LEVEL may be 'emer', 'err', 'warn', 'info', or 'dbg' (default)\n"
            "  -r, --reopen       Make the program reopen its log file\n"
            "  -h, --help         Print this helpful information\n",
            prog_name);
index 6d06648e76a89873cadd0fb352756752645998f3..78c1f2db491ab38658a9b94f0825c5860a9fb4da 100644 (file)
@@ -495,7 +495,7 @@ bridge_create(const char *name)
         VLOG_WARN("bad dp_idx for bridge %s", br->name);
     }
 
-    VLOG_WARN("created bridge %s with dp_idx %d", br->name, br->dp_idx);
+    VLOG_INFO("created bridge %s with dp_idx %d", br->name, br->dp_idx);
 
     return br;
 }
@@ -1214,17 +1214,17 @@ bond_link_status_update(struct iface *iface, bool carrier)
         /* Nothing to do. */
         return;
     }
-    VLOG_WARN_RL(&rl, "interface %s: carrier %s",
+    VLOG_INFO_RL(&rl, "interface %s: carrier %s",
                  iface->name, carrier ? "detected" : "dropped");
     if (carrier == iface->enabled) {
         iface->delay_expires = LLONG_MAX;
-        VLOG_WARN_RL(&rl, "interface %s: will not be %s",
+        VLOG_INFO_RL(&rl, "interface %s: will not be %s",
                      iface->name, carrier ? "disabled" : "enabled");
     } else {
         int delay = carrier ? port->updelay : port->downdelay;
         iface->delay_expires = time_msec() + delay;
         if (delay) {
-            VLOG_WARN_RL(&rl,
+            VLOG_INFO_RL(&rl,
                          "interface %s: will be %s if it stays %s for %d ms",
                          iface->name,
                          carrier ? "enabled" : "disabled",
@@ -1242,7 +1242,7 @@ bond_choose_active_iface(struct port *port)
     port->active_iface = bond_choose_iface(port);
     port->active_iface_tag = tag_create_random();
     if (port->active_iface >= 0) {
-        VLOG_WARN_RL(&rl, "port %s: active interface is now %s",
+        VLOG_INFO_RL(&rl, "port %s: active interface is now %s",
                      port->name, port->ifaces[port->active_iface]->name);
     } else {
         VLOG_WARN_RL(&rl, "port %s: all ports disabled, no active interface",
@@ -2322,7 +2322,7 @@ port_create(struct bridge *br, const char *name)
     }
     br->ports[br->n_ports++] = port;
 
-    VLOG_WARN("created port %s on bridge %s", port->name, br->name);
+    VLOG_INFO("created port %s on bridge %s", port->name, br->name);
     bridge_flush(br);
 }
 
@@ -2670,7 +2670,7 @@ mirror_create(struct bridge *br, const char *name)
         }
     }
 
-    VLOG_WARN("created port mirror %s on bridge %s", name, br->name);
+    VLOG_INFO("created port mirror %s on bridge %s", name, br->name);
     bridge_flush(br);
 
     br->mirrors[i] = m = xcalloc(1, sizeof *m);
@@ -3033,14 +3033,13 @@ brstp_update_port_state(struct port *p)
     /* Update state. */
     if (p->stp_state != state) {
         static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(10, 10);
-        VLOG_WARN_RL(&rl, "port %s: STP state changed from %s to %s",
+        VLOG_INFO_RL(&rl, "port %s: STP state changed from %s to %s",
                      p->name, stp_state_name(p->stp_state),
                      stp_state_name(state));
         if (p->stp_state == STP_DISABLED) {
             bridge_flush(br);
         } else {
             tag_set_add(&p->bridge->revalidate_set, p->stp_state_tag);
-            printf("invalidate %x\n", p->stp_state_tag);
         }
         p->stp_state = state;
         p->stp_state_tag = (p->stp_state == STP_DISABLED ? 0
index 788b462bf5e556cb94302df035cef96ca3e4f8fc..8aa420d3088c2546efb21a1caa8cbdca090a744a 100644 (file)
@@ -97,7 +97,7 @@ cfg_add_file(const char *file_name)
     close(fd);
 
     /* Add it to the list. */
-    VLOG_WARN("using \"%s\" as a configuration file", file_name);
+    VLOG_INFO("using \"%s\" as a configuration file", file_name);
     svec_add(&cfg_files, file_name);
     return 0;
 }
@@ -114,7 +114,7 @@ cfg_read(void)
     svec_clear(&cfg);
 
     /* Read new configuration. */
-    VLOG_WARN("reading configuration...");
+    VLOG_INFO("reading configuration...");
     for (i = 0; i < cfg_files.n; i++) {
         const char *fn = cfg_files.names[i];
         struct stat s;