diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1997-04-29 21:13:14 +0000 |
---|---|---|
committer | <ralf@linux-mips.org> | 1997-04-29 21:13:14 +0000 |
commit | 19c9bba94152148523ba0f7ef7cffe3d45656b11 (patch) | |
tree | 40b1cb534496a7f1ca0f5c314a523c69f1fee464 /fs/smbfs | |
parent | 7206675c40394c78a90e74812bbdbf8cf3cca1be (diff) |
Import of Linux/MIPS 2.1.36
Diffstat (limited to 'fs/smbfs')
-rw-r--r-- | fs/smbfs/dir.c | 2 | ||||
-rw-r--r-- | fs/smbfs/file.c | 2 | ||||
-rw-r--r-- | fs/smbfs/inode.c | 13 | ||||
-rw-r--r-- | fs/smbfs/proc.c | 26 | ||||
-rw-r--r-- | fs/smbfs/sock.c | 114 |
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; } /* |