summaryrefslogtreecommitdiffstats
path: root/fs/smbfs
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>1997-04-29 21:13:14 +0000
committer <ralf@linux-mips.org>1997-04-29 21:13:14 +0000
commit19c9bba94152148523ba0f7ef7cffe3d45656b11 (patch)
tree40b1cb534496a7f1ca0f5c314a523c69f1fee464 /fs/smbfs
parent7206675c40394c78a90e74812bbdbf8cf3cca1be (diff)
Import of Linux/MIPS 2.1.36
Diffstat (limited to 'fs/smbfs')
-rw-r--r--fs/smbfs/dir.c2
-rw-r--r--fs/smbfs/file.c2
-rw-r--r--fs/smbfs/inode.c13
-rw-r--r--fs/smbfs/proc.c26
-rw-r--r--fs/smbfs/sock.c114
5 files changed, 93 insertions, 64 deletions
diff --git a/fs/smbfs/dir.c b/fs/smbfs/dir.c
index a07d13517..e23dbb979 100644
--- a/fs/smbfs/dir.c
+++ b/fs/smbfs/dir.c
@@ -56,7 +56,7 @@ static struct file_operations smb_dir_operations =
smb_dir_read, /* read - bad */
NULL, /* write - bad */
smb_readdir, /* readdir */
- NULL, /* select - default */
+ NULL, /* poll - default */
smb_ioctl, /* ioctl - default */
NULL, /* mmap */
NULL, /* no special open code */
diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c
index 525c78ab9..93c57e38f 100644
--- a/fs/smbfs/file.c
+++ b/fs/smbfs/file.c
@@ -215,7 +215,7 @@ static struct file_operations smb_file_operations =
smb_file_read, /* read */
smb_file_write, /* write */
NULL, /* readdir - bad */
- NULL, /* select - default */
+ NULL, /* poll - default */
smb_ioctl, /* ioctl */
smb_mmap, /* mmap */
NULL, /* open */
diff --git a/fs/smbfs/inode.c b/fs/smbfs/inode.c
index b39403358..7ab7d15ff 100644
--- a/fs/smbfs/inode.c
+++ b/fs/smbfs/inode.c
@@ -5,6 +5,7 @@
*
*/
+#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
@@ -18,6 +19,7 @@
#include <linux/locks.h>
#include <linux/fcntl.h>
#include <linux/malloc.h>
+#include <linux/init.h>
#include <asm/system.h>
#include <asm/uaccess.h>
@@ -431,18 +433,17 @@ static struct file_system_type smb_fs_type =
smb_read_super, "smbfs", 0, NULL
};
-int
-init_smb_fs(void)
+__initfunc(int init_smb_fs(void))
{
return register_filesystem(&smb_fs_type);
}
#ifdef MODULE
+EXPORT_NO_SYMBOLS;
+
int
init_module(void)
{
- int status;
-
DPRINTK("smbfs: init_module called\n");
#ifdef DEBUG_SMB_MALLOC
@@ -453,9 +454,7 @@ init_module(void)
smb_init_dir_cache();
- if ((status = init_smb_fs()) == 0)
- register_symtab(0);
- return status;
+ return init_smb_fs();
}
void
diff --git a/fs/smbfs/proc.c b/fs/smbfs/proc.c
index ee998a89f..1fc0cd171 100644
--- a/fs/smbfs/proc.c
+++ b/fs/smbfs/proc.c
@@ -128,7 +128,10 @@ smb_encode_path(struct smb_server *server,
const char *name, const int len)
{
byte *start = p;
- p = smb_encode_parents(p, dir);
+ if (dir != NULL)
+ {
+ p = smb_encode_parents(p, dir);
+ }
p = smb_encode_this_name(p, name, len);
*p++ = 0;
if (server->protocol <= PROTOCOL_COREPLUS)
@@ -573,7 +576,6 @@ smb_proc_open(struct smb_server *server,
DPRINTK("smb_proc_open: name=%s\n", name);
smb_lock_server(server);
- buf = server->packet;
if (entry->opened != 0)
{
@@ -582,6 +584,7 @@ smb_proc_open(struct smb_server *server,
return 0;
}
retry:
+ buf = server->packet;
p = smb_setup_header(server, SMBopen, 2, 0);
WSET(buf, smb_vwv0, 0x42); /* read/write */
WSET(buf, smb_vwv1, o_attr);
@@ -732,8 +735,8 @@ smb_proc_create(struct inode *dir, const char *name, int len,
__u16 fileid;
smb_lock_server(server);
- buf = server->packet;
retry:
+ buf = server->packet;
p = smb_setup_header(server, SMBcreate, 3, 0);
WSET(buf, smb_vwv0, attr);
DSET(buf, smb_vwv1, utc2local(ctime));
@@ -764,15 +767,13 @@ smb_proc_mv(struct inode *odir, const char *oname, const int olen,
{
char *p;
struct smb_server *server = SMB_SERVER(odir);
- char *buf;
int result;
smb_lock_server(server);
- buf = server->packet;
retry:
p = smb_setup_header(server, SMBmv, 1, 0);
- WSET(buf, smb_vwv0, aSYSTEM | aHIDDEN);
+ WSET(server->packet, smb_vwv0, aSYSTEM | aHIDDEN);
*p++ = 4;
p = smb_encode_path(server, p, SMB_INOP(odir), oname, olen);
*p++ = 4;
@@ -825,7 +826,6 @@ smb_proc_rmdir(struct inode *dir, const char *name, const int len)
smb_lock_server(server);
-
retry:
p = smb_setup_header(server, SMBrmdir, 0, 0);
*p++ = 4;
@@ -848,15 +848,13 @@ smb_proc_unlink(struct inode *dir, const char *name, const int len)
{
char *p;
struct smb_server *server = SMB_SERVER(dir);
- char *buf;
int result;
smb_lock_server(server);
- buf = server->packet;
retry:
p = smb_setup_header(server, SMBunlink, 1, 0);
- WSET(buf, smb_vwv0, aSYSTEM | aHIDDEN);
+ WSET(server->packet, smb_vwv0, aSYSTEM | aHIDDEN);
*p++ = 4;
p = smb_encode_path(server, p, SMB_INOP(dir), name, len);
smb_setup_bcc(server, p);
@@ -880,9 +878,9 @@ smb_proc_trunc(struct smb_server *server, word fid, dword length)
int result;
smb_lock_server(server);
- buf = server->packet;
retry:
+ buf = server->packet;
p = smb_setup_header(server, SMBwrite, 5, 0);
WSET(buf, smb_vwv0, fid);
WSET(buf, smb_vwv1, 0);
@@ -1011,9 +1009,9 @@ smb_proc_readdir_short(struct smb_server *server, struct inode *dir, int fpos,
DPRINTK("SMB call readdir %d @ %d\n", cache_size, fpos);
smb_lock_server(server);
- buf = server->packet;
retry:
+ buf = server->packet;
first = 1;
total_count = 0;
current_entry = entry;
@@ -1389,11 +1387,11 @@ smb_proc_getattr_core(struct inode *dir, const char *name, int len,
char *buf;
smb_lock_server(server);
- buf = server->packet;
DDPRINTK("smb_proc_getattr: %s\n", name);
retry:
+ buf = server->packet;
p = smb_setup_header(server, SMBgetatr, 0, 0);
*p++ = 4;
p = smb_encode_path(server, p, SMB_INOP(dir), name, len);
@@ -1512,9 +1510,9 @@ smb_proc_setattr_core(struct smb_server *server,
int result;
smb_lock_server(server);
- buf = server->packet;
retry:
+ buf = server->packet;
p = smb_setup_header(server, SMBsetatr, 8, 0);
WSET(buf, smb_vwv0, new_finfo->attr);
DSET(buf, smb_vwv1, utc2local(new_finfo->f_mtime));
diff --git a/fs/smbfs/sock.c b/fs/smbfs/sock.c
index ca6d8c269..4d85b8e66 100644
--- a/fs/smbfs/sock.c
+++ b/fs/smbfs/sock.c
@@ -15,6 +15,7 @@
#include <linux/net.h>
#include <linux/mm.h>
#include <linux/netdevice.h>
+#include <net/scm.h>
#include <net/ip.h>
#include <linux/smb.h>
@@ -26,42 +27,53 @@
static int
_recvfrom(struct socket *sock, unsigned char *ubuf, int size,
- int noblock, unsigned flags, struct sockaddr_in *sa, int *addr_len)
+ unsigned flags)
{
struct iovec iov;
struct msghdr msg;
+ struct scm_cookie scm;
- iov.iov_base = ubuf;
- iov.iov_len = size;
-
- msg.msg_name = (void *) sa;
+ msg.msg_name = NULL;
msg.msg_namelen = 0;
- if (addr_len)
- msg.msg_namelen = *addr_len;
- msg.msg_control = NULL;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
-
- return sock->ops->recvmsg(sock, &msg, size, noblock, flags, addr_len);
+ msg.msg_control = NULL;
+ iov.iov_base = ubuf;
+ iov.iov_len = size;
+
+ memset(&scm, 0,sizeof(scm));
+ size=sock->ops->recvmsg(sock, &msg, size, flags, &scm);
+ if(size>=0)
+ scm_recv(sock,&msg,&scm,flags);
+ return size;
}
static int
-_send(struct socket *sock, const void *buff, int len,
- int nonblock, unsigned flags)
+_send(struct socket *sock, const void *buff, int len)
{
struct iovec iov;
struct msghdr msg;
-
- iov.iov_base = (void *) buff;
- iov.iov_len = len;
+ struct scm_cookie scm;
+ int err;
msg.msg_name = NULL;
msg.msg_namelen = 0;
- msg.msg_control = NULL;
msg.msg_iov = &iov;
msg.msg_iovlen = 1;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+
+ iov.iov_base = (void *)buff;
+ iov.iov_len = len;
+
+ msg.msg_flags = 0;
- return sock->ops->sendmsg(sock, &msg, len, nonblock, flags);
+ err = scm_send(sock, &msg, &scm);
+ if (err < 0)
+ return err;
+ err = sock->ops->sendmsg(sock, &msg, len, &scm);
+ scm_destroy(&scm);
+ return err;
}
static void
@@ -78,14 +90,14 @@ smb_data_callback(struct sock *sk, int len)
fs = get_fs();
set_fs(get_ds());
- result = _recvfrom(sock, (void *) peek_buf, 1, 1,
- MSG_PEEK, NULL, NULL);
+ result = _recvfrom(sock, (void *) peek_buf, 1,
+ MSG_PEEK | MSG_DONTWAIT);
while ((result != -EAGAIN) && (peek_buf[0] == 0x85))
{
/* got SESSION KEEP ALIVE */
- result = _recvfrom(sock, (void *) peek_buf,
- 4, 1, 0, NULL, NULL);
+ result = _recvfrom(sock, (void *) peek_buf, 4,
+ MSG_DONTWAIT);
DDPRINTK("smb_data_callback:"
" got SESSION KEEP ALIVE\n");
@@ -94,9 +106,8 @@ smb_data_callback(struct sock *sk, int len)
{
break;
}
- result = _recvfrom(sock, (void *) peek_buf,
- 1, 1, MSG_PEEK,
- NULL, NULL);
+ result = _recvfrom(sock, (void *) peek_buf, 1,
+ MSG_PEEK | MSG_DONTWAIT);
}
set_fs(fs);
@@ -132,7 +143,7 @@ smb_catch_keepalive(struct smb_server *server)
server->data_ready = NULL;
return -EINVAL;
}
- sk = (struct sock *) (sock->data);
+ sk = sock->sk;
if (sk == NULL)
{
@@ -178,7 +189,7 @@ smb_dont_catch_keepalive(struct smb_server *server)
printk("smb_dont_catch_keepalive: did not get SOCK_STREAM\n");
return -EINVAL;
}
- sk = (struct sock *) (sock->data);
+ sk = sock->sk;
if (sk == NULL)
{
@@ -216,8 +227,12 @@ smb_send_raw(struct socket *sock, unsigned char *source, int length)
{
result = _send(sock,
(void *) (source + already_sent),
- length - already_sent, 0, 0);
+ length - already_sent);
+ if (result == 0)
+ {
+ return -EIO;
+ }
if (result < 0)
{
DPRINTK("smb_send_raw: sendto error = %d\n",
@@ -239,9 +254,12 @@ smb_receive_raw(struct socket *sock, unsigned char *target, int length)
{
result = _recvfrom(sock,
(void *) (target + already_read),
- length - already_read, 0, 0,
- NULL, NULL);
+ length - already_read, 0);
+ if (result == 0)
+ {
+ return -EIO;
+ }
if (result < 0)
{
DPRINTK("smb_receive_raw: recvfrom error = %d\n",
@@ -369,7 +387,6 @@ smb_receive_trans2(struct smb_server *server,
int total_data = 0;
int total_param = 0;
int result;
- unsigned char *inbuf = server->packet;
unsigned char *rcv_buf;
int buf_len;
int data_len = 0;
@@ -385,8 +402,8 @@ smb_receive_trans2(struct smb_server *server,
*ldata = *lparam = 0;
return 0;
}
- total_data = WVAL(inbuf, smb_tdrcnt);
- total_param = WVAL(inbuf, smb_tprcnt);
+ total_data = WVAL(server->packet, smb_tdrcnt);
+ total_param = WVAL(server->packet, smb_tprcnt);
DDPRINTK("smb_receive_trans2: td=%d,tp=%d\n", total_data, total_param);
@@ -411,6 +428,8 @@ smb_receive_trans2(struct smb_server *server,
while (1)
{
+ unsigned char *inbuf = server->packet;
+
if (WVAL(inbuf, smb_prdisp) + WVAL(inbuf, smb_prcnt)
> total_param)
{
@@ -480,6 +499,8 @@ smb_receive_trans2(struct smb_server *server,
return result;
}
+extern struct net_proto_family inet_family_ops;
+
int
smb_release(struct smb_server *server)
{
@@ -498,8 +519,8 @@ smb_release(struct smb_server *server)
is nothing behind it, so I set it to SS_UNCONNECTED. */
sock->state = SS_UNCONNECTED;
- result = sock->ops->create(sock, 0);
- DPRINTK("smb_release: sock->ops->create = %d\n", result);
+ result = inet_family_ops.create(sock, 0);
+ DPRINTK("smb_release: inet_create = %d\n", result);
return result;
}
@@ -588,6 +609,8 @@ smb_send_trans2(struct smb_server *server, __u16 trans2_command,
int lparam, unsigned char *param)
{
struct socket *sock = server_sock(server);
+ struct scm_cookie scm;
+ int err;
/* I know the following is very ugly, but I want to build the
smb packet as efficiently as possible. */
@@ -632,6 +655,15 @@ smb_send_trans2(struct smb_server *server, __u16 trans2_command,
*p++ = 'D'; /* this was added because OS/2 does it */
*p++ = ' ';
+
+ msg.msg_name = NULL;
+ msg.msg_namelen = 0;
+ msg.msg_control = NULL;
+ msg.msg_controllen = 0;
+ msg.msg_iov = iov;
+ msg.msg_iovlen = 4;
+ msg.msg_flags = 0;
+
iov[0].iov_base = (void *) server->packet;
iov[0].iov_len = oparam;
iov[1].iov_base = (param == NULL) ? padding : param;
@@ -641,13 +673,13 @@ smb_send_trans2(struct smb_server *server, __u16 trans2_command,
iov[3].iov_base = (data == NULL) ? padding : data;
iov[3].iov_len = ldata;
- msg.msg_name = NULL;
- msg.msg_namelen = 0;
- msg.msg_control = NULL;
- msg.msg_iov = iov;
- msg.msg_iovlen = 4;
-
- return sock->ops->sendmsg(sock, &msg, packet_length, 0, 0);
+ err = scm_send(sock, &msg, &scm);
+ if (err < 0)
+ return err;
+
+ err = sock->ops->sendmsg(sock, &msg, packet_length, &scm);
+ scm_destroy(&scm);
+ return err;
}
/*