]> arthur.barton.de Git - netatalk.git/commitdiff
Merge 2-1
authorFrank Lahm <franklahm@googlemail.com>
Tue, 19 Apr 2011 13:51:24 +0000 (15:51 +0200)
committerFrank Lahm <franklahm@googlemail.com>
Tue, 19 Apr 2011 13:51:24 +0000 (15:51 +0200)
1  2 
libatalk/cnid/dbd/cnid_dbd.c

index 990248e45e439a22bc4de87377ae8fbe7e1e95f7,434e8f99cd25cfd324717c3d54204ad4b4161535..4ad6883168a4d64098979e2be525588a266042fb
@@@ -104,7 -104,7 +104,7 @@@ static int tsock_getfd(const char *host
          }
  
          if (setnonblock(sock, 1) != 0) {
-             LOG(log_error, logtype_cnid, "getfd: setnonblock: %s", strerror(err));
+             LOG(log_error, logtype_cnid, "getfd: setnonblock: %s", strerror(errno));
              close(sock);
              sock = -1;
              return -1;
                              strerror(errno));
                      }
                      close(sock);
 -                    sock=-1;
 +                    sock = -1;
                      continue;
                  }
              } else {
@@@ -454,7 -454,6 +454,7 @@@ static struct _cnid_db *cnid_dbd_new(co
      cdb->cnid_delete = cnid_dbd_delete;
      cdb->cnid_get = cnid_dbd_get;
      cdb->cnid_lookup = cnid_dbd_lookup;
 +    cdb->cnid_find = cnid_dbd_find;
      cdb->cnid_nextid = NULL;
      cdb->cnid_resolve = cnid_dbd_resolve;
      cdb->cnid_getstamp = cnid_dbd_getstamp;
@@@ -680,9 -679,11 +680,9 @@@ char *cnid_dbd_resolve(struct _cnid_db 
      rqst.op = CNID_DBD_OP_RESOLVE;
      rqst.cnid = *id;
  
 -    /* This mimicks the behaviour of the "regular" cnid_resolve. So far,
 -       nobody uses the content of buffer. It only provides space for the
 -       name in the caller. */
 -    rply.name = (char *)buffer + CNID_HEADER_LEN;
 -    rply.namelen = len - CNID_HEADER_LEN;
 +    /* Pass buffer to transmit so it can stuff the reply data there */
 +    rply.name = (char *)buffer;
 +    rply.namelen = len;
  
      if (transmit(db, &rqst, &rply) < 0) {
          errno = CNID_ERR_DB;
      switch (rply.result) {
      case CNID_DBD_RES_OK:
          *id = rply.did;
 -        name = rply.name;
 +        name = rply.name + CNID_NAME_OFS;
          LOG(log_debug, logtype_cnid, "cnid_dbd_resolve: resolved did: %u, name: '%s'", ntohl(*id), name);
          break;
      case CNID_DBD_RES_NOTFOUND:
@@@ -790,61 -791,6 +790,61 @@@ cnid_t cnid_dbd_lookup(struct _cnid_db 
      return id;
  }
  
 +/* ---------------------- */
 +int cnid_dbd_find(struct _cnid_db *cdb, char *name, size_t namelen, void *buffer, size_t buflen)
 +{
 +    CNID_private *db;
 +    struct cnid_dbd_rqst rqst;
 +    struct cnid_dbd_rply rply;
 +    int count;
 +
 +    if (!cdb || !(db = cdb->_private) || !name) {
 +        LOG(log_error, logtype_cnid, "cnid_find: Parameter error");
 +        errno = CNID_ERR_PARAM;
 +        return CNID_INVALID;
 +    }
 +
 +    if (namelen > MAXPATHLEN) {
 +        LOG(log_error, logtype_cnid, "cnid_find: Path name is too long");
 +        errno = CNID_ERR_PATH;
 +        return CNID_INVALID;
 +    }
 +
 +    LOG(log_debug, logtype_cnid, "cnid_find(\"%s\")", name);
 +
 +    RQST_RESET(&rqst);
 +    rqst.op = CNID_DBD_OP_SEARCH;
 +
 +    rqst.name = name;
 +    rqst.namelen = namelen;
 +
 +    rply.name = buffer;
 +    rply.namelen = buflen;
 +
 +    if (transmit(db, &rqst, &rply) < 0) {
 +        errno = CNID_ERR_DB;
 +        return CNID_INVALID;
 +    }
 +
 +    switch (rply.result) {
 +    case CNID_DBD_RES_OK:
 +        count = rply.namelen / sizeof(cnid_t);
 +        LOG(log_debug, logtype_cnid, "cnid_find: got %d matches", count);
 +        break;
 +    case CNID_DBD_RES_NOTFOUND:
 +        count = 0;
 +        break;
 +    case CNID_DBD_RES_ERR_DB:
 +        errno = CNID_ERR_DB;
 +        count = -1;
 +        break;
 +    default:
 +        abort();
 +    }
 +
 +    return count;
 +}
 +
  /* ---------------------- */
  int cnid_dbd_update(struct _cnid_db *cdb, const cnid_t id, const struct stat *st,
                      const cnid_t did, char *name, const size_t len)