1165 return svsk;
1166}
1167
1168int svc_addsock(struct svc_serv *serv,
1169 int fd,
1170 char *name_return)
1171{
1172 int err = 0;
1173 struct socket *so = sockfd_lookup(fd, &err);
1174 struct svc_sock *svsk = NULL;
1175
1176 if (!so)
1177 return err;
1178 if (so->sk->sk_family != AF_INET)
1179 err = -EAFNOSUPPORT;
1180 else if (so->sk->sk_protocol != IPPROTO_TCP &&
1181 so->sk->sk_protocol != IPPROTO_UDP)
1182 err = -EPROTONOSUPPORT;
1183 else if (so->state > SS_UNCONNECTED)
1184 err = -EISCONN;
1185 else {
1186 if (!try_module_get(THIS_MODULE))
1187 err = -ENOENT;
1188 else
1189 svsk = svc_setup_socket(serv, so, &err,
1190 SVC_SOCK_DEFAULTS);
1191 if (svsk) {
1192 struct sockaddr_storage addr;
1193 struct sockaddr *sin = (struct sockaddr *)&addr;
1194 int salen;
1195 if (kernel_getsockname(svsk->sk_sock, sin, &salen) == 0)
1196 svc_xprt_set_local(&svsk->sk_xprt, sin, salen);
1197 clear_bit(XPT_TEMP, &svsk->sk_xprt.xpt_flags);
1198 spin_lock_bh(&serv->sv_lock);
1199 list_add(&svsk->sk_xprt.xpt_list, &serv->sv_permsocks);
1200 spin_unlock_bh(&serv->sv_lock);
1201 svc_xprt_received(&svsk->sk_xprt);
1202 err = 0;
1203 } else
1204 module_put(THIS_MODULE);
1205 }