(map_syscall_name_to_number): new function for finding the number
of a syscall given the name on solaris (k_hasafs): try using map_syscall_name_to_number git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5066 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
@@ -90,6 +90,40 @@ try_aix(void)
|
|||||||
}
|
}
|
||||||
#endif /* _AIX */
|
#endif /* _AIX */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This probably only works under Solaris and could get confused if
|
||||||
|
* there's a /etc/name_to_sysnum file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _PATH_ETC_NAME_TO_SYSNUM "/etc/name_to_sysnum"
|
||||||
|
|
||||||
|
static int
|
||||||
|
map_syscall_name_to_number (const char *str, int *res)
|
||||||
|
{
|
||||||
|
FILE *f;
|
||||||
|
char buf[256];
|
||||||
|
size_t str_len = strlen (str);
|
||||||
|
|
||||||
|
f = fopen (_PATH_ETC_NAME_TO_SYSNUM, "r");
|
||||||
|
if (f == NULL)
|
||||||
|
return -1;
|
||||||
|
while (fgets (buf, sizeof(buf), f) != NULL) {
|
||||||
|
if (strncmp (str, buf, str_len) == 0) {
|
||||||
|
char *begptr = buf + str_len;
|
||||||
|
char *endptr;
|
||||||
|
long val = strtol (begptr, &endptr, 0);
|
||||||
|
|
||||||
|
if (val != 0 && endptr != begptr) {
|
||||||
|
fclose (f);
|
||||||
|
*res = val;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose (f);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#define NO_ENTRY_POINT 0
|
#define NO_ENTRY_POINT 0
|
||||||
#define SINGLE_ENTRY_POINT 1
|
#define SINGLE_ENTRY_POINT 1
|
||||||
#define MULTIPLE_ENTRY_POINT 2
|
#define MULTIPLE_ENTRY_POINT 2
|
||||||
@@ -252,7 +286,8 @@ k_hasafs(void)
|
|||||||
char *env = getenv ("AFS_SYSCALL");
|
char *env = getenv ("AFS_SYSCALL");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Already checked presence of AFS syscalls? */
|
* Already checked presence of AFS syscalls?
|
||||||
|
*/
|
||||||
if (afs_entry_point != UNKNOWN_ENTRY_POINT)
|
if (afs_entry_point != UNKNOWN_ENTRY_POINT)
|
||||||
return afs_entry_point != NO_ENTRY_POINT;
|
return afs_entry_point != NO_ENTRY_POINT;
|
||||||
|
|
||||||
@@ -273,9 +308,29 @@ k_hasafs(void)
|
|||||||
{
|
{
|
||||||
int tmp;
|
int tmp;
|
||||||
|
|
||||||
if (env != NULL && sscanf (env, "%d", &tmp) == 1)
|
if (env != NULL) {
|
||||||
if (try_one (tmp) == 0)
|
if (sscanf (env, "%d", &tmp) == 1) {
|
||||||
goto done;
|
if (try_one (tmp) == 0)
|
||||||
|
goto done;
|
||||||
|
} else {
|
||||||
|
char *end = NULL;
|
||||||
|
char *p;
|
||||||
|
char *s = strdup (env);
|
||||||
|
|
||||||
|
if (s != NULL) {
|
||||||
|
for (p = strtok_r (s, ",", &end);
|
||||||
|
p != NULL;
|
||||||
|
p = strtok_r (NULL, ",", &end)) {
|
||||||
|
if (map_syscall_name_to_number (p, &tmp) == 0)
|
||||||
|
if (try_one (tmp) == 0) {
|
||||||
|
free (s);
|
||||||
|
goto done;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free (s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif /* AFS_SYSCALL || AFS_SYSCALL2 || AFS_SYSCALL3 */
|
#endif /* AFS_SYSCALL || AFS_SYSCALL2 || AFS_SYSCALL3 */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user