2088 if (!in_dev) {
2089 err = -ENODEV;
2090 goto done;
2091 }
2092 err = -EADDRNOTAVAIL;
2093
2094 for (pmc=inet->mc_list; pmc; pmc=pmc->next) {
2095 if (pmc->multi.imr_multiaddr.s_addr == msf->imsf_multiaddr &&
2096 pmc->multi.imr_ifindex == imr.imr_ifindex)
2097 break;
2098 }
2099 if (!pmc)
2100 goto done;
2101 msf->imsf_fmode = pmc->sfmode;
2102 psl = pmc->sflist;
2103 rtnl_unlock();
2104 if (!psl) {
2105 len = 0;
2106 count = 0;
2107 } else {
2108 count = psl->sl_count;
2109 }
2110 copycount = count < msf->imsf_numsrc ? count : msf->imsf_numsrc;
2111 len = copycount * sizeof(psl->sl_addr[0]);
2112 msf->imsf_numsrc = count;
2113 if (put_user(IP_MSFILTER_SIZE(copycount), optlen) ||
2114 copy_to_user(optval, msf, IP_MSFILTER_SIZE(0))) {
2115 return -EFAULT;
2116 }
2117 if (len &&
2118 copy_to_user(&optval->imsf_slist[0], psl->sl_addr, len))
2119 return -EFAULT;
2120 return 0;
2121done:
2122 rtnl_unlock();
2123 return err;
2124}
2125
2126int ip_mc_gsfget(struct sock *sk, struct group_filter *gsf,
2127 struct group_filter __user *optval, int __user *optlen)
2128{