Use getsockopt() and setsockopt() from FreeBSD

This commit is contained in:
Sebastian Huber
2013-10-14 12:53:43 +02:00
parent 7c2b59c831
commit ac78dd2440
5 changed files with 182 additions and 137 deletions

View File

@@ -1486,10 +1486,18 @@ shutdown(int socket, int how)
}
#endif /* __rtems__ */
#ifndef __rtems__
/* ARGSUSED */
#ifndef __rtems__
int
setsockopt(td, uap)
#else /* __rtems__ */
static int
kern_setsockopt( struct thread *td, int s, int level, int name, void *val,
enum uio_seg valseg, socklen_t valsize);
static int
rtems_bsd_setsockopt(td, uap)
#endif /* __rtems__ */
struct thread *td;
struct setsockopt_args /* {
int s;
@@ -1503,6 +1511,30 @@ setsockopt(td, uap)
return (kern_setsockopt(td, uap->s, uap->level, uap->name,
uap->val, UIO_USERSPACE, uap->valsize));
}
#ifdef __rtems__
int
setsockopt(int socket, int level, int option_name, const void *option_value,
socklen_t option_len)
{
struct thread *td = rtems_bsd_get_curthread_or_null();
struct setsockopt_args ua = {
.s = socket,
.level = level,
.name = option_name,
.val = __DECONST(void *, option_value),
.valsize = option_len
};
int error;
if (td != NULL) {
error = rtems_bsd_setsockopt(td, &ua);
} else {
error = ENOMEM;
}
return rtems_bsd_error_to_status_and_errno(error);
}
#endif /* __rtems__ */
int
kern_setsockopt(td, s, level, name, val, valseg, valsize)
@@ -1553,8 +1585,17 @@ kern_setsockopt(td, s, level, name, val, valseg, valsize)
}
/* ARGSUSED */
#ifndef __rtems__
int
getsockopt(td, uap)
#else /* __rtems__ */
static int
kern_getsockopt( struct thread *td, int s, int level, int name, void *val,
enum uio_seg valseg, socklen_t *valsize);
static int
rtems_bsd_getsockopt(td, uap)
#endif /* __rtems__ */
struct thread *td;
struct getsockopt_args /* {
int s;
@@ -1580,6 +1621,30 @@ getsockopt(td, uap)
error = copyout(&valsize, uap->avalsize, sizeof (valsize));
return (error);
}
#ifdef __rtems__
int
getsockopt(int socket, int level, int option_name, void *__restrict
option_value, socklen_t *__restrict option_len)
{
struct thread *td = rtems_bsd_get_curthread_or_null();
struct getsockopt_args ua = {
.s = socket,
.level = level,
.name = option_name,
.val = (caddr_t) option_value,
.avalsize = option_len
};
int error;
if (td != NULL) {
error = rtems_bsd_getsockopt(td, &ua);
} else {
error = ENOMEM;
}
return rtems_bsd_error_to_status_and_errno(error);
}
#endif /* __rtems__ */
/*
* Kernel version of getsockopt.
@@ -1634,6 +1699,7 @@ kern_getsockopt(td, s, level, name, val, valseg, valsize)
return (error);
}
#ifndef __rtems__
/*
* getsockname1() - Get socket name.
*/

View File

@@ -382,15 +382,17 @@ struct bind_args {
char namelen_l_[PADL_(__socklen_t)]; __socklen_t namelen; char namelen_r_[PADR_(__socklen_t)];
#endif /* __rtems__ */
};
#ifndef __rtems__
struct setsockopt_args {
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
char level_l_[PADL_(int)]; int level; char level_r_[PADR_(int)];
char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)];
char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)];
#ifndef __rtems__
char valsize_l_[PADL_(int)]; int valsize; char valsize_r_[PADR_(int)];
};
#else /* __rtems__ */
char valsize_l_[PADL_(__socklen_t)]; __socklen_t valsize; char valsize_r_[PADR_(__socklen_t)];
#endif /* __rtems__ */
};
struct listen_args {
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
char backlog_l_[PADL_(int)]; int backlog; char backlog_r_[PADR_(int)];
@@ -404,13 +406,19 @@ struct getrusage_args {
char who_l_[PADL_(int)]; int who; char who_r_[PADR_(int)];
char rusage_l_[PADL_(struct rusage *)]; struct rusage * rusage; char rusage_r_[PADR_(struct rusage *)];
};
#endif /* __rtems__ */
struct getsockopt_args {
char s_l_[PADL_(int)]; int s; char s_r_[PADR_(int)];
char level_l_[PADL_(int)]; int level; char level_r_[PADR_(int)];
char name_l_[PADL_(int)]; int name; char name_r_[PADR_(int)];
char val_l_[PADL_(caddr_t)]; caddr_t val; char val_r_[PADR_(caddr_t)];
#ifndef __rtems__
char avalsize_l_[PADL_(int *)]; int * avalsize; char avalsize_r_[PADR_(int *)];
#else /* __rtems__ */
char avalsize_l_[PADL_(__socklen_t *)]; __socklen_t * avalsize; char avalsize_r_[PADR_(__socklen_t *)];
#endif /* __rtems__ */
};
#ifndef __rtems__
struct readv_args {
char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)];
char iovp_l_[PADL_(struct iovec *)]; struct iovec * iovp; char iovp_r_[PADR_(struct iovec *)];