|
@@ -1014,3 +1014,38 @@ struct svc_xprt *svc_find_xprt(struct svc_serv *serv, char *xcl_name,
|
|
|
return found;
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(svc_find_xprt);
|
|
|
+
|
|
|
+/*
|
|
|
+ * Format a buffer with a list of the active transports. A zero for
|
|
|
+ * the buflen parameter disables target buffer overflow checking.
|
|
|
+ */
|
|
|
+int svc_xprt_names(struct svc_serv *serv, char *buf, int buflen)
|
|
|
+{
|
|
|
+ struct svc_xprt *xprt;
|
|
|
+ char xprt_str[64];
|
|
|
+ int totlen = 0;
|
|
|
+ int len;
|
|
|
+
|
|
|
+ /* Sanity check args */
|
|
|
+ if (!serv)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ spin_lock_bh(&serv->sv_lock);
|
|
|
+ list_for_each_entry(xprt, &serv->sv_permsocks, xpt_list) {
|
|
|
+ len = snprintf(xprt_str, sizeof(xprt_str),
|
|
|
+ "%s %d\n", xprt->xpt_class->xcl_name,
|
|
|
+ svc_xprt_local_port(xprt));
|
|
|
+ /* If the string was truncated, replace with error string */
|
|
|
+ if (len >= sizeof(xprt_str))
|
|
|
+ strcpy(xprt_str, "name-too-long\n");
|
|
|
+ /* Don't overflow buffer */
|
|
|
+ len = strlen(xprt_str);
|
|
|
+ if (buflen && (len + totlen >= buflen))
|
|
|
+ break;
|
|
|
+ strcpy(buf+totlen, xprt_str);
|
|
|
+ totlen += len;
|
|
|
+ }
|
|
|
+ spin_unlock_bh(&serv->sv_lock);
|
|
|
+ return totlen;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(svc_xprt_names);
|