Comment by mgerdts
2 days ago
What is up with fin? Is it really just writing an int 0 in the memory right after some variable present in libc or similar?
extern fin;
if(getpw(0, pwbuf))
goto badpw;
(&fin)[1] = 0;
Predecessor of
I’m guessing v4 C didn’t have structs yet (v6 C does, but struct members are actually in the global namespace and are basically just sugar for offset and a type cast; member access even worked on literals. That’s why structs from early unix APIs have prefixed member names, like st_mode.
> I’m guessing v4 C didn’t have structs yet
There may have been a early C without structs (B had none,) but according to Ken Thompson, the addition of structs to C was an important change, and a reason why his third attempt rewrite UNIX from assembly to a portable language finally succeeded. Certainly by the time the recently recovered v4 tape was made, C had structs:
)
Heh. I had the same impulse but then didn't do it, upon refreshing the page your comment was there :)
According to the chatbot, the first word of `fin` is the file descriptor, the second its state. "Reset stdin’s flags to a clean state".