mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
This commit is based on the s390-tools-1.39.0 version. Changes on top of s390-tools-1.39.0: - Add MIT license to all source files - Add LICENSE file - Transform REAMDE to README.md (markdown) - Add AUTHORS.md file - Add CONTRIBUTING.md file - Move changelog from README to CHANGELOG.md file Reviewed-by: Stefan Haberland <sth@linux.vnet.ibm.com> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
111 lines
2.2 KiB
C
111 lines
2.2 KiB
C
/*
|
|
* zdev - Modify and display the persistent configuration of devices
|
|
*
|
|
* Copyright IBM Corp. 2016, 2017
|
|
*
|
|
* s390-tools is free software; you can redistribute it and/or modify
|
|
* it under the terms of the MIT license. See LICENSE for details.
|
|
*/
|
|
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
|
|
#include "devnode.h"
|
|
#include "iscsi.h"
|
|
#include "misc.h"
|
|
#include "path.h"
|
|
|
|
/* Retrieve the IP address of the iSCSI initiator networking portal associated
|
|
* with block device @blkdev. */
|
|
static char *ip_from_blockdev(struct devnode *blkdev)
|
|
{
|
|
char *link, *curr, *end, *path = NULL, *ip = NULL;
|
|
|
|
link = devnode_readlink(blkdev);
|
|
if (!link)
|
|
return NULL;
|
|
|
|
/* ../../devices/platform/host0/session1/target0:0:0/0:0:0:1/... */
|
|
curr = strstr(link, "/devices/");
|
|
if (!curr)
|
|
goto out;
|
|
curr++;
|
|
|
|
/* curr=devices/platform/host0/session1/target0:0:0/0:0:0:1/... */
|
|
end = strstr(curr, "/session");
|
|
if (!end)
|
|
goto out;
|
|
*end = 0;
|
|
|
|
/* curr=devices/platform/host0 */
|
|
end = strstr(curr, "/host");
|
|
if (!end)
|
|
goto out;
|
|
end++;
|
|
|
|
/* curr=devices/platform/host0
|
|
* end=host0 */
|
|
path = path_get("/sys/%s/iscsi_host/%s/ipaddress", curr, end);
|
|
ip = misc_read_text_file(path, 0, err_ignore);
|
|
|
|
out:
|
|
free(path);
|
|
free(link);
|
|
|
|
return ip;
|
|
}
|
|
|
|
static struct devnode *netdev_from_ip(char *ip)
|
|
{
|
|
char *cmd, *text, *dev, *end;
|
|
struct devnode *devnode = NULL;
|
|
|
|
cmd = misc_asprintf("%s -o address show to %s 2>/dev/null", PATH_IP,
|
|
ip);
|
|
text = misc_read_cmd_output(cmd, 0, err_ignore);
|
|
if (!text)
|
|
goto out;
|
|
|
|
/* text=2: enccw0.0.f5f0 inet ... */
|
|
for (dev = text; *dev && !isspace(*dev); dev++);
|
|
|
|
/* dev= enccw0.0.f5f0 inet ... */
|
|
for (; isspace(*dev); dev++);
|
|
|
|
/* dev=enccw0.0.f5f0 inet ... */
|
|
for (end = dev; *end && !isspace(*end); end++);
|
|
if (end == dev)
|
|
goto out;
|
|
*end = 0;
|
|
|
|
/* dev=enccw0.0.f5f0 */
|
|
devnode = devnode_new(NETDEV, 0, 0, dev);
|
|
|
|
out:
|
|
free(cmd);
|
|
free(text);
|
|
|
|
return devnode;
|
|
}
|
|
|
|
/* Retrieve the networking device devnode that provides the specified
|
|
* iSCSI block device @blkdev. */
|
|
struct devnode *iscsi_get_net_devnode(struct devnode *blkdev)
|
|
{
|
|
struct devnode *devnode = NULL;
|
|
char *ip;
|
|
|
|
if (blkdev->type != BLOCKDEV)
|
|
return NULL;
|
|
|
|
ip = ip_from_blockdev(blkdev);
|
|
if (!ip)
|
|
return NULL;
|
|
|
|
devnode = netdev_from_ip(ip);
|
|
|
|
free(ip);
|
|
|
|
return devnode;
|
|
}
|