That seems to be fundamentally impossible on posix using only syscalls, but
you may be able to use /proc:
https://manpages.debian.org/stretch/manpages-dev/umask.2.en.html#NOTES


On Tue, Nov 6, 2018 at 4:35 PM Tom Payne <twpa...@gmail.com> wrote:

> Hi,
>
> The user's umask can be set with the umask(2) system call, this sets the
> new umask and returns the old one. As far as I can tell, the canonical way
> to get the user's current umask is to call umask twice: once to get the old
> value and set a temporary one, then a second call to restore the old value:
>
> func getUmask() int {
> umask := syscall.Umask(0)
> syscall.Umask(umask)
> return umask
> }
>
> This has an obvious race condition: if some file operations (e.g. mkdir or
> open) occur between the two calls to syscall.Umask then they will use the
> unwanted temporary umask value.
>
> How can I avoid this race condition?
>
> One heavyweight possibility is to read the umask during the main package's
> init, including a call to runtime.LockOSThread(). However, I'd like to be
> able to call my getUmask() function at any time.
>
> Many thanks for any pointers,
> Tom
>
> --
> You received this message because you are subscribed to the Google Groups
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to golang-nuts+unsubscr...@googlegroups.com.
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to