+static ssize_t run_command(int sockfd, const char *command,
+ char *buffer, size_t bufsize)
+{
+ char *p;
+ ssize_t size, len;
+ int flag = 1;
+
+ /*
+ * Write the text to the socket.
+ */
+ if (write(sockfd, command, strlen(command)) < 0) return -1;
+ if (write(sockfd, "\r\n", 2) < 0) return -1;
+
+ /*
+ * Read the response
+ */
+ size = 0;
+ buffer[0] = '\0';
+
+ memset(buffer, 0, bufsize);
+
+ while (flag == 1) {
+ int rcode;
+ fd_set readfds;
+
+ FD_ZERO(&readfds);
+ FD_SET(sockfd, &readfds);
+
+ rcode = select(sockfd + 1, &readfds, NULL, NULL, NULL);
+ if (rcode < 0) {
+ if (errno == EINTR) continue;
+
+ fprintf(stderr, "%s: Failed selecting: %s\n",
+ progname, strerror(errno));
+ exit(1);
+ }
+
+ len = recv(sockfd, buffer + size,
+ bufsize - size - 1, MSG_DONTWAIT);
+ if (len < 0) {
+ /*
+ * No data: keep looping
+ */
+ if ((errno == EAGAIN) || (errno == EINTR)) {
+ continue;
+ }
+
+ fprintf(stderr, "%s: Error reading socket: %s\n",
+ progname, strerror(errno));
+ exit(1);
+ }
+ if (len == 0) return 0; /* clean exit */
+
+ size += len;
+ buffer[size] = '\0';
+
+ /*
+ * There really is a better way of doing this.
+ */
+ p = strstr(buffer, "radmin> ");
+ if (p &&
+ ((p == buffer) ||
+ (p[-1] == '\n') ||
+ (p[-1] == '\r'))) {
+ *p = '\0';
+
+ if (p[-1] == '\n') p[-1] = '\0';
+
+ flag = 0;
+ break;
+ }
+ }
+
+ /*
+ * Blank prompt. Go get another command.
+ */
+ if (!buffer[0]) return 1;
+
+ buffer[size] = '\0'; /* this is at least right */
+
+ return 2;
+}
+
+