Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | /* compat.c: 32-bit compatibility syscall for 64-bit systems |
| 2 | * |
David Howells | 3e30148 | 2005-06-23 22:00:56 -0700 | [diff] [blame] | 3 | * Copyright (C) 2004-5 Red Hat, Inc. All Rights Reserved. |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 4 | * Written by David Howells (dhowells@redhat.com) |
| 5 | * |
| 6 | * This program is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU General Public License |
| 8 | * as published by the Free Software Foundation; either version |
| 9 | * 2 of the License, or (at your option) any later version. |
| 10 | */ |
| 11 | |
| 12 | #include <linux/sched.h> |
| 13 | #include <linux/syscalls.h> |
| 14 | #include <linux/keyctl.h> |
| 15 | #include <linux/compat.h> |
| 16 | #include "internal.h" |
| 17 | |
| 18 | /*****************************************************************************/ |
| 19 | /* |
| 20 | * the key control system call, 32-bit compatibility version for 64-bit archs |
| 21 | * - this should only be called if the 64-bit arch uses weird pointers in |
| 22 | * 32-bit mode or doesn't guarantee that the top 32-bits of the argument |
| 23 | * registers on taking a 32-bit syscall are zero |
| 24 | * - if you can, you should call sys_keyctl directly |
| 25 | */ |
| 26 | asmlinkage long compat_sys_keyctl(u32 option, |
David Howells | 3e30148 | 2005-06-23 22:00:56 -0700 | [diff] [blame] | 27 | u32 arg2, u32 arg3, u32 arg4, u32 arg5) |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 28 | { |
| 29 | switch (option) { |
| 30 | case KEYCTL_GET_KEYRING_ID: |
| 31 | return keyctl_get_keyring_ID(arg2, arg3); |
| 32 | |
| 33 | case KEYCTL_JOIN_SESSION_KEYRING: |
| 34 | return keyctl_join_session_keyring(compat_ptr(arg2)); |
| 35 | |
| 36 | case KEYCTL_UPDATE: |
| 37 | return keyctl_update_key(arg2, compat_ptr(arg3), arg4); |
| 38 | |
| 39 | case KEYCTL_REVOKE: |
| 40 | return keyctl_revoke_key(arg2); |
| 41 | |
| 42 | case KEYCTL_DESCRIBE: |
| 43 | return keyctl_describe_key(arg2, compat_ptr(arg3), arg4); |
| 44 | |
| 45 | case KEYCTL_CLEAR: |
| 46 | return keyctl_keyring_clear(arg2); |
| 47 | |
| 48 | case KEYCTL_LINK: |
| 49 | return keyctl_keyring_link(arg2, arg3); |
| 50 | |
| 51 | case KEYCTL_UNLINK: |
| 52 | return keyctl_keyring_unlink(arg2, arg3); |
| 53 | |
| 54 | case KEYCTL_SEARCH: |
| 55 | return keyctl_keyring_search(arg2, compat_ptr(arg3), |
| 56 | compat_ptr(arg4), arg5); |
| 57 | |
| 58 | case KEYCTL_READ: |
| 59 | return keyctl_read_key(arg2, compat_ptr(arg3), arg4); |
| 60 | |
| 61 | case KEYCTL_CHOWN: |
| 62 | return keyctl_chown_key(arg2, arg3, arg4); |
| 63 | |
| 64 | case KEYCTL_SETPERM: |
| 65 | return keyctl_setperm_key(arg2, arg3); |
| 66 | |
| 67 | case KEYCTL_INSTANTIATE: |
| 68 | return keyctl_instantiate_key(arg2, compat_ptr(arg3), arg4, |
| 69 | arg5); |
| 70 | |
| 71 | case KEYCTL_NEGATE: |
| 72 | return keyctl_negate_key(arg2, arg3, arg4); |
| 73 | |
David Howells | 3e30148 | 2005-06-23 22:00:56 -0700 | [diff] [blame] | 74 | case KEYCTL_SET_REQKEY_KEYRING: |
| 75 | return keyctl_set_reqkey_keyring(arg2); |
| 76 | |
David Howells | 017679c | 2006-01-08 01:02:43 -0800 | [diff] [blame] | 77 | case KEYCTL_SET_TIMEOUT: |
| 78 | return keyctl_set_timeout(arg2, arg3); |
| 79 | |
David Howells | b5f545c | 2006-01-08 01:02:47 -0800 | [diff] [blame] | 80 | case KEYCTL_ASSUME_AUTHORITY: |
| 81 | return keyctl_assume_authority(arg2); |
| 82 | |
Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 83 | default: |
| 84 | return -EOPNOTSUPP; |
| 85 | } |
| 86 | |
| 87 | } /* end compat_sys_keyctl() */ |