view src/mysql/ngx_mysql.h @ 5356:acd51b0f6fd4

Disable symlinks: use O_PATH to open path components. It was introduced in Linux 2.6.39, glibc 2.14 and allows to obtain file descriptors without actually opening files. Thus made it possible to traverse path with openat() syscalls without the need to have read permissions for path components. It is effectively emulates O_SEARCH which is missing on Linux. O_PATH is used in combination with O_RDONLY. The last one is ignored if O_PATH is used, but it allows nginx to not fail when it was built on modern system (i.e. glibc 2.14+) and run with a kernel older than 2.6.39. Then O_PATH is unknown to the kernel and ignored, while O_RDONLY is used. Sadly, fstat() is not working with O_PATH descriptors till Linux 3.6. As a workaround we fallback to fstatat() with the AT_EMPTY_PATH flag that was introduced at the same time as O_PATH.
author Valentin Bartenev <vbart@nginx.com>
date Mon, 02 Sep 2013 08:07:59 +0400
parents d620f497c50f
children
line wrap: on
line source


/*
 * Copyright (C) Igor Sysoev
 * Copyright (C) Nginx, Inc.
 */


#ifndef _NGX_MYSQL_H_INCLUDED_
#define _NGX_MYSQL_H_INCLUDED_


#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_event.h>
#include <ngx_event_connect.h>


typedef struct ngx_mysql_s  ngx_mysql_t;

typedef void (*ngx_mysql_handler_pt)(ngx_mysql_t *m);


struct ngx_mysql_s {
    ngx_peer_connection_t   peer;

    ngx_buf_t              *buf;
    ngx_pool_t             *pool;

    ngx_str_t              *login;
    ngx_str_t              *passwd;
    ngx_str_t              *database;

    ngx_str_t               query;

    ngx_uint_t              pktn;

    ngx_mysql_handler_pt    handler;
    void                   *data;
    ngx_int_t               state;

};


#define NGX_MYSQL_CMDPKT_LEN  5


#if (NGX_HAVE_LITTLE_ENDIAN && NGX_HAVE_NONALIGNED && 0)

#define ngx_m16toh(n)      (*(uint32_t *) n & 0x0000ffff)
#define ngx_m24toh(n)      (*(uint32_t *) n & 0x00ffffff)
#define ngx_m32toh(n)      *(uint32_t *) n

#define ngx_htom16(n, m)   *(uint16_t *) n = (uint16_t) ((m) & 0xffff)

#define ngx_htom24(n, m)   (n)[0] = (u_char) ((m) & 0xff);                   \
                           (n)[1] = (u_char) (((m) >> 8) & 0xff);            \
                           (n)[2] = (u_char) (((m) >> 16) & 0xff)

#define ngx_htom32(n, m)   *(uint32_t *) (n) = (m)

#else

#define ngx_m16toh(n)      (n[0] | n[1] << 8)
#define ngx_m24toh(n)      (n[0] | n[1] << 8 | n[2] << 16)
#define ngx_m32toh(n)      (n[0] | n[1] << 8 | n[2] << 16 | n[3] << 24)

#define ngx_htom16(n, m)   (n)[0] = (u_char) (m); (n)[1] = (u_char) ((m) >> 8)

#define ngx_htom24(n, m)   (n)[0] = (u_char) ((m) & 0xff);                   \
                           (n)[1] = (u_char) (((m) >> 8) & 0xff);            \
                           (n)[2] = (u_char) (((m) >> 16) & 0xff)

#define ngx_htom32(n, m)   (n)[0] = (u_char) ((m) & 0xff);                   \
                           (n)[1] = (u_char) (((m) >> 8) & 0xff);            \
                           (n)[2] = (u_char) (((m) >> 16) & 0xff);           \
                           (n)[3] = (u_char) (((m) >> 24) & 0xff)

#endif


ngx_int_t ngx_mysql_connect(ngx_mysql_t *m);
ngx_int_t ngx_mysql_query(ngx_mysql_t *m);


#endif /* _NGX_MYSQL_H_INCLUDED_ */