Merge pull request #273 from Dennisbonke/hexchat

Various fixes for hexchat
This commit is contained in:
Geert Custers 2021-10-26 12:04:50 +02:00 committed by GitHub
commit 1bc2eb86cb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 51 additions and 16 deletions

View file

@ -62,14 +62,17 @@ int timespec_get(struct timespec *ts, int base) {
return ret < 0 ? 0 : base; return ret < 0 ? 0 : base;
} }
char *asctime(const struct tm *) { char *asctime(const struct tm *ptr) {
__ensure(!"Not implemented"); static char buf[26];
__builtin_unreachable(); return asctime_r(ptr, buf);
} }
char *ctime(const time_t *) { char *ctime(const time_t *timer) {
__ensure(!"Not implemented"); struct tm *tm = localtime(timer);
__builtin_unreachable(); if(!tm) {
return 0;
}
return asctime(tm);
} }
struct tm *gmtime(const time_t *unix_gmt) { struct tm *gmtime(const time_t *unix_gmt) {
@ -553,14 +556,26 @@ struct tm *localtime_r(const time_t *unix_gmt, struct tm *res) {
return res; return res;
} }
char *asctime_r(const struct tm *, char *) { // This implementation of asctime_r is taken from sortix
__ensure(!"Not implemented"); char *asctime_r(const struct tm *tm, char *buf) {
__builtin_unreachable(); static char weekday_names[7][4] =
{ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
static char month_names[12][4] =
{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct",
"Nov", "Dec" };
sprintf(buf, "%.3s %.3s%3d %.2d:%.2d%.2d %d\n",
weekday_names[tm->tm_wday],
month_names[tm->tm_mon],
tm->tm_mday,
tm->tm_hour,
tm->tm_min,
tm->tm_sec,
tm->tm_year + 1900);
return buf;
} }
char *ctime_r(const time_t *, char *) { char *ctime_r(const time_t *clock, char *buf) {
__ensure(!"Not implemented"); return asctime_r(localtime(clock), buf);
__builtin_unreachable();
} }
char *strptime(const char *__restrict, const char *__restrict, char *strptime(const char *__restrict, const char *__restrict,

View file

@ -951,9 +951,13 @@ int sys_socket(int domain, int type_and_flags, int proto, int *fd) {
managarm::posix::SvrResponse<MemoryAllocator> resp(getSysdepsAllocator()); managarm::posix::SvrResponse<MemoryAllocator> resp(getSysdepsAllocator());
resp.ParseFromArray(recvResp.data(), recvResp.length()); resp.ParseFromArray(recvResp.data(), recvResp.length());
__ensure(resp.error() == managarm::posix::Errors::SUCCESS); if(resp.error() == managarm::posix::Errors::ILLEGAL_ARGUMENTS) {
*fd = resp.fd(); return EAFNOSUPPORT;
return 0; } else {
__ensure(resp.error() == managarm::posix::Errors::SUCCESS);
*fd = resp.fd();
return 0;
}
} }
int sys_pipe(int *fds, int flags) { int sys_pipe(int *fds, int flags) {
@ -1120,6 +1124,16 @@ int sys_msg_send(int sockfd, const struct msghdr *hdr, int flags, ssize_t *lengt
return ENOTCONN; return ENOTCONN;
}else if(resp.error() == managarm::fs::Errors::WOULD_BLOCK) { }else if(resp.error() == managarm::fs::Errors::WOULD_BLOCK) {
return EAGAIN; return EAGAIN;
}else if(resp.error() == managarm::fs::Errors::HOST_UNREACHABLE) {
return EHOSTUNREACH;
}else if(resp.error() == managarm::fs::Errors::ACCESS_DENIED) {
return EACCES;
}else if(resp.error() == managarm::fs::Errors::NETWORK_UNREACHABLE) {
return ENETUNREACH;
}else if(resp.error() == managarm::fs::Errors::DESTINATION_ADDRESS_REQUIRED) {
return EDESTADDRREQ;
}else if(resp.error() == managarm::fs::Errors::ADDRESS_NOT_AVAILABLE) {
return EADDRNOTAVAIL;
}else{ }else{
__ensure(resp.error() == managarm::fs::Errors::SUCCESS); __ensure(resp.error() == managarm::fs::Errors::SUCCESS);
*length = resp.size(); *length = resp.size();

View file

@ -169,11 +169,14 @@ int sys_sockname(int fd, struct sockaddr *addr_ptr, socklen_t max_addr_length,
HEL_CHECK(offer->error); HEL_CHECK(offer->error);
HEL_CHECK(send_req->error); HEL_CHECK(send_req->error);
HEL_CHECK(recv_resp->error); HEL_CHECK(recv_resp->error);
HEL_CHECK(recv_addr->error);
managarm::fs::SvrResponse<MemoryAllocator> resp(getSysdepsAllocator()); managarm::fs::SvrResponse<MemoryAllocator> resp(getSysdepsAllocator());
resp.ParseFromArray(recv_resp->data, recv_resp->length); resp.ParseFromArray(recv_resp->data, recv_resp->length);
if(resp.error() == managarm::fs::Errors::ILLEGAL_OPERATION_TARGET) {
return ENOTSOCK;
}
__ensure(resp.error() == managarm::fs::Errors::SUCCESS); __ensure(resp.error() == managarm::fs::Errors::SUCCESS);
HEL_CHECK(recv_addr->error);
*actual_length = resp.file_size(); *actual_length = resp.file_size();
return 0; return 0;
} }
@ -342,6 +345,9 @@ int sys_setsockopt(int fd, int layer, int number,
}else if(layer == SOL_SOCKET && number == SO_KEEPALIVE) { }else if(layer == SOL_SOCKET && number == SO_KEEPALIVE) {
mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_KEEPALIVE is unimplemented\e[39m" << frg::endlog; mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_KEEPALIVE is unimplemented\e[39m" << frg::endlog;
return 0; return 0;
}else if(layer == SOL_SOCKET && number == SO_REUSEADDR) {
mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with SOL_SOCKET and SO_REUSEADDR is unimplemented\e[39m" << frg::endlog;
return 0;
}else if(layer == AF_NETLINK && number == SO_ACCEPTCONN) { }else if(layer == AF_NETLINK && number == SO_ACCEPTCONN) {
mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with AF_NETLINK and SO_ACCEPTCONN is unimplemented\e[39m" << frg::endlog; mlibc::infoLogger() << "\e[31mmlibc: setsockopt() call with AF_NETLINK and SO_ACCEPTCONN is unimplemented\e[39m" << frg::endlog;
return 0; return 0;