Search code examples
clinuxfilesystemsbsdsystems-programming

Choose BSD or sys5 style when creating file in linux


When I create file in linux default group owner becomes gid of process which creates file. If I add SGID to parent directory file will inherit parent directory owner group. Also I can change fs mount options to behave either like sys5 or like BSD.

What if I want to choose this option regardless directory permissions and fs mount options? Is there c function option or syscall parameter which allows you to choose group owner?

$ find . -ls
   262    4 drwxrwxr-x   4 devops   devops       4096 Apr 24 18:01 .    
   999    4 drwxrwxr-x   2 devops   root         4096 Apr 24 18:03 ./dir1
  6093    4 drwxrwsr-x   2 devops   root         4096 Apr 24 18:03 ./dir2
$ touch dir1/file dir2/file
$ find . -ls
   262    4 drwxrwxr-x   4 devops   devops       4096 Apr 24 18:01 .
   999    4 drwxrwxr-x   2 devops   root         4096 Apr 24 18:04 ./dir1
  5576    0 -rw-rw-r--   1 devops   devops          0 Apr 24 18:04 ./dir1/file
  6093    4 drwxrwsr-x   2 devops   root         4096 Apr 24 18:04 ./dir2
  6094    0 -rw-rw-r--   1 devops   root            0 Apr 24 18:04 ./dir2/file
$ 

And I wish to have something like that:

$ mytouch -s BSD  dir1/file1
$ mytouch -s sys5 dir1/file2
$ find dir1 -ls
   999    4 drwxrwxr-x   2 devops   root         4096 Apr 24 18:10 dir1
  6213    0 -rw-rw-r--   1 devops   root            0 Apr 24 18:10 dir1/file1
  6214    0 -rw-rw-r--   1 devops   devops          0 Apr 24 18:10 dir1/file2
$ 

Solution

  • Chances are, you can't.

    The implementation of sticky bits exists entirely within the kernel, and there are no options to open() or creat() which control how it operates.

    Your program could conceivably call chown() to manually reset the group of the file after creating it. However, this would only work reliably if your process is running as root, or as a member of the group that owns the parent directory.