12874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * NET4: Sysctl interface to net af_unix subsystem.
41da177e4SLinus Torvalds *
51da177e4SLinus Torvalds * Authors: Mike Shaver.
61da177e4SLinus Torvalds */
71da177e4SLinus Torvalds
81da177e4SLinus Torvalds #include <linux/mm.h>
95a0e3ad6STejun Heo #include <linux/slab.h>
101da177e4SLinus Torvalds #include <linux/sysctl.h>
111da177e4SLinus Torvalds
1220380731SArnaldo Carvalho de Melo #include <net/af_unix.h>
131da177e4SLinus Torvalds
14fe2c6338SJoe Perches static struct ctl_table unix_table[] = {
151da177e4SLinus Torvalds {
161da177e4SLinus Torvalds .procname = "max_dgram_qlen",
17a0a53c8bSDenis V. Lunev .data = &init_net.unx.sysctl_max_dgram_qlen,
181da177e4SLinus Torvalds .maxlen = sizeof(int),
191da177e4SLinus Torvalds .mode = 0644,
206d9f239aSAlexey Dobriyan .proc_handler = proc_dointvec
211da177e4SLinus Torvalds },
22f8572d8fSEric W. Biederman { }
231da177e4SLinus Torvalds };
241da177e4SLinus Torvalds
unix_sysctl_register(struct net * net)252c8c1e72SAlexey Dobriyan int __net_init unix_sysctl_register(struct net *net)
261da177e4SLinus Torvalds {
271597fbc0SPavel Emelyanov struct ctl_table *table;
281597fbc0SPavel Emelyanov
29849d5aa3SKuniyuki Iwashima if (net_eq(net, &init_net)) {
30849d5aa3SKuniyuki Iwashima table = unix_table;
31849d5aa3SKuniyuki Iwashima } else {
321597fbc0SPavel Emelyanov table = kmemdup(unix_table, sizeof(unix_table), GFP_KERNEL);
33849d5aa3SKuniyuki Iwashima if (!table)
341597fbc0SPavel Emelyanov goto err_alloc;
351597fbc0SPavel Emelyanov
36a0a53c8bSDenis V. Lunev table[0].data = &net->unx.sysctl_max_dgram_qlen;
37849d5aa3SKuniyuki Iwashima }
38849d5aa3SKuniyuki Iwashima
39*c899710fSJoel Granados net->unx.ctl = register_net_sysctl_sz(net, "net/unix", table,
40*c899710fSJoel Granados ARRAY_SIZE(unix_table));
41a0a53c8bSDenis V. Lunev if (net->unx.ctl == NULL)
421597fbc0SPavel Emelyanov goto err_reg;
431597fbc0SPavel Emelyanov
441597fbc0SPavel Emelyanov return 0;
451597fbc0SPavel Emelyanov
461597fbc0SPavel Emelyanov err_reg:
4744ac441aSEric Dumazet if (!net_eq(net, &init_net))
481597fbc0SPavel Emelyanov kfree(table);
491597fbc0SPavel Emelyanov err_alloc:
501597fbc0SPavel Emelyanov return -ENOMEM;
511da177e4SLinus Torvalds }
521da177e4SLinus Torvalds
unix_sysctl_unregister(struct net * net)5397577e38SPavel Emelyanov void unix_sysctl_unregister(struct net *net)
541da177e4SLinus Torvalds {
551597fbc0SPavel Emelyanov struct ctl_table *table;
561597fbc0SPavel Emelyanov
57a0a53c8bSDenis V. Lunev table = net->unx.ctl->ctl_table_arg;
585dd3df10SEric W. Biederman unregister_net_sysctl_table(net->unx.ctl);
59849d5aa3SKuniyuki Iwashima if (!net_eq(net, &init_net))
601597fbc0SPavel Emelyanov kfree(table);
611da177e4SLinus Torvalds }
62