- /* check each active socket and try to push it along */
- TAILQ_FOREACH(nso, &nss->nss_socklist, nso_link) {
- lck_mtx_lock(&nso->nso_lock);
- if (!(nso->nso_flags & NSO_CONNECTED)) {
- if ((nso->nso_sotype != SOCK_STREAM) && NMFLAG(nmp, NOCONNECT)) {
- /* no connection needed, just say it's already connected */
- nso->nso_flags |= NSO_CONNECTED;
- NFS_SOCK_DBG(("nfs connect %s UDP socket %p noconnect\n",
- vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
- } else if (!(nso->nso_flags & NSO_CONNECTING)) {
- /* initiate the connection */
- nso->nso_flags |= NSO_CONNECTING;
- lck_mtx_unlock(&nso->nso_lock);
- NFS_SOCK_DBG(("nfs connect %s connecting socket %p\n",
- vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
- error = sock_connect(nso->nso_so, nso->nso_saddr, MSG_DONTWAIT);
- lck_mtx_lock(&nso->nso_lock);
- if (error && (error != EINPROGRESS)) {
- nso->nso_error = error;
- nso->nso_flags |= NSO_DEAD;
- lck_mtx_unlock(&nso->nso_lock);
- continue;
- }
- }
- if (nso->nso_flags & NSO_CONNECTING) {
- /* check the connection */
- if (sock_isconnected(nso->nso_so)) {
- NFS_SOCK_DBG(("nfs connect %s socket %p is connected\n",
- vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso));
- nso->nso_flags &= ~NSO_CONNECTING;
- nso->nso_flags |= NSO_CONNECTED;
- } else {
- int optlen = sizeof(error);
- error = 0;
- sock_getsockopt(nso->nso_so, SOL_SOCKET, SO_ERROR, &error, &optlen);
- if (error) { /* we got an error on the socket */
- NFS_SOCK_DBG(("nfs connect %s socket %p connection error %d\n",
- vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error));
- if (nss->nss_flags & NSS_VERBOSE)
- log(LOG_INFO, "nfs_connect: socket error %d for %s\n",
- error, vfs_statfs(nmp->nm_mountp)->f_mntfromname);
- nso->nso_error = error;
- nso->nso_flags |= NSO_DEAD;
- lck_mtx_unlock(&nso->nso_lock);
- continue;
- }
- }
- }
- if (nso->nso_flags & NSO_CONNECTED)
- nfs_socket_options(nmp, nso);
+ if (nss->nss_addrcnt == 0 && nss->nss_last < 0) {
+ nss->nss_last = now->tv_sec;
+ }
+
+ return error;
+}
+
+/*
+ * nfs_connect_search_socket_connect: Connect an nfs socket nso for nfsmount nmp.
+ * If successful set the socket options for the socket as require from the mount.
+ *
+ * Assumes: nso->nso_lock is held on entry and return.
+ */
+int
+nfs_connect_search_socket_connect(struct nfsmount *nmp, struct nfs_socket *nso, int verbose)
+{
+ int error;
+
+ if ((nso->nso_sotype != SOCK_STREAM) && NMFLAG(nmp, NOCONNECT)) {
+ /* no connection needed, just say it's already connected */
+ NFS_SOCK_DBG("nfs connect %s UDP socket %p noconnect\n",
+ vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso);
+ nso->nso_flags |= NSO_CONNECTED;
+ nfs_socket_options(nmp, nso);
+ return 1; /* Socket is connected and setup */
+ } else if (!(nso->nso_flags & NSO_CONNECTING)) {
+ /* initiate the connection */
+ nso->nso_flags |= NSO_CONNECTING;
+ lck_mtx_unlock(&nso->nso_lock);
+ NFS_SOCK_DBG("nfs connect %s connecting socket %p %s\n",
+ vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso,
+ nso->nso_saddr->sa_family == AF_LOCAL ? ((struct sockaddr_un*)nso->nso_saddr)->sun_path : "");
+ error = sock_connect(nso->nso_so, nso->nso_saddr, MSG_DONTWAIT);
+ if (error) {
+ NFS_SOCK_DBG("nfs connect %s connecting socket %p returned %d\n",
+ vfs_statfs(nmp->nm_mountp)->f_mntfromname, nso, error);