[BACK]Return to uipc_syscalls.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / kern

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/kern/uipc_syscalls.c between version 1.133 and 1.134

version 1.133, 2008/06/24 11:21:46 version 1.134, 2008/08/06 15:01:23
Line 887  sys_setsockopt(struct lwp *l, const stru
Line 887  sys_setsockopt(struct lwp *l, const stru
                 syscallarg(const void *)        val;                  syscallarg(const void *)        val;
                 syscallarg(unsigned int)        valsize;                  syscallarg(unsigned int)        valsize;
         } */          } */
         struct proc     *p;          struct sockopt  sopt;
         struct mbuf     *m;  
         struct socket   *so;          struct socket   *so;
         int             error;          int             error;
         unsigned int    len;          unsigned int    len;
   
         p = l->l_proc;          len = SCARG(uap, valsize);
         m = NULL;          if (len > 0 && SCARG(uap, val) == NULL)
                   return (EINVAL);
   
           if (len > MCLBYTES)
                   return (EINVAL);
   
         if ((error = fd_getsock(SCARG(uap, s), &so)) != 0)          if ((error = fd_getsock(SCARG(uap, s), &so)) != 0)
                 return (error);                  return (error);
         len = SCARG(uap, valsize);  
         if (len > MCLBYTES) {          sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), len);
                 error = EINVAL;  
                 goto out;          if (len > 0) {
         }                  error = copyin(SCARG(uap, val), sopt.sopt_data, len);
         if (SCARG(uap, val)) {                  if (error)
                 m = getsombuf(so, MT_SOOPTS);  
                 if (len > MLEN)  
                         m_clget(m, M_WAIT);  
                 error = copyin(SCARG(uap, val), mtod(m, void *), len);  
                 if (error) {  
                         (void) m_free(m);  
                         goto out;                          goto out;
                 }  
                 m->m_len = SCARG(uap, valsize);  
         }          }
         error = sosetopt(so, SCARG(uap, level), SCARG(uap, name), m);  
           error = sosetopt(so, &sopt);
   
  out:   out:
           sockopt_destroy(&sopt);
         fd_putfile(SCARG(uap, s));          fd_putfile(SCARG(uap, s));
         return (error);          return (error);
 }  }
Line 930  sys_getsockopt(struct lwp *l, const stru
Line 929  sys_getsockopt(struct lwp *l, const stru
                 syscallarg(void *)              val;                  syscallarg(void *)              val;
                 syscallarg(unsigned int *)      avalsize;                  syscallarg(unsigned int *)      avalsize;
         } */          } */
           struct sockopt  sopt;
         struct socket   *so;          struct socket   *so;
         struct mbuf     *m;          unsigned int    valsize, len;
         unsigned int    op, i, valsize;  
         int             error;          int             error;
         char *val = SCARG(uap, val);  
   
         m = NULL;          if (SCARG(uap, val) != NULL) {
                   error = copyin(SCARG(uap, avalsize), &valsize, sizeof(valsize));
                   if (error)
                           return (error);
           } else
                   valsize = 0;
   
         if ((error = fd_getsock(SCARG(uap, s), &so)) != 0)          if ((error = fd_getsock(SCARG(uap, s), &so)) != 0)
                 return (error);                  return (error);
         if (val != NULL) {  
                 error = copyin(SCARG(uap, avalsize),          sockopt_init(&sopt, SCARG(uap, level), SCARG(uap, name), 0);
                                &valsize, sizeof(valsize));  
           error = sogetopt(so, &sopt);
           if (error)
                   goto out;
   
           if (valsize > 0) {
                   len = min(valsize, sopt.sopt_size);
                   error = copyout(sopt.sopt_data, SCARG(uap, val), len);
                   if (error)
                           goto out;
   
                   error = copyout(&len, SCARG(uap, avalsize), sizeof(len));
                 if (error)                  if (error)
                         goto out;                          goto out;
         } else  
                 valsize = 0;  
         error = sogetopt(so, SCARG(uap, level), SCARG(uap, name), &m);  
         if (error == 0 && val != NULL && valsize && m != NULL) {  
                 op = 0;  
                 while (m && !error && op < valsize) {  
                         i = min(m->m_len, (valsize - op));  
                         error = copyout(mtod(m, void *), val, i);  
                         op += i;  
                         val += i;  
                         m = m_free(m);  
                 }  
                 valsize = op;  
                 if (error == 0)  
                         error = copyout(&valsize,  
                                         SCARG(uap, avalsize), sizeof(valsize));  
         }          }
         if (m != NULL)  
                 (void) m_freem(m);  
  out:   out:
           sockopt_destroy(&sopt);
         fd_putfile(SCARG(uap, s));          fd_putfile(SCARG(uap, s));
         return (error);          return (error);
 }  }

Legend:
Removed from v.1.133  
changed lines
  Added in v.1.134

CVSweb <webmaster@jp.NetBSD.org>