BBS:      TELESC.NET.BR
Assunto:  src/sbbs3/scfglib1.c
De:       Rob Swindell (on Windows 11)
Data:     Sat, 2 May 2026 16:42:49 -0700
-----------------------------------------------------------
https://gitlab.synchro.net/main/sbbs/-/commit/cbcb74574ca2a92b1e99def4
Modified Files:
	src/sbbs3/scfglib1.c
Log Message:
sbbs3 make_data_dirs(): faster startup directory verification

On systems with many file directories (Vertrauen has thousands), the
"Verifying/creating data directories" startup phase took ~8 seconds
because each entry triggered serial stat()/mkdir() syscalls.

Three changes drop that to ~2 seconds (4x speedup):

1. Dedup. Most cfg->dir[i]->data_dir values default to dirs
   (load_cfg.c:308), which make_data_dirs() already creates near the
   top of the function. Seed a str_list with that path and skip
   md_fast() in the per-dir loop when the value matches. The seed is
   only pushed on successful creation  failure causes the loop to
   retry per entry rather than skip silently.

2. mkdir-first via a new file-static md_fast(). md() does
   isdir()+stat() before mkpath, which on Windows fetches file
   attributes and trips Defender's "file opened" introspection.
   md_fast() issues a single MKDIR() and trusts EEXIST without
   re-stat'ing, falling back to md() only when the parent component
   is missing or an unexpected errno surfaces. The tradeoff is that
   a non-directory file at one of these paths won't be diagnosed at
   startup; the BBS reports it later when something tries to open
   files inside it. Public md() is unchanged so other callers keep
   their stricter contract.

3. trim_trailing_slash() helper shared between md_fast() and the
   loop's cache-key computation, so the canonicalization lives in
   one place.

Co-Authored-By: Claude Opus 4.7 (1M context) 
n
---
  mSynchronetn  hgVertrauen n hHome of Synchronet n gh[vert/cvs/bbs].synchro.net

-----------------------------------------------------------
[Voltar]