Home | History | Annotate | Download | only in lib
      1 /*
      2  *
      3  *   Copyright (c) International Business Machines  Corp., 2001
      4  *
      5  *   This program is free software;  you can redistribute it and/or modify
      6  *   it under the terms of the GNU General Public License as published by
      7  *   the Free Software Foundation; either version 2 of the License, or
      8  *   (at your option) any later version.
      9  *
     10  *   This program is distributed in the hope that it will be useful,
     11  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
     12  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
     13  *   the GNU General Public License for more details.
     14  *
     15  *   You should have received a copy of the GNU General Public License
     16  *   along with this program;  if not, write to the Free Software
     17  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     18  */
     19 
     20 /*
     21  * NAME
     22  *	hugetlb.c
     23  *
     24  * DESCRIPTION
     25  *	common routines for the hugepage tests.
     26  *
     27  *	The library contains the following routines:
     28  *
     29  *	getipckey()
     30  *	getuserid()
     31  *	rm_shm()
     32  */
     33 
     34 #define TST_NO_DEFAULT_MAIN
     35 #include <sys/types.h>
     36 #include <sys/ipc.h>
     37 #include <sys/shm.h>
     38 #include <sys/timeb.h>
     39 #include <pwd.h>
     40 #include "hugetlb.h"
     41 
     42 static long orig_hugepages = -1;
     43 
     44 long save_nr_hugepages(void)
     45 {
     46 	check_hugepage();
     47 
     48 	orig_hugepages = get_sys_tune("nr_hugepages");
     49 
     50 	return orig_hugepages;
     51 }
     52 
     53 void restore_nr_hugepages(void)
     54 {
     55 	if (orig_hugepages != -1)
     56 		set_sys_tune("nr_hugepages", orig_hugepages, 0);
     57 }
     58 
     59 /*
     60  * getipckey() - generates and returns a message key used by the "get"
     61  *		 calls to create an IPC resource.
     62  */
     63 int getipckey(void)
     64 {
     65 	const char a = 'a';
     66 	int ascii_a = (int)a;
     67 	char *curdir = NULL;
     68 	size_t size = 0;
     69 	key_t ipc_key;
     70 	struct timeb time_info;
     71 
     72 	curdir = getcwd(curdir, size);
     73 	if (curdir == NULL)
     74 		tst_brk(TBROK | TERRNO, "getcwd(curdir)");
     75 
     76 	/*
     77 	 * Get a Sys V IPC key
     78 	 *
     79 	 * ftok() requires a character as a second argument.  This is
     80 	 * refered to as a "project identifier" in the man page.  In
     81 	 * order to maximize the chance of getting a unique key, the
     82 	 * project identifier is a "random character" produced by
     83 	 * generating a random number between 0 and 25 and then adding
     84 	 * that to the ascii value of 'a'.  The "seed" for the random
     85 	 * number is the millisecond value that is set in the timeb
     86 	 * structure after calling ftime().
     87 	 */
     88 	ftime(&time_info);
     89 	srandom((unsigned int)time_info.millitm);
     90 
     91 	ipc_key = ftok(curdir, ascii_a + random() % 26);
     92 	if (ipc_key == -1)
     93 		tst_brk(TBROK | TERRNO, __func__);
     94 
     95 	return ipc_key;
     96 }
     97 
     98 /*
     99  * getuserid() - return the integer value for the "user" id
    100  */
    101 int getuserid(char *user)
    102 {
    103 	struct passwd *ent;
    104 
    105 	ent = getpwnam(user);
    106 	if (ent == NULL)
    107 		tst_brk(TBROK | TERRNO, "getpwnam");
    108 
    109 	return ent->pw_uid;
    110 }
    111 
    112 /*
    113  * rm_shm() - removes a shared memory segment.
    114  */
    115 void rm_shm(int shm_id)
    116 {
    117 	if (shm_id == -1)
    118 		return;
    119 
    120 	/*
    121 	 * check for # of attaches ?
    122 	 */
    123 	if (shmctl(shm_id, IPC_RMID, NULL) == -1) {
    124 		tst_res(TINFO, "WARNING: shared memory deletion failed.");
    125 		tst_res(TINFO, "This could lead to IPC resource problems.");
    126 		tst_res(TINFO, "id = %d", shm_id);
    127 	}
    128 }
    129