2

What is the formula used to produce a key that ftok() produces? ftok is a Linux function for creating keys for SYSTEM V IPC.

melpomene
  • 84,125
  • 8
  • 85
  • 148
test
  • 21
  • 1
  • 4
  • 1
    Read ftok manual page. – IMParasharG Feb 02 '19 at 11:58
  • 3
    1. Wouldn't that depend on which libc you're using? 2. Why do you care? – melpomene Feb 02 '19 at 12:00
  • On Linux, most implementations of `libc` are free software. So study the source code of the particular `libc` you are using, probably [glibc](https://www.gnu.org/software/libc/) ore perhaps [musl-libc](http://musl-libc.org/) – Basile Starynkevitch Feb 02 '19 at 12:02
  • 1
    `ftok()` is not Linux-specific. It is a standard part of the SysV IPC suite. – John Bollinger Feb 02 '19 at 13:24
  • *ftok is a Linux function for creating keys for SYSTEM V IPC.* And a horrible one at that. Picking a random number and hoping it's unique, with no information on already-used keys on the system, is worse than picking a random number yourself. At least you can actually collect information on what keys are already in use. – Andrew Henle Feb 02 '19 at 15:22

2 Answers2

5

In ftok from glibc 2.29:

key_t
ftok (const char *pathname, int proj_id)
{
  struct stat64 st;
  key_t key;

  if (__xstat64 (_STAT_VER, pathname, &st) < 0)
    return (key_t) -1;

  key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)
     | ((proj_id & 0xff) << 24));

  return key;
}

I.e. it's creating a 32-bit key_t by taking the upper 8 bits from the lower 8 bits of proj_id, the second upper 8 bits from the lower 8 bits of the device number of the provided pathname, and the lower 16 bits from the lower 16 bits of the inode number of the provided pathname.

musl libc uses the same algorithm:

key_t ftok(const char *path, int id)
{
    struct stat st;
    if (stat(path, &st) < 0) return -1;

    return ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16) | ((id & 0xffu) << 24));
}
melpomene
  • 84,125
  • 8
  • 85
  • 148
0

The ftok() source code in glibc library is :

#include <sys/ipc.h>
#include <sys/stat.h>
key_t
ftok (const char *pathname, int proj_id)
{
  struct stat64 st;
  key_t key;
  if (__xstat64 (_STAT_VER, pathname, &st) < 0)
    return (key_t) -1;
  key = ((st.st_ino & 0xffff) | ((st.st_dev & 0xff) << 16)
         | ((proj_id & 0xff) << 24));
  return key;
}

Other functions are available here too.

moinmaroofi
  • 359
  • 1
  • 12