#include <string.h>
#include <assert.h>
#include <signal.h>
+#include <fcntl.h>
+#include <netdb.h>
+#include <syscall.h>
+#include <sys/utsname.h>
#include <sys/types.h>
#include <sys/queue.h>
return str;
}
-void init_current(char *comm)
+/*
+ * random number generator stuff
+ */
+static int _rand_dev_fd = -1;
+
+static int get_ipv4_addr()
+{
+ struct utsname myname;
+ struct hostent *hptr;
+ int ip;
+
+ if (uname(&myname) < 0)
+ return 0;
+
+ hptr = gethostbyname(myname.nodename);
+ if (hptr == NULL ||
+ hptr->h_addrtype != AF_INET ||
+ *hptr->h_addr_list == NULL) {
+ printf("LibLustre: Warning: fail to get local IPv4 address\n");
+ return 0;
+ }
+
+ ip = ntohl(*((int *) *hptr->h_addr_list));
+
+ return ip;
+}
+
+static void init_random()
+{
+ int seed;
+ struct timeval tv;
+
+ _rand_dev_fd = syscall(SYS_open, "/dev/urandom", O_RDONLY);
+ if (_rand_dev_fd >= 0) {
+ if (syscall(SYS_read, _rand_dev_fd, &seed, sizeof(int)) ==
+ sizeof(int)) {
+ srand(seed);
+ return;
+ }
+ syscall(SYS_close, _rand_dev_fd);
+ _rand_dev_fd = -1;
+ }
+
+ gettimeofday(&tv, NULL);
+ srand(tv.tv_sec + tv.tv_usec + getpid() + __swab32(get_ipv4_addr()));
+}
+
+void get_random_bytes(void *buf, int size)
+{
+ char *p = buf;
+
+ if (size < 1)
+ return;
+
+ if (_rand_dev_fd >= 0) {
+ if (syscall(SYS_read, _rand_dev_fd, buf, size) == size)
+ return;
+ syscall(SYS_close, _rand_dev_fd);
+ _rand_dev_fd = -1;
+ }
+
+ while (size--)
+ *p++ = rand();
+}
+
+int in_group_p(gid_t gid)
+{
+ int i;
+
+ if (gid == current->fsgid)
+ return 1;
+
+ for (i = 0; i < current->ngroups; i++) {
+ if (gid == current->groups[i])
+ return 1;
+ }
+
+ return 0;
+}
+
+static void init_capability(int *res)
+{
+ cap_t syscap;
+ cap_flag_value_t capval;
+ int i;
+
+ *res = 0;
+
+ syscap = cap_get_proc();
+ if (!syscap) {
+ printf("Liblustre: Warning: failed to get system capability, "
+ "set to minimal\n");
+ return;
+ }
+
+ for (i = 0; i < sizeof(cap_value_t) * 8; i++) {
+ if (!cap_get_flag(syscap, i, CAP_EFFECTIVE, &capval)) {
+ if (capval == CAP_SET) {
+ *res |= 1 << i;
+ }
+ }
+ }
+}
+
+static int init_current(char *comm)
{
current = malloc(sizeof(*current));
- current->fs = malloc(sizeof(*current->fs));
+ if (!current) {
+ CERROR("Not enough memory\n");
+ return -ENOMEM;
+ }
+ current->fs = ¤t->__fs;
current->fs->umask = umask(0777);
umask(current->fs->umask);
+
strncpy(current->comm, comm, sizeof(current->comm));
current->pid = getpid();
- current->fsuid = 0;
- current->fsgid = 0;
- current->cap_effective = -1;
+ current->fsuid = geteuid();
+ current->fsgid = getegid();
memset(¤t->pending, 0, sizeof(current->pending));
+
+ current->max_groups = sysconf(_SC_NGROUPS_MAX);
+ current->groups = malloc(sizeof(gid_t) * current->max_groups);
+ if (!current->groups) {
+ CERROR("Not enough memory\n");
+ return -ENOMEM;
+ }
+ current->ngroups = getgroups(current->max_groups, current->groups);
+ if (current->ngroups < 0) {
+ perror("Error getgroups");
+ return -EINVAL;
+ }
+
+ init_capability(¤t->cap_effective);
+
+ return 0;
}
-/* FIXME */
void generate_random_uuid(unsigned char uuid_out[16])
{
- int *arr = (int*)uuid_out;
- int i;
-
- for (i = 0; i < sizeof(uuid_out)/sizeof(int); i++)
- arr[i] = rand();
+ get_random_bytes(uuid_out, sizeof(uuid_out));
}
ptl_nid_t tcpnal_mynid;
int lllib_init(char *dumpfile)
{
+ pid_t pid;
+ uint32_t ip;
+ struct in_addr in;
+
if (!g_zconf) {
/* this parse only get my nid from config file
* before initialize portals
if (parse_dump(dumpfile, lib_ioctl_nalcmd))
return -1;
} else {
- /* XXX need setup mynid before tcpnal initialize */
- tcpnal_mynid = ((uint64_t)getpid() << 32) | time(0);
- printf("LibLustre: TCPNAL NID: %016llx\n", tcpnal_mynid);
+ /* need to setup mynid before tcpnal initialization */
+ /* a meaningful nid could help debugging */
+ ip = get_ipv4_addr();
+ if (ip == 0)
+ get_random_bytes(&ip, sizeof(ip));
+ pid = getpid() & 0xffffffff;
+ tcpnal_mynid = ((uint64_t)ip << 32) | pid;
+
+ in.s_addr = htonl(ip);
+ printf("LibLustre: TCPNAL NID: %016llx (%s:%u)\n",
+ tcpnal_mynid, inet_ntoa(in), pid);
}
- init_current("dummy");
- if (init_obdclass() ||
+ if (init_current("dummy") ||
+ init_obdclass() ||
init_lib_portals() ||
ptlrpc_init() ||
mdc_init() ||
RETURN(rc);
}
-static void sighandler_USR1(int signum)
-{
- /* do nothing */
-}
-
/* parse host:/mdsname/profile string */
int ll_parse_mount_target(const char *target, char **mdsnid,
char **mdsname, char **profile)
char *lustre_driver = "llite";
char *root_path = "/";
unsigned mntflgs = 0;
-
int err;
- /* consider tha case of starting multiple liblustre instances
- * at a same time on single node.
- */
- srand(time(NULL) + getpid());
-
- signal(SIGUSR1, sighandler_USR1);
-
lustre_path = getenv(ENV_LUSTRE_MNTPNT);
if (!lustre_path) {
lustre_path = "/mnt/lustre";
portal_debug = 0;
portal_subsystem_debug = 0;
#endif
+ init_random();
+
err = lllib_init(dumpfile);
if (err) {
perror("init llite driver");