mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-17 12:41:32 +00:00
net: nfs: Consolidate handling of NFSv3 attributes
Instead of repeating the same large snippet for dealing with attributes it should be shared with a helper function. Signed-off-by: Joe Hershberger <joe.hershberger@ni.com>
This commit is contained in:
parent
347a901597
commit
051ed9af8c
1 changed files with 59 additions and 92 deletions
151
net/nfs.c
151
net/nfs.c
|
@ -588,10 +588,39 @@ static int nfs_lookup_reply(uchar *pkt, unsigned len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int nfs3_get_attributes_offset(uint32_t *data)
|
||||
{
|
||||
if (ntohl(data[1]) != 0) {
|
||||
/* 'attributes_follow' flag is TRUE,
|
||||
* so we have attributes on 21 bytes */
|
||||
/* Skip unused values :
|
||||
type; 32 bits value,
|
||||
mode; 32 bits value,
|
||||
nlink; 32 bits value,
|
||||
uid; 32 bits value,
|
||||
gid; 32 bits value,
|
||||
size; 64 bits value,
|
||||
used; 64 bits value,
|
||||
rdev; 64 bits value,
|
||||
fsid; 64 bits value,
|
||||
fileid; 64 bits value,
|
||||
atime; 64 bits value,
|
||||
mtime; 64 bits value,
|
||||
ctime; 64 bits value,
|
||||
*/
|
||||
return 22;
|
||||
} else {
|
||||
/* 'attributes_follow' flag is FALSE,
|
||||
* so we don't have any attributes */
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
static int nfs_readlink_reply(uchar *pkt, unsigned len)
|
||||
{
|
||||
struct rpc_t rpc_pkt;
|
||||
int rlen;
|
||||
int nfsv3_data_offset = 0;
|
||||
|
||||
debug("%s\n", __func__);
|
||||
|
||||
|
@ -608,68 +637,28 @@ static int nfs_readlink_reply(uchar *pkt, unsigned len)
|
|||
rpc_pkt.u.reply.data[0])
|
||||
return -1;
|
||||
|
||||
if (supported_nfs_versions & NFSV2_FLAG) {
|
||||
if (!(supported_nfs_versions & NFSV2_FLAG)) { /* NFSV3_FLAG */
|
||||
nfsv3_data_offset =
|
||||
nfs3_get_attributes_offset(rpc_pkt.u.reply.data);
|
||||
}
|
||||
|
||||
rlen = ntohl(rpc_pkt.u.reply.data[1]); /* new path length */
|
||||
/* new path length */
|
||||
rlen = ntohl(rpc_pkt.u.reply.data[1 + nfsv3_data_offset]);
|
||||
|
||||
if (*((char *)&(rpc_pkt.u.reply.data[2])) != '/') {
|
||||
int pathlen;
|
||||
strcat(nfs_path, "/");
|
||||
pathlen = strlen(nfs_path);
|
||||
memcpy(nfs_path + pathlen,
|
||||
(uchar *)&(rpc_pkt.u.reply.data[2]),
|
||||
rlen);
|
||||
nfs_path[pathlen + rlen] = 0;
|
||||
} else {
|
||||
memcpy(nfs_path,
|
||||
(uchar *)&(rpc_pkt.u.reply.data[2]),
|
||||
rlen);
|
||||
nfs_path[rlen] = 0;
|
||||
}
|
||||
} else { /* NFSV3_FLAG */
|
||||
int nfsv3_data_offset = 0;
|
||||
if (ntohl(rpc_pkt.u.reply.data[1]) != 0) {
|
||||
/* 'attributes_follow' flag is TRUE,
|
||||
* so we have attributes on 21 bytes */
|
||||
/* Skip unused values :
|
||||
type; 32 bits value,
|
||||
mode; 32 bits value,
|
||||
nlink; 32 bits value,
|
||||
uid; 32 bits value,
|
||||
gid; 32 bits value,
|
||||
size; 64 bits value,
|
||||
used; 64 bits value,
|
||||
rdev; 64 bits value,
|
||||
fsid; 64 bits value,
|
||||
fileid; 64 bits value,
|
||||
atime; 64 bits value,
|
||||
mtime; 64 bits value,
|
||||
ctime; 64 bits value,
|
||||
*/
|
||||
nfsv3_data_offset = 22;
|
||||
} else {
|
||||
/* 'attributes_follow' flag is FALSE,
|
||||
* so we don't have any attributes */
|
||||
nfsv3_data_offset = 1;
|
||||
}
|
||||
if (*((char *)&(rpc_pkt.u.reply.data[2 + nfsv3_data_offset])) != '/') {
|
||||
int pathlen;
|
||||
|
||||
/* new path length */
|
||||
rlen = ntohl(rpc_pkt.u.reply.data[1+nfsv3_data_offset]);
|
||||
|
||||
if (*((char *)&(rpc_pkt.u.reply.data[2+nfsv3_data_offset])) != '/') {
|
||||
int pathlen;
|
||||
strcat(nfs_path, "/");
|
||||
pathlen = strlen(nfs_path);
|
||||
memcpy(nfs_path + pathlen,
|
||||
(uchar *)&(rpc_pkt.u.reply.data[2+nfsv3_data_offset]),
|
||||
rlen);
|
||||
nfs_path[pathlen + rlen] = 0;
|
||||
} else {
|
||||
memcpy(nfs_path,
|
||||
(uchar *)&(rpc_pkt.u.reply.data[2+nfsv3_data_offset]),
|
||||
rlen);
|
||||
nfs_path[rlen] = 0;
|
||||
}
|
||||
strcat(nfs_path, "/");
|
||||
pathlen = strlen(nfs_path);
|
||||
memcpy(nfs_path + pathlen,
|
||||
(uchar *)&(rpc_pkt.u.reply.data[2 + nfsv3_data_offset]),
|
||||
rlen);
|
||||
nfs_path[pathlen + rlen] = 0;
|
||||
} else {
|
||||
memcpy(nfs_path,
|
||||
(uchar *)&(rpc_pkt.u.reply.data[2 + nfsv3_data_offset]),
|
||||
rlen);
|
||||
nfs_path[rlen] = 0;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -710,39 +699,17 @@ static int nfs_read_reply(uchar *pkt, unsigned len)
|
|||
rlen = ntohl(rpc_pkt.u.reply.data[18]);
|
||||
data_ptr = (uchar *)&(rpc_pkt.u.reply.data[19]);
|
||||
} else { /* NFSV3_FLAG */
|
||||
if (ntohl(rpc_pkt.u.reply.data[1]) != 0) {
|
||||
/* 'attributes_follow' is TRUE,
|
||||
* so we have attributes on 21 bytes */
|
||||
/* Skip unused values :
|
||||
type; 32 bits value,
|
||||
mode; 32 bits value,
|
||||
nlink; 32 bits value,
|
||||
uid; 32 bits value,
|
||||
gid; 32 bits value,
|
||||
size; 64 bits value,
|
||||
used; 64 bits value,
|
||||
rdev; 64 bits value,
|
||||
fsid; 64 bits value,
|
||||
fileid; 64 bits value,
|
||||
atime; 64 bits value,
|
||||
mtime; 64 bits value,
|
||||
ctime; 64 bits value,
|
||||
*/
|
||||
rlen = ntohl(rpc_pkt.u.reply.data[23]); /* count value */
|
||||
/* Skip unused values :
|
||||
EOF: 32 bits value,
|
||||
data_size: 32 bits value,
|
||||
*/
|
||||
data_ptr = (uchar *)&(rpc_pkt.u.reply.data[26]);
|
||||
} else {
|
||||
/* attributes_follow is FALSE, so we don't have any attributes */
|
||||
rlen = ntohl(rpc_pkt.u.reply.data[2]); /* count value */
|
||||
/* Skip unused values :
|
||||
EOF: 32 bits value,
|
||||
data_size: 32 bits value,
|
||||
*/
|
||||
data_ptr = (uchar *)&(rpc_pkt.u.reply.data[5]);
|
||||
}
|
||||
int nfsv3_data_offset =
|
||||
nfs3_get_attributes_offset(rpc_pkt.u.reply.data);
|
||||
|
||||
/* count value */
|
||||
rlen = ntohl(rpc_pkt.u.reply.data[1 + nfsv3_data_offset]);
|
||||
/* Skip unused values :
|
||||
EOF: 32 bits value,
|
||||
data_size: 32 bits value,
|
||||
*/
|
||||
data_ptr = (uchar *)
|
||||
&(rpc_pkt.u.reply.data[4 + nfsv3_data_offset]);
|
||||
}
|
||||
|
||||
if (store_block(data_ptr, nfs_offset, rlen))
|
||||
|
|
Loading…
Add table
Reference in a new issue