Beispiel #1
0
static int
rgetmnthost (int sock, struct LSFHeader *hdr)
{
  static char fname[] = "rgetmnthost()";
  char buf[LSRCP_MSGSIZE];
  char fn[MAXFILENAMELEN], *host;
  XDR xdrs;
  struct stringLen fnStr;
  struct stringLen hostStr;

  fnStr.len = MAXFILENAMELEN;
  fnStr.name = fn;

  xdrmem_create (&xdrs, buf, LSRCP_MSGSIZE, XDR_DECODE);
  if (readDecodeMsg_ (sock, buf, hdr, SOCK_READ_FIX, &xdrs,
		      (char *) &fnStr, xdr_stringLen, NULL))
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
      xdr_destroy (&xdrs);
      close (sock);
      return (-1);
    }
  xdr_destroy (&xdrs);

  if ((host = ls_getmnthost (fn)) == NULL)
    {
      if (lsSendMsg_ (sock, -errnoEncode_ (errno), 0, NULL, buf,
		      sizeof (struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
	  < 0)
	{
	  ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
	  close (sock);
	  return (-1);
	}
      return (0);
    }

  hostStr.len = MAXHOSTNAMELEN;
  hostStr.name = host;
  if (lsSendMsg_
      (sock, 0, 0, (char *) &hostStr, buf, LSRCP_MSGSIZE, xdr_stringLen,
       SOCK_WRITE_FIX, NULL) < 0)
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
      close (sock);
      return (-1);
    }

  return (0);
}
Beispiel #2
0
static int
rlseek (int sock, struct LSFHeader *hdr)
{
  static char fname[] = "rlseek()";
  struct rlseekReq req;
  char msgBuf[LSRCP_MSGSIZE];
  XDR xdrs;
  off_t pos;

  xdrmem_create (&xdrs, msgBuf, LSRCP_MSGSIZE, XDR_DECODE);
  if (readDecodeMsg_ (sock, msgBuf, hdr, SOCK_READ_FIX, &xdrs, (char *) &req,
		      xdr_rlseekReq, NULL))
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
      xdr_destroy (&xdrs);
      close (sock);
      return (-1);
    }
  xdr_destroy (&xdrs);

  if ((pos = lseek (req.fd, (off_t) req.offset, req.whence)) < 0)
    {
      goto fail;
    }

  if (lsSendMsg_ (sock, 0, (int) pos, NULL, msgBuf,
		  sizeof (struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0)
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
      close (sock);
      return (-1);
    }

  return (0);

fail:
  if (lsSendMsg_ (sock, -errnoEncode_ (errno), 0, NULL, msgBuf,
		  sizeof (struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0)
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
      close (sock);
      return (-1);
    }

  return (0);
}
Beispiel #3
0
static int
rfstat (int sock, struct LSFHeader *hdr)
{
  static char fname[] = "rfstat()";
  int reqfd;
  char msgBuf[LSRCP_MSGSIZE];
  XDR xdrs;
  struct stat st;

  xdrmem_create (&xdrs, msgBuf, LSRCP_MSGSIZE, XDR_DECODE);
  if (readDecodeMsg_
      (sock, msgBuf, hdr, SOCK_READ_FIX, &xdrs, (char *) &reqfd, xdr_int,
       NULL))
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
      xdr_destroy (&xdrs);
      close (sock);
      return (-1);
    }
  xdr_destroy (&xdrs);

  if (fstat (reqfd, &st) == -1)
    {
      if (lsSendMsg_ (sock, -errnoEncode_ (errno), 0, NULL, msgBuf,
		      sizeof (struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
	  < 0)
	{
	  ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
	  close (sock);
	  return (-1);
	}
      return (0);
    }

  if (lsSendMsg_ (sock, 0, 0, (char *) &st, msgBuf, LSRCP_MSGSIZE, xdr_stat,
		  SOCK_WRITE_FIX, NULL) < 0)
    {
      ls_errlog (stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
      close (sock);
      return (-1);
    }

  return (0);
}
Beispiel #4
0
static int
rstat(int sock, struct LSFHeader *hdr)
{
    static char fname[] = "rstat()";
    struct stat st;
    char buf[LSRCP_MSGSIZE];
    char fn[MAXFILENAMELEN];
    XDR xdrs;
    struct stringLen fnStr;

    fnStr.len = MAXFILENAMELEN;
    fnStr.name = fn;

    xdrmem_create(&xdrs, buf, LSRCP_MSGSIZE, XDR_DECODE);
    if (readDecodeMsg_(sock, buf, hdr, SOCK_READ_FIX, &xdrs,
                       (char *) &fnStr, xdr_stringLen, NULL)) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDeocdeMsg_");
        xdr_destroy(&xdrs);
        close(sock);
        return -1;
    }
    xdr_destroy(&xdrs);

    if (stat(fn, &st) == -1) {
        if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, buf,
                       sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
            < 0) {
            ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
            close(sock);
            return -1;
        }
        return 0;
    }

    if (lsSendMsg_(sock, 0, 0, (char *) &st, buf, LSRCP_MSGSIZE, xdr_stat,
                   SOCK_WRITE_FIX, NULL) < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        close(sock);
        return -1;
    }

    return 0;
}
Beispiel #5
0
static int
rclose(int sock, struct LSFHeader *hdr)
{
    static char fname[] = "rclose()";
    int reqfd;
    char buf[LSRCP_MSGSIZE];
    XDR xdrs;

    xdrmem_create(&xdrs, buf, LSRCP_MSGSIZE, XDR_DECODE);
    if (readDecodeMsg_(sock, buf, hdr, SOCK_READ_FIX, &xdrs, (char *) &reqfd,
                       xdr_int, NULL)) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
        xdr_destroy(&xdrs);
        closesocket(sock);
        return -1;
    }
    xdr_destroy(&xdrs);

    if (close(reqfd) == -1) {
        if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, buf,
                       sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
            < 0) {
            ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
            close(sock);
        }
        return 0;
    }

    if (lsSendMsg_(sock, 0, 0, NULL, buf,
                   sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        close(sock);
        return -1;
    }

    return 0;
}
Beispiel #6
0
static
int clearSock(int sock, int len)
{
    static char fname[] = "clearSock()";
    int l;
    char buf[LSRCP_MSGSIZE];

    for (; len; len -= l) {
        l = len > LSRCP_MSGSIZE ? LSRCP_MSGSIZE : len;
        if (SOCK_READ_FIX(sock, buf, l) != l) {
            ls_errlog(stderr, I18N_FUNC_D_FAIL_M, fname, "SOCK_READ_FIX",
                      l);
            close(sock);
            return -1;
        }
    }

    return 0;
}
Beispiel #7
0
static int
runlink(int sock, struct LSFHeader *hdr)
{
    static char fname[] = "runlink()";
    char buf[LSRCP_MSGSIZE];
    char fn[MAXFILENAMELEN];
    XDR xdrs;
    struct stringLen fnStr;
    struct stat st;

    fnStr.len = MAXFILENAMELEN;
    fnStr.name = fn;

    xdrmem_create(&xdrs, buf, LSRCP_MSGSIZE, XDR_DECODE);
    if (readDecodeMsg_(sock, buf, hdr, SOCK_READ_FIX, &xdrs,
                       (char *) &fnStr, xdr_stringLen, NULL)) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
        xdr_destroy(&xdrs);
        close(sock);
        return -1;
    }
    xdr_destroy(&xdrs);

    if ((stat(fn, &st) == 0) && (st.st_mode & S_IFDIR)) {


        DIR *dirp;
        struct dirent *dp;
        char path[MAXPATHLEN];

        if ((dirp = opendir(fn)) == NULL) {
            goto errrtn;
        }

        for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
            if (strcmp(dp->d_name, ".") != 0 &&
                strcmp(dp->d_name, "..") != 0) {
                sprintf (path, "%s/%s", fn, dp->d_name);
                rmdir (path);
                unlink (path);
            }
        }

        closedir (dirp);
        if (rmdir(fn) != 0) {
            goto errrtn;
        }
    }

    if (unlink(fn) < 0) {
        goto errrtn;
    }

    if (lsSendMsg_(sock, 0, 0, NULL, buf,
                   sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        closesocket(sock);
        return -1;
    }

    return 0;

errrtn:

    if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, buf,
                   sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
        < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        closesocket(sock);
        return -1;
    }
    return 0;
}
Beispiel #8
0
void
rfServ_(int acceptSock)
{
    static char          fname[] = "rfServ_()";
    struct LSFHeader     msgHdr;
    struct LSFHeader     buf;
    struct sockaddr_in   from;
    socklen_t            fromLen = sizeof(from);
    int                  sock;
    XDR                  xdrs;

    sock = accept(acceptSock, (struct sockaddr *)&from, &fromLen);
    if (sock < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeHdr_");
        closesocket(acceptSock);
        return;
    }

    xdrmem_create(&xdrs, (char *) &buf, sizeof(buf), XDR_DECODE);

    for (;;) {

        XDR_SETPOS(&xdrs, 0);
        if (readDecodeHdr_(sock,
                           (char *)&buf,
                           SOCK_READ_FIX,
                           &xdrs,
                           &msgHdr) < 0) {
            ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeHdr_");
            closesocket(sock);
            xdr_destroy(&xdrs);
            return;
        }

        switch (msgHdr.opCode) {
            case RF_OPEN:
                ropen(sock, &msgHdr);
                break;

            case RF_CLOSE:
                rclose(sock, &msgHdr);
                break;

            case RF_WRITE:
                rwrite(sock, &msgHdr);
                break;

            case RF_READ:
                rread(sock, &msgHdr);
                break;

            case RF_STAT:
                rstat(sock, &msgHdr);
                break;

            case RF_GETMNTHOST:
                rgetmnthost(sock, &msgHdr);
                break;

            case RF_FSTAT:
                rfstat(sock, &msgHdr);
                break;

            case RF_LSEEK:
                rlseek(sock, &msgHdr);
                break;

            case RF_UNLINK:
                runlink(sock, &msgHdr);
                break;

            case RF_TERMINATE:
                closesocket(sock);
                return;

            default:
                ls_errlog(stderr, _i18n_msg_get(ls_catd, NL_SETN, 602,
                                                "%s: Unknown opcode %d"),
                          fname, msgHdr.opCode);
                xdr_destroy(&xdrs);
                break;
        }
    }

}
Beispiel #9
0
static int
rread(int sock, struct LSFHeader *hdr)
{
    static char fname[] = "rread()";
    struct rrdwrReq req;
    char msgBuf[LSRCP_MSGSIZE];
    XDR xdrs;
    char *buf;

    xdrmem_create(&xdrs, msgBuf, LSRCP_MSGSIZE, XDR_DECODE);
    if (readDecodeMsg_(sock, msgBuf, hdr, SOCK_READ_FIX, &xdrs, (char *) &req,
                       xdr_rrdwrReq, NULL)) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
        xdr_destroy(&xdrs);
        close(sock);
        return -1;
    }
    xdr_destroy(&xdrs);

    if ((buf = (char *) malloc(req.len)) == NULL) {
        if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, msgBuf,
                       sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
            < 0) {
            ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
            close(sock);
        }
        return 0;
    }

    if ((req.len = read(req.fd, buf, req.len)) < 0) {
        goto fail;
    }

    if (lsSendMsg_(sock, 0, req.len, NULL, msgBuf,
                   sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        close(sock);
        free(buf);
        return -1;
    }

    if (SOCK_WRITE_FIX(sock, buf, req.len) != req.len) {
        ls_errlog(stderr, I18N_FUNC_FAIL_M, fname, "SOCK_WRITE_FIX");
        close(sock);
        free(buf);
        return -1;
    }

    free(buf);
    return 0;

fail:
    free(buf);

    if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, buf,
                   sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        close(sock);
        return -1;
    }
    return 0;

}
Beispiel #10
0
static int
ropen(int sock, struct LSFHeader *hdr)
{
    static char fname[] = "ropen()";
    struct ropenReq req;
    char buf[LSRCP_MSGSIZE];
    char fn[MAXFILENAMELEN];
    int fd;
    XDR xdrs;
    req.fn = fn;

    xdrmem_create(&xdrs, buf, LSRCP_MSGSIZE, XDR_DECODE);
    if (readDecodeMsg_(sock, buf, hdr, SOCK_READ_FIX, &xdrs, (char *) &req,
                       xdr_ropenReq, NULL)) {
        ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "readDecodeMsg_");
        xdr_destroy(&xdrs);
        closesocket(sock);
        return -1;
    }
    xdr_destroy(&xdrs);

    if (req.flags & LSF_O_CREAT_DIR) {
        req.flags &= ~LSF_O_CREAT_DIR;


        if (createSpoolSubDir(fn) < 0) {
            if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, buf,
                           sizeof(struct LSFHeader),
                           NULL, SOCK_WRITE_FIX, NULL) < 0) {
                ls_errlog(stderr, I18N_FUNC_FAIL_MM,
                          fname, "lsSendMsg_");
                closesocket(sock);
                return -1;
            }
            return 0;
        }
    }


    if ((fd = open(req.fn, req.flags, req.mode)) == -1) {
        if (lsSendMsg_(sock, -errnoEncode_(errno), 0, NULL, buf,
                       sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL)
            < 0) {
            ls_errlog(stderr, I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
            closesocket(sock);
            return -1;
        }
        return 0;
    }


    if (lsSendMsg_(sock, fd, 0, NULL, buf,
                   sizeof(struct LSFHeader), NULL, SOCK_WRITE_FIX, NULL) < 0) {
        ls_errlog(stderr,  I18N_FUNC_FAIL_MM, fname, "lsSendMsg_");
        closesocket(sock);
        close(fd);
        return -1;
    }

    return 0;
}