FreeBSD Bugzilla – Attachment 235123 Details for
Bug 265087
Changes to pipe/socket handling causes configure test program to loop endless
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
Extraced "checking read/send-side pipe system..." C program
configure-read-send-side-test.c (text/plain), 9.05 KB, created by
rz-rpi03
on 2022-07-08 11:10:13 UTC
(
hide
)
Description:
Extraced "checking read/send-side pipe system..." C program
Filename:
MIME Type:
Creator:
rz-rpi03
Created:
2022-07-08 11:10:13 UTC
Size:
9.05 KB
patch
obsolete
>/* confdefs.h */ >#define PACKAGE_NAME "" >#define PACKAGE_TARNAME "" >#define PACKAGE_VERSION "" >#define PACKAGE_STRING "" >#define PACKAGE_BUGREPORT "" >#define PACKAGE_URL "" >#define PACKAGE "dante" >#define VERSION "1.4.3" >#define STDC_HEADERS 1 >#define HAVE_SYS_TYPES_H 1 >#define HAVE_SYS_STAT_H 1 >#define HAVE_STDLIB_H 1 >#define HAVE_STRING_H 1 >#define HAVE_MEMORY_H 1 >#define HAVE_STRINGS_H 1 >#define HAVE_INTTYPES_H 1 >#define HAVE_STDINT_H 1 >#define HAVE_UNISTD_H 1 >#define HAVE_DLFCN_H 1 >#define LT_OBJDIR ".libs/" >#define BAREFOOTD 0 >#define COVENANT 0 >#define PRODUCT "Dante" >#define LCPRODUCT "dante" >#define PRERELEASE 0 >#define YYTEXT_POINTER 1 >#define HAVE_DECL_BOUNDED 1 >#define HAVE_PRAGMA_SUPPORT 1 >#define HAVE_DECL_ATTRIBUTE 1 >#define HAVE_DECL_CONSTRUCTOR 1 >#define HAVE_DECL_NONNULL 1 >#define HAVE_DECL_FORMAT 1 >#define DIAGNOSTIC 0 >#define HAVE_MONCONTROL 1 >#define SIZEOF_CHAR 1 >#define SIZEOF_SHORT 2 >#define SIZEOF_INT 4 >#define SIZEOF_LONG 8 >#define HAVE_SYS_WAIT_H 1 >#define HAVE_FCNTL_H 1 >#define HAVE_LIMITS_H 1 >#define HAVE_MALLOC_H 1 >#define HAVE_PATHS_H 1 >#define HAVE_STRINGS_H 1 >#define HAVE_SYSLOG_H 1 >#define HAVE_UNISTD_H 1 >#define HAVE_STDDEF_H 1 >#define HAVE_SYS_FILE_H 1 >#define HAVE_SYS_IOCTL_H 1 >#define HAVE_SYS_TIME_H 1 >#define HAVE_IFADDRS_H 1 >#define HAVE_SYS_SEM_H 1 >#define HAVE_NETINET_IN_H 1 >#define HAVE_RPC_RPC_H 1 >#define HAVE_SYS_IPC_H 1 >#define HAVE_ARPA_NAMESER_H 1 >#define HAVE_NET_IF_DL_H 1 >#define HAVE_EXECINFO_H 1 >#define HAVE_SYS_SHM_H 1 >#define HAVE_NETINET_TCP_FSM_H 1 >#define HAVE_NETINET_IP_H 1 >#define HAVE_NETINET_IP_VAR_H 1 >#define HAVE_RESOLV_H 1 >#define HAVE_SYS_SOCKIO_H 1 >#define HAVE_ROUTE_SOURCE 1 >#define HAVE_ROUTEINFO_BSD 1 >#define HAVE_STRUCT_IPOPTS 1 >#define HAVE_TCP_INFO 1 >#define HAVE_TCP_INFO_TCPI_RCV_SPACE 1 >#define HAVE_TCP_INFO_TCPI_LAST_DATA_RECV 1 >#define TIME_WITH_SYS_TIME 1 >#define HAVE_IN6_ADDR 1 >#define HAVE_OPENLOG_LOG_PERROR 1 >#define HAVE_SIGNAL_SIGINFO 1 >#define HAVE_MSG_WAITALL 1 >#define HAVE_NONULL_FREE 1 >#define HAVE_CMSGHDR 1 >#define HAVE_CMSG_SPACE 1 >#define HAVE_CMSG_LEN 1 >#define HAVE_SOCKADDR_SA_LEN 1 >#define sa_len_type uint8_t >#define HAVE_SOCKADDR_STORAGE_SS_LEN 1 >#define res_options_type_t unsigned int >#define HAVE_PROGNAME 1 >#define HAVE_SIG_ATOMIC_T 1 >#define SOCKS_NSIG 256 >#define HAVE_INT8_T 1 >#define HAVE_INT16_T 1 >#define HAVE_INT32_T 1 >#define HAVE_UINT8_T 1 >#define HAVE_UINT16_T 1 >#define HAVE_UINT32_T 1 >#define HAVE_IN_PORT_T 1 >#define HAVE_IN_ADDR_T 1 >#define RETSIGTYPE void >#define HAVE_STRFTIME 1 >#define HAVE_UTIME_H 1 >#define HAVE_UTIME_NULL 1 >#define HAVE_VPRINTF 1 >#define HAVE_BINDRESVPORT 1 >#define HAVE_GETPASS 1 >#define HAVE_WORKING_GETPWNAM 1 > >/* end confdefs.h. */ > >#include <sys/types.h> >#include <sys/socket.h> > >#include <assert.h> >#include <stdio.h> >#include <stdlib.h> >#include <string.h> >#include <unistd.h> >#include <fcntl.h> >#include <errno.h> > >#ifndef MIN >#define MIN(a,b) ((a) < (b) ? (a) : (b)) >#endif /* !MIN */ > >#if NEED_AF_LOCAL >#define AF_LOCAL AF_UNIX >#endif /* NEED_AF_LOCAL */ > >#define PACKETSIZE (1024) > >#define PADBYTES (sizeof(short) * (64)) >/* > * Just a wild guess. Dante uses sizeof(long). > */ > >#define SEND_PIPE (0) >#define RECV_PIPE (1) > >#define EXIT_OK (0) /* type successfully determined */ >#define EXIT_UNKNOWN (1) /* error: unable to determine type */ > >static void >setsockets(const int doreverse, const size_t packetsize, > const int s, const int r, > int *sndbuf, int *sndbuf_set, > int *rcvbuf, int *rcvbuf_set); > >static size_t >sendtest(const int s, const char *buf, const size_t buflen); > >void >reswrite(const char *res); > >int >main(void) >{ > size_t sent, packetcount; > int sndbuf, sndbuf_set, rcvbuf, rcvbuf_set; > char buf[PACKETSIZE]; > int datapipev[2]; > > if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, datapipev) != 0) { > perror("socketpair()"); > exit(EXIT_UNKNOWN); > } > > setsockets(0, > PACKETSIZE, > datapipev[SEND_PIPE], > datapipev[RECV_PIPE], > &sndbuf, &sndbuf_set, > &rcvbuf, &rcvbuf_set); > > packetcount = MIN(sndbuf, sndbuf_set) / (PACKETSIZE + PADBYTES); > > fprintf(stderr, > "Requested sndbuf to be %d, is %d. " > "Requested rcvbuf to be %d, is %d.\n" > "Calculated packetcount is %lu\n", > sndbuf, sndbuf_set, > rcvbuf, rcvbuf_set, > (unsigned long)packetcount); > >fprintf(stderr,"1st calling sendtest in main\n"); > sent = sendtest(datapipev[SEND_PIPE], buf, PACKETSIZE) / PACKETSIZE; >fprintf(stderr,"1st after sendtest in main\n"); > > if (sent >= packetcount) { > fprintf(stderr, "status determined by send-side\n"); > reswrite("sendbased"); > exit(EXIT_OK); > } > > /* > * Try the reverse. Perhaps this system wants a large rcvbuf rather than > * a large sndbuf. > */ > close(datapipev[SEND_PIPE]); > close(datapipev[RECV_PIPE]); > > if (socketpair(AF_LOCAL, SOCK_DGRAM, 0, datapipev) != 0) { > perror("socketpair()"); > exit(EXIT_UNKNOWN); > } > > setsockets(1, > PACKETSIZE, > datapipev[SEND_PIPE], > datapipev[RECV_PIPE], > &sndbuf, &sndbuf_set, > &rcvbuf, &rcvbuf_set); > > packetcount = MIN(rcvbuf, rcvbuf_set) / (PACKETSIZE + PADBYTES); > > fprintf(stderr, > "Requested sndbuf to be %d, is %d. " > "Requested rcvbuf to be %d, is %d.\n" > "Calculated packetcount is %lu\n", > sndbuf, sndbuf_set, > rcvbuf, rcvbuf_set, > (unsigned long)packetcount); > >fprintf(stderr,"2nd calling sendtest in main\n"); > sent = sendtest(datapipev[SEND_PIPE], buf, PACKETSIZE) / PACKETSIZE; >fprintf(stderr,"2nd after sendtest in main\n"); > > if (sent >= packetcount) { > fprintf(stderr, "status determined by read-side\n"); > reswrite("recvbased"); > exit(EXIT_OK); > } > > fprintf(stderr, "status is unknown\n"); > return EXIT_UNKNOWN; >} > >static void >setsockets(doreverse, packetsize, s, r, sndbuf, sndbuf_set, rcvbuf, rcvbuf_set) > const int doreverse; > const size_t packetsize; > const int s; > const int r; > int *sndbuf, *sndbuf_set; > int *rcvbuf, *rcvbuf_set; >{ > socklen_t len; > int p; > > if ((p = fcntl(s, F_GETFL, 0)) == -1 > || fcntl(s, F_SETFL, p | O_NONBLOCK) == -1 > || fcntl(r, F_SETFL, p | O_NONBLOCK) == -1) { > perror("fcntl(F_SETFL/F_GETFL, O_NONBLOCK) failed"); > exit(EXIT_UNKNOWN); > } > > len = sizeof(*sndbuf_set); > > if (doreverse) { > *sndbuf = packetsize + PADBYTES; > > if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf, sizeof(*sndbuf)) != 0) { > perror("setsockopt(SO_SNDBUF)"); > exit(EXIT_UNKNOWN); > } > > if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf_set, &len) != 0) { > perror("getsockopt(SO_SNDBUF)"); > exit(EXIT_UNKNOWN); > } > > *rcvbuf = *sndbuf_set * 10; > if (setsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf, sizeof(*rcvbuf)) != 0) { > perror("setsockopt(SO_RCVBUF)"); > exit(EXIT_UNKNOWN); > } > } > else { > *rcvbuf = packetsize + PADBYTES; > > if (setsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf, sizeof(*rcvbuf)) != 0) { > perror("setsockopt(SO_RCVBUF)"); > exit(EXIT_UNKNOWN); > } > > if (getsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf_set, &len) != 0) { > perror("getsockopt(SO_RCVBUF)"); > exit(EXIT_UNKNOWN); > } > > *sndbuf = *rcvbuf_set * 10; > if (setsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf, sizeof(*sndbuf)) != 0) { > perror("setsockopt(SO_SNDBUF)"); > exit(EXIT_UNKNOWN); > } > } > > if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, sndbuf_set, &len) != 0 > || getsockopt(r, SOL_SOCKET, SO_RCVBUF, rcvbuf_set, &len) != 0) { > perror("getsockopt(SO_SNDBUF/SO_RCVBUF)"); > exit(EXIT_UNKNOWN); > } > > fprintf(stderr, "sndbuf is %lu, rcvbuf is %lu\n", > (unsigned long)*sndbuf_set, (unsigned long)*rcvbuf_set); > > if (doreverse) { > if (*rcvbuf_set < *rcvbuf) { > fprintf(stderr, "failed to set rcvbuf to %lu. Is %lu\n", > (unsigned long)*rcvbuf, (unsigned long)*rcvbuf_set); > exit(EXIT_UNKNOWN); > } > } > else { > if (*sndbuf_set < *sndbuf) { > fprintf(stderr, "failed to set sndbuf to %lu (is %lu)\n", > (unsigned long)*sndbuf, (unsigned long)*sndbuf_set); > exit(EXIT_UNKNOWN); > } > } >} > >static size_t >sendtest(s, buf, buflen) > const int s; > const char *buf; > const size_t buflen; >{ > ssize_t rc; > size_t sent; > int i; > > i = 1; > sent = 0; > errno = 0; > > while (1) { > if ((rc = write(s, buf, buflen)) == -1) > break; > else { > assert(rc == (ssize_t)buflen); > > ++i; > sent += rc; > } > } > > fprintf(stderr, > "failed sending packet #%d, sent %ld/%ld. " > "Total bytes sent: %lu. Error on last packet: %s\n", > i, > (long)rc, > (unsigned long)buflen, > (unsigned long)sent, > strerror(errno)); > > return sent; >} > >void >reswrite(res) > const char *res; >{ > FILE *fp; > if ((fp = fopen("conftest.out", "w")) == NULL) { > perror("fopen"); > exit(1); > } > fprintf(fp, "%s\n", res); > fclose(fp); >}
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 265087
:
235121
| 235123 |
235364