uint32_t sftp_parse_path(struct sftpjob *job, char **strp) { uint32_t rc; if((rc = sftp_parse_string(job, strp, 0)) != SSH_FX_OK) return rc; return protocol->decode(job, strp); }
uint32_t sftp_v456_parseattrs(struct sftpjob *job, struct sftpattr *attrs) { uint32_t n, rc; memset(attrs, 0, sizeof *attrs); if((rc = sftp_parse_uint32(job, &attrs->valid)) != SSH_FX_OK) return rc; if((attrs->valid & protocol->attrmask) != attrs->valid) { D(("received attrs %#x but protocol %d only supports %#x", attrs->valid, protocol->version, protocol->attrmask)); attrs->valid = 0; return SSH_FX_BAD_MESSAGE; } if((rc = sftp_parse_uint8(job, &attrs->type)) != SSH_FX_OK) return rc; if(attrs->valid & SSH_FILEXFER_ATTR_SIZE) if((rc = sftp_parse_uint64(job, &attrs->size)) != SSH_FX_OK) return rc; if(attrs->valid & SSH_FILEXFER_ATTR_OWNERGROUP) { if((rc = sftp_parse_path(job, &attrs->owner)) != SSH_FX_OK) return rc; if((rc = sftp_parse_path(job, &attrs->group)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_PERMISSIONS) { if((rc = sftp_parse_uint32(job, &attrs->permissions)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_ACCESSTIME) { if((rc = sftp_parse_uint64(job, (uint64_t *)&attrs->atime.seconds)) != SSH_FX_OK) return rc; if(attrs->valid & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) if((rc = sftp_parse_uint32(job, &attrs->atime.nanoseconds)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_CREATETIME) { if((rc = sftp_parse_uint64(job, (uint64_t *)&attrs->createtime.seconds)) != SSH_FX_OK) return rc; if(attrs->valid & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) if((rc = sftp_parse_uint32(job, &attrs->createtime.nanoseconds)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_MODIFYTIME) { if((rc = sftp_parse_uint64(job, (uint64_t *)&attrs->mtime.seconds)) != SSH_FX_OK) return rc; if(attrs->valid & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) if((rc = sftp_parse_uint32(job, &attrs->mtime.nanoseconds)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_CTIME) { if((rc = sftp_parse_uint64(job, (uint64_t *)&attrs->ctime.seconds)) != SSH_FX_OK) return rc; if(attrs->valid & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) if((rc = sftp_parse_uint32(job, &attrs->ctime.nanoseconds)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_ACL) { if((rc = sftp_parse_string(job, &attrs->acl, 0)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_BITS) { if((rc = sftp_parse_uint32(job, &attrs->attrib_bits)) != SSH_FX_OK) return rc; if(protocol->version >= 6) { if((rc = sftp_parse_uint32(job, &attrs->attrib_bits_valid)) != SSH_FX_OK) return rc; } else attrs->attrib_bits_valid = 0x7ff; /* -05 s5.8 */ } if(attrs->valid & SSH_FILEXFER_ATTR_TEXT_HINT) { if((rc = sftp_parse_uint8(job, &attrs->text_hint)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_MIME_TYPE) { if((rc = sftp_parse_string(job, &attrs->mime_type, 0)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_LINK_COUNT) { if((rc = sftp_parse_uint32(job, &attrs->link_count)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_UNTRANSLATED_NAME) { if((rc = sftp_parse_string(job, &attrs->mime_type, 0)) != SSH_FX_OK) return rc; } if(attrs->valid & SSH_FILEXFER_ATTR_EXTENDED) { if((rc = sftp_parse_uint32(job, &n)) != SSH_FX_OK) return rc; while(n-- > 0) { if((rc = sftp_parse_string(job, 0, 0)) != SSH_FX_OK) return rc; if((rc = sftp_parse_string(job, 0, 0)) != SSH_FX_OK) return rc; } } return SSH_FX_OK; }