// SPDX-ライセンス-識別子:GPL-2.0-のみ / * *著作権(C)2007 * *著者:エリックBiederman <[email protected]> * / の#include <linuxの/ module.h> の#include <linuxの/ ipc.h> の#include <linuxの/ nsproxy.h> の#include <linuxの/ sysctl.h> の#include <linuxの/ uaccess.h> の#include <linuxの/ ipc_namespace.h> の#include <linuxの/ msg.h> # "util.h"含む 静的ボイド* get_ipc(構造体ctl_table *テーブル) { CHAR * =卓上>データを、 構造体ipc_namespace * ipc_ns =の電流> nsproxy-> ipc_ns。 これ=(どの- (CHAR *)&init_ipc_ns)+(CHAR *)ipc_ns。 これを返します。 静的INT proc_ipc_dointvec(構造体ctl_table *テーブル、INT書き込み、 ボイド__user *バッファ、size_tの* lenp、loff_t *するPPO) { 構造体ctl_table ipc_table。 memcpy(&ipc_table、テーブル、はsizeof(ipc_table))。 ipc_table.data = get_ipc(表)。 戻りproc_dointvec(&ipc_table、書き込み、バッファ、lenp、するPPO)。 } 静的INT proc_ipc_dointvec_minmax(構造体ctl_table *テーブル、INT書き込み、 ボイド__user *バッファ、size_tの* lenp、loff_t *するPPO) { 構造体ctl_table ipc_table。 memcpy(&ipc_table、テーブル、はsizeof(ipc_table))。 ipc_table.data = get_ipc(表)。 戻りproc_dointvec_minmax(&ipc_table、書き込み、バッファ、lenp、するPPO)。 } 静的INT proc_ipc_dointvec_minmax_orphans(構造体ctl_table *テーブル、INT書き込み、 ボイド__user *バッファ、size_tの* lenp、loff_t *するPPO) { 構造体ipc_namespace * NS =電流- > nsproxy-> ipc_ns。 INT ERR = proc_ipc_dointvec_minmax(テーブル、書き込み、バッファ、lenp、するPPO)。 (ERR <0)であれば 、戻りERR。 もし(NS-> shm_rmid_forced) shm_destroy_orphaned(NS); ERRを返します。 } 静的INT proc_ipc_doulongvec_minmax(構造体ctl_table *テーブル、INT書き込み、 ボイド__user *バッファ、size_tの* lenp、loff_t *するPPO) { 構造体ctl_table ipc_table。 memcpy(&ipc_table、テーブル、はsizeof(ipc_table))。 ipc_table.data = get_ipc(表)。 戻りproc_doulongvec_minmax(&ipc_table、書き込み、バッファ、 lenp、するPPO)。 } 静的INT proc_ipc_auto_msgmni(構造体ctl_table *テーブル、INT書き込み、 ボイド__user *バッファ、size_tの* lenp、loff_t *するPPO) { 構造体ctl_table ipc_table。 int型ダミー= 0; memcpy(&ipc_table、テーブル、はsizeof(ipc_table))。 ipc_table.data =&ダミー。 (書き込み)の場合 pr_info_once(「auto_msgmniへの書き込みは効果がありません」); 戻りproc_dointvec_minmax(&ipc_table、書き込み、バッファ、lenp、するPPO)。 } 静的INT proc_ipc_sem_dointvec(構造体ctl_table *テーブル、INT書き込み、 ボイド__user *バッファ、size_tの* lenp、loff_t *するPPO) { int型RET、SEMMNI。 構造体ipc_namespace * NS =の電流> nsproxy-> ipc_ns。 SEMMNI = NS-> sem_ctls [3]。 RET = proc_ipc_dointvec(テーブル、書き込み、バッファ、lenp、するPPO)。 もし(RET!) RET = sem_check_semmni(電流- > nsproxy-> ipc_ns); / * *エラーが発生した場合はSEMMNI値をリセットします。 * / IF(RET) NS-> sem_ctls [3] = SEMMNI。 RETを返します。 } の#else の#define proc_ipc_doulongvec_minmax NULL の#define proc_ipc_dointvec NULL の#define proc_ipc_dointvec_minmax NULL の#define proc_ipc_dointvec_minmax_orphans NULL の#define proc_ipc_auto_msgmni NULL の#define proc_ipc_sem_dointvec NULL #endifの INT ipc_mni = IPCMNI。 int型ipc_mni_shift = IPCMNI_SHIFT。 int型ipc_min_cycle = RADIX_TREE_MAP_SIZE。 静的構造体ctl_table ipc_kern_table [] = { { .procname = "SHMMAX"、 .DATA =&init_ipc_ns.shm_ctlmax、 .maxlen =はsizeof(init_ipc_ns.shm_ctlmax)、 .mode = 0644、 .proc_handler = proc_ipc_doulongvec_minmax、 }、 { .procname = " SHMALL」、 .DATA =&init_ipc_ns.shm_ctlall、 .maxlen =はsizeof(init_ipc_ns.shm_ctlall)、 .mode = 0644、 .proc_handler = proc_ipc_doulongvec_minmax、 }、 { .procname = "SHMMNI"、 .DATA =&init_ipc_ns.shm_ctlmni、 .maxlen = sizeof(init_ipc_ns.shm_ctlmni)、 .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax、 .extra1 = SYSCTL_ZERO、 .extra2 =&ipc_mni、 }、 { .procname = "shm_rmid_forced"、 .DATA =&init_ipc_ns.shm_rmid_forced、 .maxlen =はsizeof(init_ipc_ns.shm_rmid_forced)、 .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax_orphans、 .extra1 = SYSCTL_ZERO、 .extra2 = SYSCTL_ONE、 }、 { .procname = "MSGMAX"、 .DATA =&init_ipc_ns.msg_ctlmax、 .maxlen =はsizeof(init_ipc_ns.msg_ctlmax)、 .mode = 0644、 。proc_handler = proc_ipc_dointvec_minmax、 .extra1 = SYSCTL_ZERO、 .extra2 = SYSCTL_INT_MAX、 }、 { .procname = "MSGMNI"、 .DATA =&init_ipc_ns.msg_ctlmni、 .maxlen =はsizeof(init_ipc_ns.msg_ctlmni)、 .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax、 .extra1 = SYSCTL_ZERO、 .extra2 = &ipc_mni、 }、 { .procname = "auto_msgmni"、 .DATA = NULL、 .maxlen =はsizeof(INT)、 .mode = 0644、 .proc_handler = proc_ipc_auto_msgmni、 .extra1 = SYSCTL_ZERO、 .extra2 = SYSCTL_ONE、 }、 { .procname = "MSGMNB"、 .DATA =&init_ipc_ns.msg_ctlmnb、 .maxlen =はsizeof(init_ipc_ns.msg_ctlmnb)、 .extra2 = SYSCTL_INT_MAX、 }、 { .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax、 .extra1 = SYSCTL_ZERO、 .extra2 = SYSCTL_INT_MAX、 }、 { .procname = "SEM"、 .DATA =&init_ipc_ns.sem_ctls、 .maxlen = 4 *はsizeof(INT)、 .mode = 0644、 .proc_handler = proc_ipc_sem_dointvec、 }、# CONFIG_CHECKPOINT_RESTORE IFDEF { .procname = "sem_next_id"、 .DATA =&init_ipc_ns.ids [IPC_SEM_IDS] .next_id、 .maxlen =はsizeof(init_ipc_ns.ids [IPC_SEM_IDS] .next_id)、 .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax、 .extra1 = SYSCTL_ZERO、 .procnameは"msg_next_id"、= 、.DATA =&init_ipc_ns.ids [IPC_MSG_IDS]は.next_id .maxlen =はsizeof(init_ipc_ns.ids [IPC_MSG_IDS] .next_id)、 .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax、 .extra1 = SYSCTL_ZERO、 。extra2 = SYSCTL_INT_MAX、 }、 { .procname = "shm_next_id"、 .DATA =&init_ipc_ns.ids [IPC_SHM_IDS] .next_id、 .maxlen =はsizeof(init_ipc_ns.ids [IPC_SHM_IDS] .next_id)、 .mode = 0644、 .proc_handler = proc_ipc_dointvec_minmax 、 .extra1 = SYSCTL_ZERO、 .extra2 = SYSCTL_INT_MAX、 }、 #endifの {} }。 静的構造体ctl_table ipc_root_table [] = { { .procname = "カーネル"、 .mode = 0555、 .child = ipc_kern_table、 }、 {} }。 静的INT __init ipc_sysctl_init(ボイド) { register_sysctl_table(ipc_root_table)。 0を返します。 } device_initcall(ipc_sysctl_init)。 静的INT __init ipc_mni_extend(CHAR * STR) { ipc_mni = IPCMNI_EXTEND。 ipc_mni_shift = IPCMNI_EXTEND_SHIFT。 ipc_min_cycle = IPCMNI_EXTEND_MIN_CYCLE。 pr_info( "IPCMNIは%dに拡張する\ n"、ipc_mni)。 0を返します。 } early_param( "ipcmni_extend"、ipc_mni_extend)。