Example #1
0
int lua_apr_time_format(lua_State *L)
{
  char formatted[1024];
  apr_status_t status;
  const char *format;

  luaL_checktype(L, 1, LUA_TSTRING);
  format = lua_tostring(L, 1);

  if (strcmp(format, "ctime") == 0) {
    status = apr_ctime(formatted, time_check(L, 2));
    if (status != APR_SUCCESS)
      return push_error_status(L, status);
    lua_pushlstring(L, formatted, APR_CTIME_LEN - 1);
    return 1;
  } else if (strcmp(format, "rfc822") == 0) {
    status = apr_rfc822_date(formatted, time_check(L, 2));
    if (status != APR_SUCCESS)
      return push_error_status(L, status);
    lua_pushlstring(L, formatted, APR_RFC822_DATE_LEN - 1);
    return 1;
  } else {
    apr_time_exp_t components = { 0 };
    apr_size_t length = count(formatted);
    time_check_exploded(L, 2, &components, 1);
    status = apr_strftime(formatted, &length, length, format, &components);
    if (status != APR_SUCCESS)
      return push_error_status(L, status);
    lua_pushlstring(L, formatted, length);
    return 1;
  }
}
Example #2
0
void util_ldap_compare_node_display(request_rec *r, util_ald_cache_t *cache, void *n)
{
    util_compare_node_t *node = (util_compare_node_t *)n;
    char date_str[APR_CTIME_LEN+1];
    char *buf, *cmp_result;

    apr_ctime(date_str, node->lastcompare);

    if (node->result == LDAP_COMPARE_TRUE) {
        cmp_result = "LDAP_COMPARE_TRUE";
    }
    else if (node->result == LDAP_COMPARE_FALSE) {
        cmp_result = "LDAP_COMPARE_FALSE";
    }
    else {
        cmp_result = apr_itoa(r->pool, node->result);
    }

    buf = apr_psprintf(r->pool, 
             "<tr valign='top'>"
             "<td nowrap>%s</td>"
             "<td nowrap>%s</td>"
             "<td nowrap>%s</td>"
             "<td nowrap>%s</td>"
             "<td nowrap>%s</td>"
             "<tr>",
         node->dn,
         node->attrib,
         node->value,
         date_str,
         cmp_result);

    ap_rputs(buf, r);
}
static int log_scripterror(request_rec *r, cgi_server_conf * conf, int ret,
                           apr_status_t rv, char *error)
{
    apr_file_t *f = NULL;
    apr_finfo_t finfo;
    char time_str[APR_CTIME_LEN];
    int log_flags = rv ? APLOG_ERR : APLOG_ERR;

    ap_log_rerror(APLOG_MARK, log_flags, rv, r,
                  "%s: %s", error, r->filename);

    /* XXX Very expensive mainline case! Open, then getfileinfo! */
    if (!conf->logname ||
        ((apr_stat(&finfo, conf->logname,
                   APR_FINFO_SIZE, r->pool) == APR_SUCCESS) &&
         (finfo.size > conf->logbytes)) ||
        (apr_file_open(&f, conf->logname,
                       APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT,
                       r->pool) != APR_SUCCESS)) {
        return ret;
    }

    /* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */
    apr_ctime(time_str, apr_time_now());
    apr_file_printf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri,
                    r->args ? "?" : "", r->args ? r->args : "", r->protocol);
    /* "%% 500 /usr/local/apache/cgi-bin */
    apr_file_printf(f, "%%%% %d %s\n", ret, r->filename);

    apr_file_printf(f, "%%error\n%s\n", error);

    apr_file_close(f);
    return ret;
}
Example #4
0
TCN_IMPLEMENT_CALL(jstring, Time, ctime)(TCN_STDARGS, jlong t)
{
    char ts[APR_CTIME_LEN];
    UNREFERENCED(o);
    if (apr_ctime(ts, J2T(t)) == APR_SUCCESS)
        return AJP_TO_JSTRING(ts);
    else
        return NULL;
}
ls_status_t libswitch_postConfig(apr_pool_t* p, apr_pool_t* plog, apr_pool_t* ptemp, Config* config){
	config_core* ccore=NULL;
	ce_error_list* errorList=NULL;
	char* error=NULL;
	char cbuf[APR_CTIME_LEN + 1];
	
	// normalize paths
	config->config_core_file = apr_pstrcat(p, config->home_dir, "/", config->config_core_file, NULL);
	config->logfile_name = apr_pstrcat(p, config->home_dir, "/", config->logfile_name, NULL);

	logcore_openLogFile(p,config->logfile_name);
	logcore_truncateLogFile();
	apr_time_t t1 = apr_time_now();
	apr_ctime(cbuf, t1);
	logcore_printLog("\n°\t Initializing %s [%s][%s]\n",VERSION_ID,config->systemInfo,cbuf);

	fflush(stdout);
	http_init();
	
	fflush(stdout);
	//printf("‚àö Success using the following configuration:\r\n");
	fflush(stdout);
	//init Error Obj
	errorList=ce_newErrorListObj(p);
	
	//load crypto core
	logcore_printLog("\r\n\r\n");
	ccore=cc_newConfigCoreObj(p);
	ccore->globals->homeDir=apr_pstrdup(p,config->home_dir);
	ccore->globals->logsDir=apr_pstrcat(p,config->home_dir,"/logs",NULL);
	ccore->refreshLogFile=apr_pstrdup(p,config->logfile_name);
	error=cc_loadConfigCoreFile(p, config->config_core_file, ccore);
	ce_addErrorWithType(p,errorList,"Config Core Load File",error);
	if(error==NULL){
		cc_printConfigCoreDetails(p,ccore);
		error=cc_initializeConfigCore(p,ccore);
		ce_addErrorWithType(p,errorList,"Config Core Init",error);
		config->configCore=ccore;
		logcore_printLog("‚àö Config Core Initialized\n");
		
		logcore_printLog("° Binding Config Core Services\n");
		error=libswitch_postRefreshBind(p,config);
		ce_addErrorWithType(p,errorList,"Config Core Bind",error);
	}

	if(!ce_hasErrors(errorList)){
		logcore_printLog("\r\n>> %s [%s] - Libswitch initialized <<\r\n",VERSION_ID,config->systemInfo);
	}else{
		logcore_printLog("\r\n>> %s [%s] - Libswitch initialized WITH ERRORS<<\r\n",VERSION_ID,config->systemInfo);
		ce_printList(p,errorList);
		return LS_FAILURE;
	}
	return LS_SUCCESS;
}
Example #6
0
void util_ldap_url_node_display(request_rec *r, util_ald_cache_t *cache, void *n)
{
    util_url_node_t *node = (util_url_node_t *)n;
    char date_str[APR_CTIME_LEN+1];
    char *buf;
    const char *type_str;
    util_ald_cache_t *cache_node;
    int x;

    for (x=0;x<3;x++) {
        switch (x) {
            case 0:
                cache_node = node->search_cache;
                type_str = "Searches";
                break;
            case 1:
                cache_node = node->compare_cache;
                type_str = "Compares";
                break;
            case 2:
                cache_node = node->dn_compare_cache;
                type_str = "DN Compares";
                break;
        }
        
        if (cache_node->marktime) {
            apr_ctime(date_str, cache_node->marktime);
        }
        else 
            date_str[0] = 0;

        buf = apr_psprintf(r->pool, 
                 "<tr valign='top'>"
                 "<td nowrap>%s (%s)</td>"
                 "<td nowrap>%ld</td>"
                 "<td nowrap>%ld</td>"
                 "<td nowrap>%ld</td>"
                 "<td nowrap>%ld</td>"
                 "<td nowrap>%s</td>"
                 "<tr>",
             node->url,
             type_str,
             cache_node->size,
             cache_node->maxentries,
             cache_node->numentries,
             cache_node->fullmark,
             date_str);
    
        ap_rputs(buf, r);
    }

}
Example #7
0
void util_ldap_compare_node_display(request_rec *r, util_ald_cache_t *cache, void *n)
{
    util_compare_node_t *node = n;
    char date_str[APR_CTIME_LEN];
    char *cmp_result;
    char *sub_groups_val;
    char *sub_groups_checked;

    apr_ctime(date_str, node->lastcompare);

    if (node->result == LDAP_COMPARE_TRUE) {
        cmp_result = "LDAP_COMPARE_TRUE";
    }
    else if (node->result == LDAP_COMPARE_FALSE) {
        cmp_result = "LDAP_COMPARE_FALSE";
    }
    else {
        cmp_result = apr_itoa(r->pool, node->result);
    }

    if (node->subgroupList) {
        sub_groups_val = "Yes";
    }
    else {
        sub_groups_val = "No";
    }

    if (node->sgl_processed) {
        sub_groups_checked = "Yes";
    }
    else {
        sub_groups_checked = "No";
    }

    ap_rprintf(r,
               "<tr valign='top'>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "</tr>",
               node->dn,
               node->attrib,
               node->value,
               date_str,
               cmp_result,
               sub_groups_val,
               sub_groups_checked);
}
Example #8
0
void util_ldap_url_node_display(request_rec *r, util_ald_cache_t *cache, void *n)
{
    util_url_node_t *node = n;
    char date_str[APR_CTIME_LEN];
    const char *type_str;
    util_ald_cache_t *cache_node;
    int x;

    for (x=0;x<3;x++) {
        switch (x) {
            case 0:
                cache_node = node->search_cache;
                type_str = "Searches";
                break;
            case 1:
                cache_node = node->compare_cache;
                type_str = "Compares";
                break;
            case 2:
            default:
                cache_node = node->dn_compare_cache;
                type_str = "DN Compares";
                break;
        }

        if (cache_node->marktime) {
            apr_ctime(date_str, cache_node->marktime);
        }
        else
            date_str[0] = 0;

        ap_rprintf(r,
                   "<tr valign='top'>"
                   "<td nowrap>%s (%s)</td>"
                   "<td nowrap>%ld</td>"
                   "<td nowrap>%ld</td>"
                   "<td nowrap>%ld</td>"
                   "<td nowrap>%" APR_TIME_T_FMT "</td>"
                   "<td nowrap>%ld</td>"
                   "<td nowrap>%s</td>"
                   "</tr>",
                   node->url,
                   type_str,
                   cache_node->size,
                   cache_node->maxentries,
                   cache_node->numentries,
                   apr_time_sec(cache_node->ttl),
                   cache_node->fullmark,
                   date_str);
    }

}
Example #9
0
static int JK_METHOD jk2_logger_file_jkVLog(jk_env_t *env, jk_logger_t *l,
                                  const char *file,
                                  int line,
                                  int level,
                                  const char *fmt,
                                  va_list args)
{
    int rc = 0;
    char *buf;
    char *fmt1;
    apr_pool_t *aprPool = env->tmpPool->_private;
    char rfctime[APR_RFC822_DATE_LEN];
    apr_time_t time = apr_time_now();
    
    if (!file || !args)
        return -1;


    if (l->logger_private == NULL ||
        l->level <= level) {
        char *f = (char *)(file + strlen(file) - 1);
        char *slevel;
        switch (level){
            case JK_LOG_INFO_LEVEL:
                slevel = JK_LOG_INFO_VERB;
                break;
            case JK_LOG_ERROR_LEVEL:
                slevel = JK_LOG_ERROR_VERB;
                break;
            case JK_LOG_EMERG_LEVEL:
                slevel = JK_LOG_EMERG_VERB;
                break;
            case JK_LOG_DEBUG_LEVEL:
            default:
                slevel = JK_LOG_DEBUG_VERB;
                break;
        }
        while (f != file && *f != '\\' && *f != '/')
            f--;
        if (f != file)
            ++f;
        
        /* XXX rfc822_date or apr_ctime ? */
        apr_ctime(rfctime, time);
        fmt1 = apr_psprintf(aprPool, "[%s] (%5s ) [%s (%d)]  %s", rfctime, slevel, f, line, fmt);
        buf = apr_pvsprintf(aprPool, fmt1, args);

        l->log(env, l, level, buf);        
    }
    
    return rc;
}
Example #10
0
AP_DECLARE(void) ap_log_assert(const char *szExp, const char *szFile,
                               int nLine)
{
    char time_str[APR_CTIME_LEN];

    apr_ctime(time_str, apr_time_now());
    ap_log_error(APLOG_MARK, APLOG_CRIT, 0, NULL,
                 "[%s] file %s, line %d, assertion \"%s\" failed",
                 time_str, szFile, nLine, szExp);
#if defined(WIN32)
    DebugBreak();
#else
    /* unix assert does an abort leading to a core dump */
    abort();
#endif
}
Example #11
0
void util_ldap_search_node_display(request_rec *r, util_ald_cache_t *cache, void *n)
{
    util_search_node_t *node = n;
    char date_str[APR_CTIME_LEN];

    apr_ctime(date_str, node->lastbind);

    ap_rprintf(r,
               "<tr valign='top'>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "<td nowrap>%s</td>"
               "</tr>",
               node->username,
               node->dn,
               date_str);
}
Example #12
0
static void test_ctime(CuTest *tc)
{
    apr_status_t rv;
    char apr_str[STR_SIZE];
    char libc_str[STR_SIZE];
    time_t posix_sec = (time_t)apr_time_sec(now);

    rv = apr_ctime(apr_str, now);
    if (rv == APR_ENOTIMPL) {
        CuNotImpl(tc, "apr_ctime");
    }
    CuAssertTrue(tc, rv == APR_SUCCESS);
    strcpy(libc_str, ctime(&posix_sec));
    *strchr(libc_str, '\n') = '\0';

    CuAssertStrEquals(tc, libc_str, apr_str);
}
Example #13
0
static process_rec *init_process(int *argc, const char * const * *argv)
{
    process_rec *process;
    apr_pool_t *cntx;
    apr_status_t stat;
    const char *failed = "apr_app_initialize()";

    stat = apr_app_initialize(argc, argv, NULL);
    if (stat == APR_SUCCESS) {
        failed = "apr_pool_create()";
        stat = apr_pool_create(&cntx, NULL);
    }

    if (stat != APR_SUCCESS) {
        /* For all intents and purposes, this is impossibly unlikely,
         * but APR doesn't exist yet, we can't use it for reporting
         * these earliest two failures;
         */
        char ctimebuff[APR_CTIME_LEN];
        apr_ctime(ctimebuff, apr_time_now());
        fprintf(stderr, "[%s] [crit] (%d) %s: %s failed "
                        "to initial context, exiting\n", 
                        ctimebuff, stat, (*argv)[0], failed);
        apr_terminate();
        exit(1);
    }

    apr_pool_tag(cntx, "process");
    ap_open_stderr_log(cntx);

    /* Now we have initialized apr and our logger, no more
     * exceptional error reporting required for the lifetime
     * of this server process.
     */

    process = apr_palloc(cntx, sizeof(process_rec));
    process->pool = cntx;

    apr_pool_create(&process->pconf, process->pool);
    apr_pool_tag(process->pconf, "pconf");
    process->argc = *argc;
    process->argv = *argv;
    process->short_name = apr_filepath_name_get((*argv)[0]);
    return process;
}
Example #14
0
void logging_log(mm_logger* log,const char* a_format, ...) {
    va_list va;
    //int i=0;
    apr_time_t tnow;
    char tbuf[64];
    char buffer[BUFFERSIZE];
    memset(buffer, '\0', BUFFERSIZE);

    if(log->maxLogFileSizeMB>0) logging_rotateLogFile(log);

    va_start(va, a_format);
    vsnprintf(buffer, BUFFERSIZE-1, a_format, va);

    tnow=apr_time_now();
    memset(tbuf,'\0',64);
    apr_ctime(tbuf,tnow);
    apr_file_printf(log->file,"%s mm.monitor.refresh [%d] %s\r\n",tbuf,getpid(),buffer);
    va_end(va);
}
Example #15
0
void util_ldap_search_node_display(request_rec *r, util_ald_cache_t *cache, void *n)
{
    util_search_node_t *node = (util_search_node_t *)n;
    char date_str[APR_CTIME_LEN+1];
    char *buf;

    apr_ctime(date_str, node->lastbind);

    buf = apr_psprintf(r->pool, 
             "<tr valign='top'>"
             "<td nowrap>%s</td>"
             "<td nowrap>%s</td>"
             "<td nowrap>%s</td>"
             "<tr>",
         node->username,
         node->dn,
         date_str);

    ap_rputs(buf, r);
}
Example #16
0
	static char* cc_refreshConfigCore(pool* p,database_core* dbLogCore,config_core* conf){
		int i;
		service_module_template* serviceModule=NULL;
		cc_service_descriptor* svc=NULL;
		void* moduleConfig=NULL;
		char* error=NULL;
//		alerts_core* alertsCore=NULL;
//		diagnostics_core* diagCore=NULL;	
		
		char cbuf[APR_CTIME_LEN + 1];
		long timeTakenMillis;
		
		logcore_openLogFile(p,conf->refreshLogFile);
		logcore_truncateLogFile();
		
		apr_time_t t1 = apr_time_now();
		apr_ctime(cbuf, t1);
		logcore_printLog("\n°\t Refreshing config [%s]\n", cbuf); fflush(stdout);
		
		if(conf->services->nelts>0){
			shmdata_BeginTagging(conf->sheap);
						
			for(i=0;i<conf->services->nelts;i++){
				svc=(cc_service_descriptor*)getElement(conf->services,i);
				serviceModule=cc_findServiceTemplate(svc->id);
				if(serviceModule!=NULL){
					if(serviceModule->refresh_func!=NULL){
						error=(*serviceModule->refresh_func)(p,conf->sheap,conf->globals,svc,&moduleConfig);
						if(error!=NULL){
							dbcore_logError(p,dbLogCore,serviceModule->id,"REFRESH",error);
							logcore_closeLogFile();
							return apr_pstrcat(p,"[",serviceModule->id,"] Service failed to refresh: ",error,NULL);	
						}else{
							//set as initialized
							if(moduleConfig!=NULL){
								apr_hash_set(conf->service_id_configs,svc->id,APR_HASH_KEY_STRING,moduleConfig);
								
								if(svc->name!=NULL){
									apr_hash_set(conf->service_name_configs,svc->name,APR_HASH_KEY_STRING,moduleConfig);
								}
							}
						}
					}
				}else{
					logcore_closeLogFile();
					return apr_pstrcat(p,"Service: \"",svc->id,"\" not found",NULL); 	
				}
			}
			//publish bash segment
			if(error==NULL){
				shmdata_PublishBackSeg(conf->sheap);
				cc_syncSelf(p,conf);
			}
		}

		timeTakenMillis = ((apr_time_now() - t1) / 1000);
		logcore_printLog("\n°\t Refresh complete [time taken : %d milliseconds]\n", timeTakenMillis); fflush(stdout);
		logcore_closeLogFile();
		
		return error;	
	}
static int log_script(request_rec *r, cgi_server_conf * conf, int ret,
                      char *dbuf, const char *sbuf, apr_bucket_brigade *bb,
                      apr_file_t *script_err)
{
    const apr_array_header_t *hdrs_arr = apr_table_elts(r->headers_in);
    const apr_table_entry_t *hdrs = (const apr_table_entry_t *) hdrs_arr->elts;
    char argsbuffer[HUGE_STRING_LEN];
    apr_file_t *f = NULL;
    apr_bucket *e;
    const char *buf;
    apr_size_t len;
    apr_status_t rv;
    int first;
    int i;
    apr_finfo_t finfo;
    char time_str[APR_CTIME_LEN];

    /* XXX Very expensive mainline case! Open, then getfileinfo! */
    if (!conf->logname ||
        ((apr_stat(&finfo, conf->logname,
                   APR_FINFO_SIZE, r->pool) == APR_SUCCESS) &&
         (finfo.size > conf->logbytes)) ||
        (apr_file_open(&f, conf->logname,
                       APR_APPEND|APR_WRITE|APR_CREATE, APR_OS_DEFAULT,
                       r->pool) != APR_SUCCESS)) {
        /* Soak up script output */
        discard_script_output(bb);
        log_script_err(r, script_err);
        return ret;
    }

    /* "%% [Wed Jun 19 10:53:21 1996] GET /cgi-bin/printenv HTTP/1.0" */
    apr_ctime(time_str, apr_time_now());
    apr_file_printf(f, "%%%% [%s] %s %s%s%s %s\n", time_str, r->method, r->uri,
                    r->args ? "?" : "", r->args ? r->args : "", r->protocol);
    /* "%% 500 /usr/local/apache/cgi-bin" */
    apr_file_printf(f, "%%%% %d %s\n", ret, r->filename);

    apr_file_puts("%request\n", f);
    for (i = 0; i < hdrs_arr->nelts; ++i) {
        if (!hdrs[i].key)
            continue;
        apr_file_printf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val);
    }
    if ((r->method_number == M_POST || r->method_number == M_PUT) &&
        *dbuf) {
        apr_file_printf(f, "\n%s\n", dbuf);
    }

    apr_file_puts("%response\n", f);
    hdrs_arr = apr_table_elts(r->err_headers_out);
    hdrs = (const apr_table_entry_t *) hdrs_arr->elts;

    for (i = 0; i < hdrs_arr->nelts; ++i) {
        if (!hdrs[i].key)
            continue;
        apr_file_printf(f, "%s: %s\n", hdrs[i].key, hdrs[i].val);
    }

    if (sbuf && *sbuf)
        apr_file_printf(f, "%s\n", sbuf);

    first = 1;
    for (e = APR_BRIGADE_FIRST(bb);
         e != APR_BRIGADE_SENTINEL(bb);
         e = APR_BUCKET_NEXT(e))
    {
        if (APR_BUCKET_IS_EOS(e)) {
            break;
        }
        rv = apr_bucket_read(e, &buf, &len, APR_BLOCK_READ);
        if (rv != APR_SUCCESS || (len == 0)) {
            break;
        }
        if (first) {
            apr_file_puts("%stdout\n", f);
            first = 0;
        }
        apr_file_write(f, buf, &len);
        apr_file_puts("\n", f);
    }

    if (apr_file_gets(argsbuffer, HUGE_STRING_LEN, script_err) == APR_SUCCESS) {
        apr_file_puts("%stderr\n", f);
        apr_file_puts(argsbuffer, f);
        while (apr_file_gets(argsbuffer, HUGE_STRING_LEN,
                             script_err) == APR_SUCCESS) {
            apr_file_puts(argsbuffer, f);
        }
        apr_file_puts("\n", f);
    }

    apr_brigade_destroy(bb);
    apr_file_close(script_err);

    apr_file_close(f);
    return ret;
}
Example #18
0
void ls_format_entry(tbx_log_fd_t *ifd, ls_entry_t *lse)
{
    char *dtype;
    char *perms;
    char *owner;
    char dt_create[128], dt_modify[128];
    apr_time_t dt;
    int64_t n;
    long int fsize;
    int nlink;

//printf("lsfe: ftype=%d fname=%s\n", lse->ftype, lse->fname);

    if ((lse->ftype & OS_OBJECT_SYMLINK) > 0) {
        if ((lse->ftype & OS_OBJECT_BROKEN_LINK) > 0) {
            perms = "L---------";
        } else {
            perms = "l---------";
        }
    } else if ((lse->ftype & OS_OBJECT_DIR) > 0) {
        perms = "d---------";
    } else {
        perms = "----------";
    }

    dtype = ((lse->ftype & OS_OBJECT_DIR) > 0) ? "/" : "";

    owner = lse->vals[0];
    if (owner == NULL) owner = "root";

    n = 0;
    if (lse->vals[1] != NULL) sscanf(lse->vals[1], I64T, &n);
    fsize = n;

    memset(dt_create, '-', 24);
    dt_create[24] = 0;
    n = -1;
    if (lse->vals[3] != NULL) sscanf(lse->vals[3], I64T, &n);
    if (n>0) {
        n = apr_time_from_sec(n);
        apr_ctime(dt_create, n);
    }

    memcpy(dt_modify, dt_create, 25);
    n = -1;
    if (lse->vals[2] != NULL) sscanf(lse->vals[2], I64T, &n);
    if (n > 0) {
        dt = apr_time_from_sec(n);
        apr_ctime(dt_modify, dt);
    }

    nlink = 1;
    if (lse->vals[4] != NULL) sscanf(lse->vals[4], "%d", &nlink);

    if (lse->link == NULL) {
        info_printf(ifd, 0, "%s  %3d  %10s  %10ld  %s  %s  %s%s\n", perms, nlink, owner, fsize, dt_create, dt_modify, lse->fname, dtype);
    } else {
        info_printf(ifd, 0, "%s  %3d  %10s  %10ld  %s  %s  %s%s -> %s\n", perms, nlink, owner, fsize, dt_create, dt_modify, lse->fname, dtype, lse->link);
    }

    return;
}