Skip to content

Instantly share code, notes, and snippets.

@Tatsh
Last active December 15, 2015 13:48
Show Gist options
  • Save Tatsh/5269473 to your computer and use it in GitHub Desktop.
Save Tatsh/5269473 to your computer and use it in GitHub Desktop.
Just messing around
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *get_perm_string(unsigned int perm) {
unsigned int perms_str_size = 17 + 1;
char *perms = malloc(perms_str_size);
unsigned int *flags = malloc(sizeof(int) * 6);
unsigned int shift, offset, i, f, letter, new_size, j;
char *ret;
perm &= 07777;
if ((perm & 0777) == 0777) {
ret = malloc(5 + 2 + 1);
sprintf(ret, "u+%s,g+%s,a+%s", "rwx", "rwx", "rwx");
return ret;
}
memset(perms, 0, perms_str_size);
perms[0] = 'u';
perms[1] = '+';
perms[5] = ',';
perms[6] = 'g';
perms[7] = '+';
perms[11] = ',';
perms[12] = 'o';
perms[13] = '+';
for (shift = 00; shift < 011; shift += 03) {
flags[0] = 0400 >> shift;
flags[1] = 'r';
flags[2] = 0200 >> shift;
flags[3] = 'w';
flags[4] = 0100 >> shift;
flags[5] = 'x';
for (i = 0; i < 6; i += 2) {
offset = (shift / 3) + (2 + (i/2)) + (5 * (shift / 3));
f = flags[i];
letter = flags[i + 1];
if (perm & f) {
perms[offset] = letter;
}
}
}
for (new_size = 0, i = 0; i < perms_str_size; i++) {
if (perms[i] != 0) {
new_size++;
}
}
ret = malloc(new_size);
memset(ret, 0, new_size);
for (i = 0, j = 0; i < perms_str_size; i++) {
if (perms[i] != 0) {
ret[j] = perms[i];
j++;
}
}
ret[j] = '\0';
free(perms);
free(flags);
return ret;
}
@Tatsh
Copy link
Author

Tatsh commented Mar 31, 2013

def get_perm_string(perm)
  perm &= 07777

  return ('u+%s,g+%s,r+%s' % ['rwx', 'rwx', 'rwx']) if (perm & 0777) == 0777

  perms = ['u+', 'g+', 'o+']

  [00, 03, 06].collect! do |shift|
    flags = {
      0400 >> shift => 'r',
      0200 >> shift => 'w',
      0100 >> shift => 'x',
    }
    offset = shift / 3

    flags.collect do |f, letter|
      perms[offset] << letter if (perm & f) == f
    end

    perms.delete_at offset if perms[offset].length == 2
  end

  return perms.join(',')
end

puts get_perm_string(010777)
puts get_perm_string(010755)
puts get_perm_string(010644)
puts get_perm_string(010640)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment