mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-03 21:48:15 +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
					
				
							
								
								
									
										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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user