int rmtstatus(struct mtget *mt) { char *buf = (char *)mt; int n, i, cc; if (rmtversion > 0) return (rmtstatus_extended(mt)); n = rmtcall("status", "S"); if (n < 0) { return (-1); } if ((unsigned)n > sizeof (*mt)) { print(dgettext(domainname, "rmtstatus: expected response size %d, got %d\n"), sizeof (struct mtget), n); print(dgettext(domainname, "This means the remote rmt daemon is not compatible.\n")); rmtconnaborted(0); } i = 0; while (i < n) { cc = read(rmtape, buf+i, n - i); if (cc <= 0) rmtconnaborted(0); i += cc; } return (n); }
int rmtread(char *buf, uint_t count) { char line[30]; int n, i, cc; (void) snprintf(line, sizeof (line), "R%d\n", count); n = rmtcall("read", line); if (n < 0) { return (-1); } if (n > count) { print(dgettext(domainname, "rmtread: expected response size %d, got %d\n"), count, n); print(dgettext(domainname, "This means the remote rmt daemon is not compatible.\n")); rmtconnaborted(0); } i = 0; while (i < n) { cc = read(rmtape, buf+i, n - i); if (cc <= 0) rmtconnaborted(0); i += cc; } return (n); }
static int rmtreply(char *cmd) { char code[30], emsg[BUFSIZ]; rmtgets(code, sizeof (code)); if (*code == 'E' || *code == 'F') { rmtgets(emsg, sizeof (emsg)); /* * don't print error message for ioctl or status; * or if we are opening up a full path (i.e. device) * and the tape is not loaded (EIO error) */ if (strcmp(cmd, "ioctl") != 0 && strcmp(cmd, "status") != 0 && !(cmd[0] == '/' && atoi(code + 1) == EIO)) print("%s: %s\n", cmd, emsg); errno = atoi(code + 1); if (*code == 'F') { rmtstate = TS_CLOSED; return (-1); } return (-1); } if (*code != 'A') { print(dgettext(domainname, "Protocol to remote tape server botched (code %s?).\n"), code); rmtconnaborted(0); } return (atoi(code + 1)); }
static int rmtcall(char *cmd, char *buf) { if (rmtpush(buf, strlen(buf)) != strlen(buf)) rmtconnaborted(0); return (rmtreply(cmd)); }
static int rmtreply(const char *cmd) { char *cp; char code[30], emsg[BUFSIZ]; rmtgets(code, sizeof (code)); if (*code == 'E' || *code == 'F') { rmtgets(emsg, sizeof (emsg)); msg("%s: %s", cmd, emsg); errno = atoi(code + 1); if (*code == 'F') rmtstate = TS_CLOSED; return (-1); } if (*code != 'A') { /* Kill trailing newline */ cp = code + strlen(code); if (cp > code && *--cp == '\n') *cp = '\0'; msg("Protocol to remote tape server botched (code \"%s\").\n", code); rmtconnaborted(0); } return (atoi(code + 1)); }
static int rmtcall(const char *cmd, const char *buf) { if (write(rmtape, buf, strlen(buf)) != strlen(buf)) rmtconnaborted(0); return (rmtreply(cmd)); }
int rmtgetb(void) { char c; if (read(rmtape, &c, 1) != 1) rmtconnaborted(0); return (c); }
static int rmtcall(const char *cmd, const char *buf) { ssize_t len = (ssize_t)strlen(buf); if (write(rmtape, buf, len) != len) rmtconnaborted(0); return (rmtreply(cmd)); }
static void rmtgets(char *cp, int len) { int i, n; n = recv(rmtape, cp, len-1, MSG_PEEK); for (i = 0; i < n; i++) if (cp[i] == '\n') break; n = i + 1; /* characters to read at once */ for (i = 0; i < len; i += n, n = 1) { n = read(rmtape, cp, n); if (n <= 0) rmtconnaborted(0); cp += n; if (cp[-1] == '\n') { cp[-1] = '\0'; return; } } print(dgettext(domainname, "Protocol to remote tape server botched (in rmtgets).\n")); rmtconnaborted(0); }
int rmtread(char *buf, int count) { char line[30]; int n, i, cc; (void)snprintf(line, sizeof (line), "R%d\n", count); n = rmtcall("read", line); if (n < 0) /* rmtcall() properly sets errno for us on errors. */ return (n); for (i = 0; i < n; i += cc) { cc = read(rmtape, buf+i, n - i); if (cc <= 0) rmtconnaborted(0); } return (n); }
/* Get a line (guaranteed to have a trailing newline). */ void rmtgets(char *line, int len) { char *cp = line; while (len > 1) { *cp = rmtgetb(); if (*cp == '\n') { cp[1] = '\0'; return; } cp++; len--; } *cp = '\0'; msg("Protocol to remote tape server botched.\n"); msg("(rmtgets got \"%s\").\n", line); rmtconnaborted(0); }
int rmtread(char *buf, int count) { char line[30]; int n, i, cc; (void)snprintf(line, sizeof(line), "R%d\n", count); n = rmtcall("read", line); if (n < 0) { errno = n; return (-1); } for (i = 0; i < n; i += cc) { cc = read(rmtape, buf+i, n - i); if (cc <= 0) { rmtconnaborted(0); } } return (n); }