*** linux.2.0.14/include/linux/ncp.h	Sun Aug  4 12:14:16 1996
--- linux/include/linux/ncp.h	Thu Aug 22 23:05:33 1996
***************
*** 2,7 ****
--- 2,8 ----
   *  ncp.h
   *
   *  Copyright (C) 1995 by Volker Lendecke
+  *  Modified for sparc by J.F. Chadima
   *
   */
  
***************
*** 92,107 ****
  #define NCP_MAX_FILENAME 14
  
  /* these define the attribute byte as seen by NCP */
! #define aRONLY     (1L<<0)
! #define aHIDDEN    (1L<<1)
! #define aSYSTEM    (1L<<2)
! #define aEXECUTE   (1L<<3)
! #define aDIR       (1L<<4)
! #define aARCH      (1L<<5)
! 
! #define AR_READ      (0x01)
! #define AR_WRITE     (0x02)
! #define AR_EXCLUSIVE (0x20)
  
  #define NCP_FILE_ID_LEN 6
  struct ncp_file_info {
--- 93,108 ----
  #define NCP_MAX_FILENAME 14
  
  /* these define the attribute byte as seen by NCP */
! #define aRONLY     (ntohl(0x01000000))
! #define aHIDDEN    (ntohl(0x02000000))
! #define aSYSTEM    (ntohl(0x04000000))
! #define aEXECUTE   (ntohl(0x08000000))
! #define aDIR       (ntohl(0x10000000))
! #define aARCH      (ntohl(0x20000000))
! 
! #define AR_READ      (ntohs(0x0100))
! #define AR_WRITE     (ntohs(0x0200))
! #define AR_EXCLUSIVE (ntohs(0x2000))
  
  #define NCP_FILE_ID_LEN 6
  struct ncp_file_info {
***************
*** 124,143 ****
  #define NW_NS_OS2     4
  
  /*  Defines for ReturnInformationMask */
! #define RIM_NAME	      (0x0001L)
! #define RIM_SPACE_ALLOCATED   (0x0002L)
! #define RIM_ATTRIBUTES	      (0x0004L)
! #define RIM_DATA_SIZE	      (0x0008L)
! #define RIM_TOTAL_SIZE	      (0x0010L)
! #define RIM_EXT_ATTR_INFO     (0x0020L)
! #define RIM_ARCHIVE	      (0x0040L)
! #define RIM_MODIFY	      (0x0080L)
! #define RIM_CREATION	      (0x0100L)
! #define RIM_OWNING_NAMESPACE  (0x0200L)
! #define RIM_DIRECTORY	      (0x0400L)
! #define RIM_RIGHTS	      (0x0800L)
! #define RIM_ALL 	      (0x0FFFL)
! #define RIM_COMPRESSED_INFO   (0x80000000L)
  
  /* open/create modes */
  #define OC_MODE_OPEN	  0x01
--- 125,144 ----
  #define NW_NS_OS2     4
  
  /*  Defines for ReturnInformationMask */
! #define RIM_NAME	      (ntohl(0x01000000L))
! #define RIM_SPACE_ALLOCATED   (ntohl(0x02000000L))
! #define RIM_ATTRIBUTES	      (ntohl(0x04000000L))
! #define RIM_DATA_SIZE	      (ntohl(0x08000000L))
! #define RIM_TOTAL_SIZE	      (ntohl(0x10000000L))
! #define RIM_EXT_ATTR_INFO     (ntohl(0x20000000L))
! #define RIM_ARCHIVE	      (ntohl(0x40000000L))
! #define RIM_MODIFY	      (ntohl(0x80000000L))
! #define RIM_CREATION	      (ntohl(0x00010000L))
! #define RIM_OWNING_NAMESPACE  (ntohl(0x00020000L))
! #define RIM_DIRECTORY	      (ntohl(0x00040000L))
! #define RIM_RIGHTS	      (ntohl(0x00080000L))
! #define RIM_ALL 	      (ntohl(0xFF0F0000L))
! #define RIM_COMPRESSED_INFO   (ntohl(0x00000080L))
  
  /* open/create modes */
  #define OC_MODE_OPEN	  0x01
***************
*** 194,212 ****
  };
  
  /* modify mask - use with MODIFY_DOS_INFO structure */
! #define DM_ATTRIBUTES		  (0x0002L)
! #define DM_CREATE_DATE		  (0x0004L)
! #define DM_CREATE_TIME		  (0x0008L)
! #define DM_CREATOR_ID		  (0x0010L)
! #define DM_ARCHIVE_DATE 	  (0x0020L)
! #define DM_ARCHIVE_TIME 	  (0x0040L)
! #define DM_ARCHIVER_ID		  (0x0080L)
! #define DM_MODIFY_DATE		  (0x0100L)
! #define DM_MODIFY_TIME		  (0x0200L)
! #define DM_MODIFIER_ID		  (0x0400L)
! #define DM_LAST_ACCESS_DATE	  (0x0800L)
! #define DM_INHERITED_RIGHTS_MASK  (0x1000L)
! #define DM_MAXIMUM_SPACE	  (0x2000L)
  
  struct nw_modify_dos_info
  {
--- 195,213 ----
  };
  
  /* modify mask - use with MODIFY_DOS_INFO structure */
! #define DM_ATTRIBUTES		  (ntohl(0x02000000L))
! #define DM_CREATE_DATE		  (ntohl(0x04000000L))
! #define DM_CREATE_TIME		  (ntohl(0x08000000L))
! #define DM_CREATOR_ID		  (ntohl(0x10000000L))
! #define DM_ARCHIVE_DATE 	  (ntohl(0x20000000L))
! #define DM_ARCHIVE_TIME 	  (ntohl(0x40000000L))
! #define DM_ARCHIVER_ID		  (ntohl(0x80000000L))
! #define DM_MODIFY_DATE		  (ntohl(0x00010000L))
! #define DM_MODIFY_TIME		  (ntohl(0x00020000L))
! #define DM_MODIFIER_ID		  (ntohl(0x00040000L))
! #define DM_LAST_ACCESS_DATE	  (ntohl(0x00080000L))
! #define DM_INHERITED_RIGHTS_MASK  (ntohl(0x00100000L))
! #define DM_MAXIMUM_SPACE	  (ntohl(0x00200000L))
  
  struct nw_modify_dos_info
  {
*** linux.2.0.14/fs/ncpfs/ncplib_kernel.c	Thu Jul 18 12:52:00 1996
--- linux/fs/ncpfs/ncplib_kernel.c	Thu Aug 22 23:04:42 1996
***************
*** 2,7 ****
--- 2,8 ----
   *  ncplib_kernel.c
   *
   *  Copyright (C) 1995, 1996 by Volker Lendecke
+  *  Modified for sparc by J.F. Chadima
   *
   */
  
***************
*** 29,35 ****
--- 30,40 ----
  ncp_add_byte(struct ncp_server *server, byte x)
  {
  	assert_server_locked(server);
+ #ifdef __sparc__
+         memcpy (&(server->packet[server->current_size]), &x, 1);
+ #else
  	*(byte *)(&(server->packet[server->current_size])) = x;
+ #endif
  	server->current_size += 1;
  	return;
  }
***************
*** 38,44 ****
--- 43,53 ----
  ncp_add_word(struct ncp_server *server, word x)
  {
  	assert_server_locked(server);
+ #ifdef __sparc__
+         memcpy (&(server->packet[server->current_size]), &x, 2);
+ #else
  	*(word *)(&(server->packet[server->current_size])) = x;
+ #endif
  	server->current_size += 2;
  	return;
  }
***************
*** 47,53 ****
--- 56,66 ----
  ncp_add_dword(struct ncp_server *server, dword x)
  {
  	assert_server_locked(server);
+ #ifdef __sparc__
+         memcpy (&(server->packet[server->current_size]), &x, 4);
+ #else
  	*(dword *)(&(server->packet[server->current_size])) = x;
+ #endif
  	server->current_size += 4;
  	return;
  }
***************
*** 261,267 ****
  	ncp_add_byte(server, 6); /* subfunction */
  	ncp_add_byte(server, server->name_space[vol_num]);
  	ncp_add_byte(server, server->name_space[vol_num]);
! 	ncp_add_word(server, 0xff); /* get all */
  	ncp_add_dword(server, RIM_ALL);
  	ncp_add_handle_path(server, vol_num, dir_base, 1, path);
  
--- 274,280 ----
  	ncp_add_byte(server, 6); /* subfunction */
  	ncp_add_byte(server, server->name_space[vol_num]);
  	ncp_add_byte(server, server->name_space[vol_num]);
! 	ncp_add_word(server, htons(0xff00)); /* get all */
  	ncp_add_dword(server, RIM_ALL);
  	ncp_add_handle_path(server, vol_num, dir_base, 1, path);
  
***************
*** 371,377 ****
  	ncp_add_byte(server, 7); /* subfunction */
  	ncp_add_byte(server, server->name_space[file->volNumber]);
  	ncp_add_byte(server, 0); /* reserved */
! 	ncp_add_word(server, 0x8006); /* search attribs: all */
  
  	ncp_add_dword(server, info_mask);
  	ncp_add_mem(server, info, sizeof(*info));
--- 384,390 ----
  	ncp_add_byte(server, 7); /* subfunction */
  	ncp_add_byte(server, server->name_space[file->volNumber]);
  	ncp_add_byte(server, 0); /* reserved */
! 	ncp_add_word(server, htons(0x0680)); /* search attribs: all */
  
  	ncp_add_dword(server, info_mask);
  	ncp_add_mem(server, info, sizeof(*info));
***************
*** 393,399 ****
  	ncp_add_byte(server, 8); /* subfunction */
  	ncp_add_byte(server, server->name_space[dir->volNumber]);
  	ncp_add_byte(server, 0); /* reserved */
! 	ncp_add_word(server, 0x8006); /* search attribs: all */
  	ncp_add_handle_path(server, dir->volNumber,
  			    dir->dirEntNum, 1, name);
  	
--- 406,412 ----
  	ncp_add_byte(server, 8); /* subfunction */
  	ncp_add_byte(server, server->name_space[dir->volNumber]);
  	ncp_add_byte(server, 0); /* reserved */
! 	ncp_add_word(server, ntohs(0x0680)); /* search attribs: all */
  	ncp_add_handle_path(server, dir->volNumber,
  			    dir->dirEntNum, 1, name);
  	
***************
*** 405,413 ****
--- 418,431 ----
  static inline void
  ConvertToNWfromDWORD ( __u32 sfd , __u8 ret[6] )
  {
+ #ifdef __sparc__
+     memcpy (ret + 2, &sfd, 4);
+     ret[1] = (ret[3] + ((ret[0] = (ret[2] + 1) & 0xFF) == 0) ? 1 : 0) & 0xFF;
+ #else
      __u16 *dest = (__u16 *) ret;
      memcpy(&(dest[1]), &sfd, 4);
      dest[0] = dest[1] + 1;
+ #endif
      return;
  }
  
***************
*** 422,434 ****
  			       struct nw_file_info *target)
  {
  	int result;
! 	__u16 search_attribs = 0x0006;
  	__u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber;
  
  	if ((create_attributes & aDIR) != 0)
  	{
! 		search_attribs |= 0x8000;	
! }
  
  	ncp_init_request(server);
  	ncp_add_byte(server, 1); /* subfunction */
--- 440,452 ----
  			       struct nw_file_info *target)
  {
  	int result;
! 	__u16 search_attribs = ntohs(0x0600);
  	__u8 volume = (dir != NULL) ? dir->volNumber : target->i.volNumber;
  
  	if ((create_attributes & aDIR) != 0)
  	{
! 		search_attribs |= ntohs(0x0080);	
! 	}
  
  	ncp_init_request(server);
  	ncp_add_byte(server, 1); /* subfunction */
***************
*** 546,552 ****
  	ncp_add_byte(server, 4); /* subfunction */
  	ncp_add_byte(server, server->name_space[old_dir->volNumber]);
  	ncp_add_byte(server, 1); /* rename flag */
! 	ncp_add_word(server, 0x8006); /* search attributes */
  
  	/* source Handle Path */
  	ncp_add_byte(server, old_dir->volNumber);
--- 564,570 ----
  	ncp_add_byte(server, 4); /* subfunction */
  	ncp_add_byte(server, server->name_space[old_dir->volNumber]);
  	ncp_add_byte(server, 1); /* rename flag */
! 	ncp_add_word(server, ntohs (0x0680)); /* search attributes */
  
  	/* source Handle Path */
  	ncp_add_byte(server, old_dir->volNumber);
*** linux.2.0.14/fs/ncpfs/dir.c	Thu Jul 18 12:52:00 1996
--- linux/fs/ncpfs/dir.c	Thu Aug 22 23:08:04 1996
***************
*** 2,7 ****
--- 2,8 ----
   *  dir.c
   *
   *  Copyright (C) 1995, 1996 by Volker Lendecke
+  *  Modified for sparc by J.F. Chadima
   *
   */
  
***************
*** 17,22 ****
--- 18,28 ----
  #include <linux/locks.h>
  #include "ncplib_kernel.h"
  
+ 
+ #ifdef __sparc__
+ #define SWAP16(x)  ((((__u16)(x) & 0xFF) << 8) | (((__u16)(x) & 0xFF00) >> 8))
+ #endif
+ 
  struct ncp_dirent {
  	struct nw_info_struct i;
  	struct nw_search_sequence s; /* given back for i */
***************
*** 669,677 ****
--- 675,692 ----
  	i->dataStreamSize = 1024;
  	i->dirEntNum = i->DosDirNum = 0;
  	i->volNumber = NCP_NUMBER_OF_VOLUMES+1;	/* illegal volnum */
+ /* why 0 ? ---------------+   */
+ /*                        v   */
  	ncp_date_unix2dos(0, &(i->creationTime), &(i->creationDate));
  	ncp_date_unix2dos(0, &(i->modifyTime), &(i->modifyDate));
  	ncp_date_unix2dos(0, &dummy, &(i->lastAccessDate));
+ #ifdef __sparc__
+ 	i->creationTime = SWAP16 (i->creationTime);
+ 	i->creationDate = SWAP16 (i->creationDate);
+ 	i->modifyTime = SWAP16 (i->modifyTime);
+ 	i->modifyDate = SWAP16 (i->modifyDate);
+ 	i->lastAccessDate = SWAP16 (i->lastAccessDate);
+ #endif
  	i->nameLen = 0;
  	i->entryName[0] = '\0';
  
*** linux.2.0.14/fs/ncpfs/inode.c	Sun Jun  2 08:21:10 1996
--- linux/fs/ncpfs/inode.c	Thu Aug 22 23:04:17 1996
***************
*** 2,7 ****
--- 2,8 ----
   *  inode.c
   *
   *  Copyright (C) 1995, 1996 by Volker Lendecke
+  *  Modified for sparc by J.F. Chadima
   *
   */
  
***************
*** 34,39 ****
--- 35,49 ----
  static void ncp_statfs(struct super_block *sb, struct statfs *buf, int bufsiz);
  static int ncp_notify_change(struct inode *inode, struct iattr *attr);
  
+ #ifdef __sparc__
+ #define SWAP16(x)  ((((__u16)(x) & 0xFF) << 8) | (((__u16)(x) & 0xFF00) >> 8))
+ #define SWAP32(x)  ((((__u32)(x) & 0xFF) << 24) | (((__u32)(x) & 0xFF00) << 8) \
+ 		   | (((__u32)(x) & 0xFF0000) >> 8) | (((__u32)(x) & 0xFF000000) >> 24))
+ #else
+ #define SWAP16(x)  (x)
+ #define SWAP32(x)  (x)
+ #endif
+  
  static struct super_operations ncp_sops = {
  	ncp_read_inode,         /* read inode */
  	ncp_notify_change,	/* notify change */
***************
*** 83,89 ****
  	else
  	{
                  inode->i_mode = NCP_SERVER(inode)->m.file_mode;
! 		inode->i_size = NCP_ISTRUCT(inode)->dataStreamSize;
  	}
  
          DDPRINTK("ncp_read_inode: inode->i_mode = %u\n", inode->i_mode);
--- 93,99 ----
  	else
  	{
                  inode->i_mode = NCP_SERVER(inode)->m.file_mode;
! 		inode->i_size = SWAP32(NCP_ISTRUCT(inode)->dataStreamSize);
  	}
  
          DDPRINTK("ncp_read_inode: inode->i_mode = %u\n", inode->i_mode);
***************
*** 104,115 ****
                  inode->i_blocks = 0;
  	}
  
! 	inode->i_mtime = ncp_date_dos2unix(NCP_ISTRUCT(inode)->modifyTime,
! 					   NCP_ISTRUCT(inode)->modifyDate);
! 	inode->i_ctime = ncp_date_dos2unix(NCP_ISTRUCT(inode)->creationTime,
! 					   NCP_ISTRUCT(inode)->creationDate);
  	inode->i_atime = ncp_date_dos2unix(0,
! 					   NCP_ISTRUCT(inode)->lastAccessDate);
  
          if (S_ISREG(inode->i_mode))
  	{
--- 114,125 ----
                  inode->i_blocks = 0;
  	}
  
! 	inode->i_mtime = ncp_date_dos2unix(SWAP16(NCP_ISTRUCT(inode)->modifyTime),
! 					   SWAP16(NCP_ISTRUCT(inode)->modifyDate));
! 	inode->i_ctime = ncp_date_dos2unix(SWAP16(NCP_ISTRUCT(inode)->creationTime),
! 					   SWAP16(NCP_ISTRUCT(inode)->creationDate));
  	inode->i_atime = ncp_date_dos2unix(0,
! 					   SWAP16(NCP_ISTRUCT(inode)->lastAccessDate));
  
          if (S_ISREG(inode->i_mode))
  	{
***************
*** 454,459 ****
--- 464,473 ----
  		info_mask |= (DM_CREATE_TIME|DM_CREATE_DATE);
  		ncp_date_unix2dos(attr->ia_ctime,
  				  &(info.creationTime), &(info.creationDate));
+ #ifdef __sparc__
+ 		info.creationTime = SWAP16 (info.creationTime);
+ 		info.creationDate = SWAP16 (info.creationDate);
+ #endif
  	}
  	
  	if ((attr->ia_valid & ATTR_MTIME) != 0)
***************
*** 461,466 ****
--- 475,484 ----
  		info_mask |= (DM_MODIFY_TIME|DM_MODIFY_DATE);
  		ncp_date_unix2dos(attr->ia_mtime,
  				  &(info.modifyTime), &(info.modifyDate));
+ #ifdef __sparc__
+ 		info.modifyTime = SWAP16 (info.modifyTime);
+ 		info.modifyDate = SWAP16 (info.modifyDate);
+ #endif
  	}
  	
  	if ((attr->ia_valid & ATTR_ATIME) != 0)
***************
*** 469,474 ****
--- 487,495 ----
  		info_mask |= (DM_LAST_ACCESS_DATE);
  		ncp_date_unix2dos(attr->ia_ctime,
  				  &(dummy), &(info.lastAccessDate));
+ #ifdef __sparc__
+ 		info.lastAccessDate = SWAP16 (info.lastAccessDate);
+ #endif
  	}
  
  	if (info_mask != 0)
