aboutsummaryrefslogtreecommitdiffstats
path: root/fs/cifs
diff options
context:
space:
mode:
authorSteve French <sfrench@us.ibm.com>2006-05-31 14:05:34 -0400
committerSteve French <sfrench@us.ibm.com>2006-05-31 14:05:34 -0400
commit26a21b980b1897b11fd7f9ba4bf6060c9e15df10 (patch)
treec56627f5ced7e016a4a9ec388a479270226cce27 /fs/cifs
parente6ed89ac9f5da16fea5111651b6de0ff0a76a5c2 (diff)
[CIFS] Cleanup extra whitespace in dmesg logging. Update cifs change log
Diffstat (limited to 'fs/cifs')
-rw-r--r--fs/cifs/CHANGES5
-rw-r--r--fs/cifs/asn1.c10
-rw-r--r--fs/cifs/cifssmb.c2
-rw-r--r--fs/cifs/dir.c2
-rw-r--r--fs/cifs/file.c18
-rw-r--r--fs/cifs/inode.c24
-rw-r--r--fs/cifs/link.c7
-rw-r--r--fs/cifs/readdir.c2
-rw-r--r--fs/cifs/transport.c3
9 files changed, 37 insertions, 36 deletions
diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
index 7271bb0257f6..953d2f7f88b0 100644
--- a/fs/cifs/CHANGES
+++ b/fs/cifs/CHANGES
@@ -3,7 +3,10 @@ Version 1.43
3POSIX locking to servers which support CIFS POSIX Extensions 3POSIX locking to servers which support CIFS POSIX Extensions
4(disabled by default controlled by proc/fs/cifs/Experimental). 4(disabled by default controlled by proc/fs/cifs/Experimental).
5Handle conversion of long share names (especially Asian languages) 5Handle conversion of long share names (especially Asian languages)
6to Unicode during mount. 6to Unicode during mount. Fix memory leak in sess struct on reconnect.
7Fix rare oops after acpi suspend. Fix O_TRUNC opens to overwrite on
8cifs open which helps rare case when setpathinfo fails or server does
9not support it.
7 10
8Version 1.42 11Version 1.42
9------------ 12------------
diff --git a/fs/cifs/asn1.c b/fs/cifs/asn1.c
index 086ae8f4a207..031cdf293256 100644
--- a/fs/cifs/asn1.c
+++ b/fs/cifs/asn1.c
@@ -467,7 +467,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
467 asn1_open(&ctx, security_blob, length); 467 asn1_open(&ctx, security_blob, length);
468 468
469 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { 469 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
470 cFYI(1, ("Error decoding negTokenInit header ")); 470 cFYI(1, ("Error decoding negTokenInit header"));
471 return 0; 471 return 0;
472 } else if ((cls != ASN1_APL) || (con != ASN1_CON) 472 } else if ((cls != ASN1_APL) || (con != ASN1_CON)
473 || (tag != ASN1_EOC)) { 473 || (tag != ASN1_EOC)) {
@@ -495,7 +495,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
495 } 495 }
496 496
497 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { 497 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
498 cFYI(1, ("Error decoding negTokenInit ")); 498 cFYI(1, ("Error decoding negTokenInit"));
499 return 0; 499 return 0;
500 } else if ((cls != ASN1_CTX) || (con != ASN1_CON) 500 } else if ((cls != ASN1_CTX) || (con != ASN1_CON)
501 || (tag != ASN1_EOC)) { 501 || (tag != ASN1_EOC)) {
@@ -505,7 +505,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
505 } 505 }
506 506
507 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { 507 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
508 cFYI(1, ("Error decoding negTokenInit ")); 508 cFYI(1, ("Error decoding negTokenInit"));
509 return 0; 509 return 0;
510 } else if ((cls != ASN1_UNI) || (con != ASN1_CON) 510 } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
511 || (tag != ASN1_SEQ)) { 511 || (tag != ASN1_SEQ)) {
@@ -515,7 +515,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
515 } 515 }
516 516
517 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) { 517 if (asn1_header_decode(&ctx, &end, &cls, &con, &tag) == 0) {
518 cFYI(1, ("Error decoding 2nd part of negTokenInit ")); 518 cFYI(1, ("Error decoding 2nd part of negTokenInit"));
519 return 0; 519 return 0;
520 } else if ((cls != ASN1_CTX) || (con != ASN1_CON) 520 } else if ((cls != ASN1_CTX) || (con != ASN1_CON)
521 || (tag != ASN1_EOC)) { 521 || (tag != ASN1_EOC)) {
@@ -527,7 +527,7 @@ decode_negTokenInit(unsigned char *security_blob, int length,
527 527
528 if (asn1_header_decode 528 if (asn1_header_decode
529 (&ctx, &sequence_end, &cls, &con, &tag) == 0) { 529 (&ctx, &sequence_end, &cls, &con, &tag) == 0) {
530 cFYI(1, ("Error decoding 2nd part of negTokenInit ")); 530 cFYI(1, ("Error decoding 2nd part of negTokenInit"));
531 return 0; 531 return 0;
532 } else if ((cls != ASN1_UNI) || (con != ASN1_CON) 532 } else if ((cls != ASN1_UNI) || (con != ASN1_CON)
533 || (tag != ASN1_SEQ)) { 533 || (tag != ASN1_SEQ)) {
diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
index 925881e00ff2..f00369277c06 100644
--- a/fs/cifs/cifssmb.c
+++ b/fs/cifs/cifssmb.c
@@ -2239,7 +2239,7 @@ CIFSSMBQueryReparseLinkInfo(const int xid, struct cifsTconInfo *tcon,
2239 } 2239 }
2240 symlinkinfo[buflen] = 0; /* just in case so the caller 2240 symlinkinfo[buflen] = 0; /* just in case so the caller
2241 does not go off the end of the buffer */ 2241 does not go off the end of the buffer */
2242 cFYI(1,("readlink result - %s ",symlinkinfo)); 2242 cFYI(1,("readlink result - %s",symlinkinfo));
2243 } 2243 }
2244 } 2244 }
2245qreparse_out: 2245qreparse_out:
diff --git a/fs/cifs/dir.c b/fs/cifs/dir.c
index 82315edc77d7..57bdf7f734bf 100644
--- a/fs/cifs/dir.c
+++ b/fs/cifs/dir.c
@@ -191,7 +191,7 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
191 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 191 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
192 } 192 }
193 if (rc) { 193 if (rc) {
194 cFYI(1, ("cifs_create returned 0x%x ", rc)); 194 cFYI(1, ("cifs_create returned 0x%x", rc));
195 } else { 195 } else {
196 /* If Open reported that we actually created a file 196 /* If Open reported that we actually created a file
197 then we now have to set the mode if possible */ 197 then we now have to set the mode if possible */
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index e2b4ce1dad66..379369ecda96 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -201,7 +201,7 @@ int cifs_open(struct inode *inode, struct file *file)
201 } else { 201 } else {
202 if (file->f_flags & O_EXCL) 202 if (file->f_flags & O_EXCL)
203 cERROR(1, ("could not find file instance for " 203 cERROR(1, ("could not find file instance for "
204 "new file %p ", file)); 204 "new file %p", file));
205 } 205 }
206 } 206 }
207 207
@@ -272,7 +272,7 @@ int cifs_open(struct inode *inode, struct file *file)
272 & CIFS_MOUNT_MAP_SPECIAL_CHR); 272 & CIFS_MOUNT_MAP_SPECIAL_CHR);
273 } 273 }
274 if (rc) { 274 if (rc) {
275 cFYI(1, ("cifs_open returned 0x%x ", rc)); 275 cFYI(1, ("cifs_open returned 0x%x", rc));
276 goto out; 276 goto out;
277 } 277 }
278 file->private_data = 278 file->private_data =
@@ -409,8 +409,8 @@ static int cifs_reopen_file(struct inode *inode, struct file *file,
409 CIFS_MOUNT_MAP_SPECIAL_CHR); 409 CIFS_MOUNT_MAP_SPECIAL_CHR);
410 if (rc) { 410 if (rc) {
411 up(&pCifsFile->fh_sem); 411 up(&pCifsFile->fh_sem);
412 cFYI(1, ("cifs_open returned 0x%x ", rc)); 412 cFYI(1, ("cifs_open returned 0x%x", rc));
413 cFYI(1, ("oplock: %d ", oplock)); 413 cFYI(1, ("oplock: %d", oplock));
414 } else { 414 } else {
415 pCifsFile->netfid = netfid; 415 pCifsFile->netfid = netfid;
416 pCifsFile->invalidHandle = FALSE; 416 pCifsFile->invalidHandle = FALSE;
@@ -531,7 +531,7 @@ int cifs_closedir(struct inode *inode, struct file *file)
531 (struct cifsFileInfo *)file->private_data; 531 (struct cifsFileInfo *)file->private_data;
532 char *ptmp; 532 char *ptmp;
533 533
534 cFYI(1, ("Closedir inode = 0x%p with ", inode)); 534 cFYI(1, ("Closedir inode = 0x%p", inode));
535 535
536 xid = GetXid(); 536 xid = GetXid();
537 537
@@ -605,7 +605,7 @@ int cifs_lock(struct file *file, int cmd, struct file_lock *pfLock)
605 } 605 }
606 if (pfLock->fl_flags & FL_ACCESS) 606 if (pfLock->fl_flags & FL_ACCESS)
607 cFYI(1, ("Process suspended by mandatory locking - " 607 cFYI(1, ("Process suspended by mandatory locking - "
608 "not implemented yet ")); 608 "not implemented yet"));
609 if (pfLock->fl_flags & FL_LEASE) 609 if (pfLock->fl_flags & FL_LEASE)
610 cFYI(1, ("Lease on file - not implemented yet")); 610 cFYI(1, ("Lease on file - not implemented yet"));
611 if (pfLock->fl_flags & 611 if (pfLock->fl_flags &
@@ -1377,7 +1377,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
1377 1377
1378 xid = GetXid(); 1378 xid = GetXid();
1379 1379
1380 cFYI(1, ("Sync file - name: %s datasync: 0x%x ", 1380 cFYI(1, ("Sync file - name: %s datasync: 0x%x",
1381 dentry->d_name.name, datasync)); 1381 dentry->d_name.name, datasync));
1382 1382
1383 rc = filemap_fdatawrite(inode->i_mapping); 1383 rc = filemap_fdatawrite(inode->i_mapping);
@@ -1406,7 +1406,7 @@ int cifs_fsync(struct file *file, struct dentry *dentry, int datasync)
1406/* fill in rpages then 1406/* fill in rpages then
1407 result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */ 1407 result = cifs_pagein_inode(inode, index, rpages); */ /* BB finish */
1408 1408
1409/* cFYI(1, ("rpages is %d for sync page of Index %ld ", rpages, index)); 1409/* cFYI(1, ("rpages is %d for sync page of Index %ld", rpages, index));
1410 1410
1411#if 0 1411#if 0
1412 if (rc < 0) 1412 if (rc < 0)
@@ -1838,7 +1838,7 @@ static int cifs_readpage_worker(struct file *file, struct page *page,
1838 if (rc < 0) 1838 if (rc < 0)
1839 goto io_error; 1839 goto io_error;
1840 else 1840 else
1841 cFYI(1, ("Bytes read %d ",rc)); 1841 cFYI(1, ("Bytes read %d",rc));
1842 1842
1843 file->f_dentry->d_inode->i_atime = 1843 file->f_dentry->d_inode->i_atime =
1844 current_fs_time(file->f_dentry->d_inode->i_sb); 1844 current_fs_time(file->f_dentry->d_inode->i_sb);
diff --git a/fs/cifs/inode.c b/fs/cifs/inode.c
index 4093764ef461..77a9e2f912fd 100644
--- a/fs/cifs/inode.c
+++ b/fs/cifs/inode.c
@@ -41,7 +41,7 @@ int cifs_get_inode_info_unix(struct inode **pinode,
41 char *tmp_path; 41 char *tmp_path;
42 42
43 pTcon = cifs_sb->tcon; 43 pTcon = cifs_sb->tcon;
44 cFYI(1, ("Getting info on %s ", search_path)); 44 cFYI(1, ("Getting info on %s", search_path));
45 /* could have done a find first instead but this returns more info */ 45 /* could have done a find first instead but this returns more info */
46 rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData, 46 rc = CIFSSMBUnixQPathInfo(xid, pTcon, search_path, &findData,
47 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags & 47 cifs_sb->local_nls, cifs_sb->mnt_cifs_flags &
@@ -97,9 +97,9 @@ int cifs_get_inode_info_unix(struct inode **pinode,
97 inode = *pinode; 97 inode = *pinode;
98 cifsInfo = CIFS_I(inode); 98 cifsInfo = CIFS_I(inode);
99 99
100 cFYI(1, ("Old time %ld ", cifsInfo->time)); 100 cFYI(1, ("Old time %ld", cifsInfo->time));
101 cifsInfo->time = jiffies; 101 cifsInfo->time = jiffies;
102 cFYI(1, ("New time %ld ", cifsInfo->time)); 102 cFYI(1, ("New time %ld", cifsInfo->time));
103 /* this is ok to set on every inode revalidate */ 103 /* this is ok to set on every inode revalidate */
104 atomic_set(&cifsInfo->inUse,1); 104 atomic_set(&cifsInfo->inUse,1);
105 105
@@ -421,23 +421,23 @@ int cifs_get_inode_info(struct inode **pinode,
421 inode = *pinode; 421 inode = *pinode;
422 cifsInfo = CIFS_I(inode); 422 cifsInfo = CIFS_I(inode);
423 cifsInfo->cifsAttrs = attr; 423 cifsInfo->cifsAttrs = attr;
424 cFYI(1, ("Old time %ld ", cifsInfo->time)); 424 cFYI(1, ("Old time %ld", cifsInfo->time));
425 cifsInfo->time = jiffies; 425 cifsInfo->time = jiffies;
426 cFYI(1, ("New time %ld ", cifsInfo->time)); 426 cFYI(1, ("New time %ld", cifsInfo->time));
427 427
428 /* blksize needs to be multiple of two. So safer to default to 428 /* blksize needs to be multiple of two. So safer to default to
429 blksize and blkbits set in superblock so 2**blkbits and blksize 429 blksize and blkbits set in superblock so 2**blkbits and blksize
430 will match rather than setting to: 430 will match rather than setting to:
431 (pTcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) & 0xFFFFFE00;*/ 431 (pTcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE) & 0xFFFFFE00;*/
432 432
433 /* Linux can not store file creation time unfortunately so we ignore it */ 433 /* Linux can not store file creation time so ignore it */
434 inode->i_atime = 434 inode->i_atime =
435 cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastAccessTime)); 435 cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastAccessTime));
436 inode->i_mtime = 436 inode->i_mtime =
437 cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastWriteTime)); 437 cifs_NTtimeToUnix(le64_to_cpu(pfindData->LastWriteTime));
438 inode->i_ctime = 438 inode->i_ctime =
439 cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime)); 439 cifs_NTtimeToUnix(le64_to_cpu(pfindData->ChangeTime));
440 cFYI(0, ("Attributes came in as 0x%x ", attr)); 440 cFYI(0, ("Attributes came in as 0x%x", attr));
441 441
442 /* set default mode. will override for dirs below */ 442 /* set default mode. will override for dirs below */
443 if (atomic_read(&cifsInfo->inUse) == 0) 443 if (atomic_read(&cifsInfo->inUse) == 0)
@@ -731,7 +731,7 @@ int cifs_mkdir(struct inode *inode, struct dentry *direntry, int mode)
731 rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls, 731 rc = CIFSSMBMkDir(xid, pTcon, full_path, cifs_sb->local_nls,
732 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); 732 cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR);
733 if (rc) { 733 if (rc) {
734 cFYI(1, ("cifs_mkdir returned 0x%x ", rc)); 734 cFYI(1, ("cifs_mkdir returned 0x%x", rc));
735 d_drop(direntry); 735 d_drop(direntry);
736 } else { 736 } else {
737 inode->i_nlink++; 737 inode->i_nlink++;
@@ -798,7 +798,7 @@ int cifs_rmdir(struct inode *inode, struct dentry *direntry)
798 char *full_path = NULL; 798 char *full_path = NULL;
799 struct cifsInodeInfo *cifsInode; 799 struct cifsInodeInfo *cifsInode;
800 800
801 cFYI(1, ("cifs_rmdir, inode = 0x%p with ", inode)); 801 cFYI(1, ("cifs_rmdir, inode = 0x%p", inode));
802 802
803 xid = GetXid(); 803 xid = GetXid();
804 804
@@ -1121,7 +1121,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
1121 1121
1122 xid = GetXid(); 1122 xid = GetXid();
1123 1123
1124 cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x ", 1124 cFYI(1, ("In cifs_setattr, name = %s attrs->iavalid 0x%x",
1125 direntry->d_name.name, attrs->ia_valid)); 1125 direntry->d_name.name, attrs->ia_valid));
1126 1126
1127 cifs_sb = CIFS_SB(direntry->d_inode->i_sb); 1127 cifs_sb = CIFS_SB(direntry->d_inode->i_sb);
@@ -1289,7 +1289,7 @@ int cifs_setattr(struct dentry *direntry, struct iattr *attrs)
1289 it may be useful to Windows - but we do 1289 it may be useful to Windows - but we do
1290 not want to set ctime unless some other 1290 not want to set ctime unless some other
1291 timestamp is changing */ 1291 timestamp is changing */
1292 cFYI(1, ("CIFS - CTIME changed ")); 1292 cFYI(1, ("CIFS - CTIME changed"));
1293 time_buf.ChangeTime = 1293 time_buf.ChangeTime =
1294 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime)); 1294 cpu_to_le64(cifs_UnixTimeToNT(attrs->ia_ctime));
1295 } else 1295 } else
@@ -1356,7 +1356,7 @@ cifs_setattr_exit:
1356 1356
1357void cifs_delete_inode(struct inode *inode) 1357void cifs_delete_inode(struct inode *inode)
1358{ 1358{
1359 cFYI(1, ("In cifs_delete_inode, inode = 0x%p ", inode)); 1359 cFYI(1, ("In cifs_delete_inode, inode = 0x%p", inode));
1360 /* may have to add back in if and when safe distributed caching of 1360 /* may have to add back in if and when safe distributed caching of
1361 directories added e.g. via FindNotify */ 1361 directories added e.g. via FindNotify */
1362} 1362}
diff --git a/fs/cifs/link.c b/fs/cifs/link.c
index 2ec99f833142..a57f5d6e6213 100644
--- a/fs/cifs/link.c
+++ b/fs/cifs/link.c
@@ -167,7 +167,7 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
167 return -ENOMEM; 167 return -ENOMEM;
168 } 168 }
169 169
170 cFYI(1, ("Full path: %s ", full_path)); 170 cFYI(1, ("Full path: %s", full_path));
171 cFYI(1, ("symname is %s", symname)); 171 cFYI(1, ("symname is %s", symname));
172 172
173 /* BB what if DFS and this volume is on different share? BB */ 173 /* BB what if DFS and this volume is on different share? BB */
@@ -186,8 +186,7 @@ cifs_symlink(struct inode *inode, struct dentry *direntry, const char *symname)
186 inode->i_sb,xid); 186 inode->i_sb,xid);
187 187
188 if (rc != 0) { 188 if (rc != 0) {
189 cFYI(1, 189 cFYI(1, ("Create symlink ok, getinodeinfo fail rc = %d",
190 ("Create symlink worked but get_inode_info failed with rc = %d ",
191 rc)); 190 rc));
192 } else { 191 } else {
193 if (pTcon->nocase) 192 if (pTcon->nocase)
@@ -289,7 +288,7 @@ cifs_readlink(struct dentry *direntry, char __user *pBuffer, int buflen)
289 else { 288 else {
290 cFYI(1,("num referral: %d",num_referrals)); 289 cFYI(1,("num referral: %d",num_referrals));
291 if(referrals) { 290 if(referrals) {
292 cFYI(1,("referral string: %s ",referrals)); 291 cFYI(1,("referral string: %s",referrals));
293 strncpy(tmpbuffer, referrals, len-1); 292 strncpy(tmpbuffer, referrals, len-1);
294 } 293 }
295 } 294 }
diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
index b689c5035124..6b36c43d38f5 100644
--- a/fs/cifs/readdir.c
+++ b/fs/cifs/readdir.c
@@ -909,7 +909,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
909 case 1: 909 case 1:
910 if (filldir(direntry, "..", 2, file->f_pos, 910 if (filldir(direntry, "..", 2, file->f_pos,
911 file->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) { 911 file->f_dentry->d_parent->d_inode->i_ino, DT_DIR) < 0) {
912 cERROR(1, ("Filldir for parent dir failed ")); 912 cERROR(1, ("Filldir for parent dir failed"));
913 rc = -ENOMEM; 913 rc = -ENOMEM;
914 break; 914 break;
915 } 915 }
diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
index 3da80409466c..17ba329e2b3d 100644
--- a/fs/cifs/transport.c
+++ b/fs/cifs/transport.c
@@ -654,8 +654,7 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
654 654
655 if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) { 655 if (in_buf->smb_buf_length > CIFSMaxBufSize + MAX_CIFS_HDR_SIZE - 4) {
656 up(&ses->server->tcpSem); 656 up(&ses->server->tcpSem);
657 cERROR(1, 657 cERROR(1, ("Illegal length, greater than maximum frame, %d",
658 ("Illegal length, greater than maximum frame, %d ",
659 in_buf->smb_buf_length)); 658 in_buf->smb_buf_length));
660 DeleteMidQEntry(midQ); 659 DeleteMidQEntry(midQ);
661 /* If not lock req, update # of requests on wire to server */ 660 /* If not lock req, update # of requests on wire to server */