aboutsummaryrefslogtreecommitdiffstats
path: root/run-estimate.c
diff options
context:
space:
mode:
Diffstat (limited to 'run-estimate.c')
-rw-r--r--run-estimate.c145
1 files changed, 145 insertions, 0 deletions
diff --git a/run-estimate.c b/run-estimate.c
new file mode 100644
index 0000000..f97761d
--- /dev/null
+++ b/run-estimate.c
@@ -0,0 +1,145 @@
+#include "config.h"
+#include "conf.h"
+#include "err.h"
+
+#include <errno.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <unistd.h>
+
+#ifdef NEED_LIBUTIL
+#include <libutil.h>
+#endif
+
+RCSID("$Id: run-estimate.c,v 1.1.1.1 1999/02/02 23:29:39 shmit Exp $");
+
+short exit_status = -1;
+
+void
+sig_pipe(int signo)
+{
+ err("SIGPIPE caught.\n");
+ exit_status = -2;
+}
+
+void
+sig_child(int signo)
+{
+ int status;
+
+ if (wait(&status) == -1) {
+ err("Couldn't clean up child: %s.\n", strerror(errno));
+ return;
+ }
+
+ exit_status = WEXITSTATUS(status);
+}
+
+int
+init_connection(disklist_t *disklist, long port)
+{
+ char buffer[MAXLINE];
+
+ printf(PORT_REQ " %ld\n", port);
+ fflush(stdout);
+
+ if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
+ err("NULL input waiting for ACK.\n");
+ return -1;
+ }
+
+ if (!strcmp(buffer, REQ_NACK "\n")) {
+ err("OK. I'm bailing.\n");
+ return -1;
+ } else if (strcmp(buffer, REQ_ACK "\n")) {
+ err("Don't know what `%s' means, giving up.\n", buffer);
+ return -1;
+ }
+
+ while (disklist) {
+ char authtype[MAXLINE];
+
+ switch (disklist->disk.auth) {
+ case RSH:
+ strcpy(authtype, AUTH_RSH);
+ break;
+ case NOAUTH:
+ default:
+ strcpy(authtype, AUTH_NOAUTH);
+ }
+
+ printf("%s %s %s %s %s\n", DISK_REQ,
+ DISK_NAME, disklist->disk.vol,
+ DISK_AUTH, authtype);
+
+ fflush(stdout);
+
+ disklist = disklist->next;
+
+ if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
+ err("NULL input waiting for ACK.\n");
+ return -1;
+ }
+
+ if (!strcmp(buffer, REQ_NACK "\n"))
+ /* TODO: remove item from disklist in this event. */
+ continue;
+ else if (strcmp(buffer, REQ_ACK "\n")) {
+ err("Don't know what `%s' means, giving up.\n",
+ buffer);
+ return -1;
+ }
+ }
+
+ printf(DUMP_DONE "\n");
+ return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+ char buffer[MAXLINE];
+ const config_t *option;
+ disklist_t *disklist;
+ long port;
+
+ if (read_config(CLIENT_CONFIG_FILE) == -1)
+ return 1;
+
+ option = findopt(PORTOPT);
+ if (!option) {
+ err("Couldn't find " PORTOPT " in config file.\n");
+ return 1;
+ }
+ port = option->numvalue;
+
+ printf(INIT_REQ "\n");
+ fflush(stdout);
+
+ if (fgets(buffer, sizeof(buffer), stdin) == NULL) {
+ err("NULL input waiting for handshake ACK.\n");
+ return 1;
+ }
+
+ if (strncmp(buffer, INIT_ACK "\n", sizeof(buffer))) {
+ err("Recieved invalid handshake ACK: %s.", buffer);
+ return 1;
+ }
+
+ if (read_dumptypes(DATADIR "/dumptypes") == -1)
+ return 1;
+
+ disklist = read_disklist(DATADIR "/disklist");
+ if (!disklist)
+ return 1;
+
+ if (init_connection(disklist, port) == -1)
+ return 1;
+
+ return 0;
+}