getprotoent_r

GETPROTOENT_R(3)Ð ÑководÑÑво пÑогÑаммиÑÑа LinuxGETPROTOENT_R(3)



ÐÐЯ
       getprotoent_r, getprotobyname_r, getprotobynumber_r - возвÑаÑаÑÑ
       запиÑÑ Ð¾ пÑоÑоколе (ÑеенÑеÑабелÑнÑе веÑÑии)

ÐÐÐÐÐ
       #include <netdb.h>

       int getprotoent_r(struct protoent *result_buf, char *buf,
                       size_t buflen, struct protoent **result);

       int getprotobyname_r(const char *name,
                       struct protoent *result_buf, char *buf,
                       size_t buflen, struct protoent **result);

       int getprotobynumber_r(int proto,
                       struct protoent *result_buf, char *buf,
                       size_t buflen, struct protoent **result);

   ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¼Ð°ÐºÑоÑа ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑвойÑÑв Ð´Ð»Ñ glibc
   (Ñм. feature_test_macros(7)):

       getprotoent_r(), getprotobyname_r(), getprotobynumber_r():
           наÑÐ¸Ð½Ð°Ñ Ñ glibc 2.19:
               _DEFAULT_SOURCE
           в glibc 2.19 и ÑÑаÑее:
               _BSD_SOURCE || _SVID_SOURCE

ÐÐÐСÐÐÐÐ
       ФÑнкÑии getprotoent_r(), getprotobyname_r() и
       getprotobynumber_r() ÑвлÑÑÑÑÑ ÑеенÑеÑабелÑнÑми
       ÑквиваленÑами  getprotoent(3), getprotobyname(3) и
       getprotobynumber(3), ÑооÑвеÑÑÑвенно. Ðни оÑлиÑаÑÑÑÑ
       ÑпоÑобом возвÑаÑа ÑÑÑÑкÑÑÑÑ protoent, ÑпиÑком
       паÑамеÑÑов и Ñипом возвÑаÑаемого знаÑениÑ.
       Ð ÑÑой ÑпÑавоÑной ÑÑÑаниÑе опиÑÐ°Ð½Ñ ÑолÑко
       ÑазлиÑÐ¸Ñ Ñ Ð½ÐµÑеенÑеÑабелÑнÑми ÑÑнкÑиÑми.

       ÐмеÑÑо возвÑаÑа ÑказаÑÐµÐ»Ñ Ð½Ð° ÑÑаÑиÑеÑки
       вÑделеннÑÑ ÑÑÑÑкÑÑÑÑ protoent в каÑеÑÑве ÑезÑлÑÑаÑа
       ÑÑи ÑÑнкÑии копиÑÑÑÑ ÑÑÑÑкÑÑÑÑ Ð² ÑаÑположение,
       Ñказанное result_buf.

       ÐаÑÑив buf иÑполÑзÑеÑÑÑ Ð´Ð»Ñ ÑÑÐ°Ð½ÐµÐ½Ð¸Ñ ÑÑÑоковÑÑ
       полей из возвÑаÑаемой ÑÑÑÑкÑÑÑÑ protoent
       (неÑеенÑеÑабелÑнÑе ÑÑнкÑии вÑделÑÑÑ ÑÑи ÑÑÑоки
       из ÑÑаÑиÑеÑкого ÑÑанилиÑа). Ð Ð°Ð·Ð¼ÐµÑ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾
       маÑÑива задаÑÑÑÑ Ð² buflen. ÐÑли buf ÑлиÑком мал,
       Ñо вÑзов завеÑÑаеÑÑÑ Ñ Ð¾Ñибкой ERANGE,
       вÑзÑваÑÑий должен его повÑоÑиÑÑ Ñ Ð±Ð¾Ð»ÑÑим
       бÑÑеÑом (Ð´Ð»Ñ Ð±Ð¾Ð»ÑÑинÑÑва пÑиложений должно
       бÑÑÑ Ð´Ð¾ÑÑаÑоÑно бÑÑеÑа длиной 1024 байÑ).

       ÐÑли вÑзов полÑÑил запиÑÑ Ð¾ пÑоÑоколе, Ñо
       *result ÑказÑÐ²Ð°ÐµÑ Ð½Ð° result_buf; в пÑоÑивном ÑлÑÑае
       *result ÑÑÑанавливаеÑÑÑ Ð² NULL.

ÐÐÐÐÐ ÐЩÐÐÐÐÐ ÐÐÐЧÐÐÐÐ
       ÐÑи ÑÑпеÑном вÑполнении ÑÑи ÑÑнкÑии
       возвÑаÑаÑÑ 0. ÐÑи оÑибке возвÑаÑаеÑÑÑ Ð¾Ð´Ð½Ð¾ из
       положиÑелÑнÑÑ Ð·Ð½Ð°Ñений, пеÑеÑиÑленнÑÑ Ð
       Ñазделе ÐШÐÐÐÐ.

       ÐÑи оÑибке, оÑÑÑÑÑÑвии запиÑи (getprotobyname_r(),
       getprotobynumber_r()) или конÑе даннÑÑ (getprotoent_r())
       знаÑение result Ñавно NULL.

ÐШÐÐÐÐ
       ENOENT (getprotoent_r()) ÐолÑÑе Ð½ÐµÑ Ð·Ð°Ð¿Ð¸Ñей в базе
              даннÑÑ.

       ERANGE Ð Ð°Ð·Ð¼ÐµÑ buf ÑлиÑком мал. ÐопÑобÑйÑе еÑÑ Ñаз
              Ñ Ð±Ð¾Ð»ÑÑим бÑÑеÑом (и ÑвелиÑеннÑм
              знаÑением buflen).

ÐТРÐÐУТЫ
       ÐпиÑание ÑеÑминов данного Ñаздела ÑмоÑÑиÑе
       в attributes(7).

       ┌─────────────────────┬────────────────────────────────┬────────────────┐
       │ÐнÑеÑÑÐµÐ¹Ñ        ÐÑÑибÑÑ                      ÐнаÑение │
       ├─────────────────────┼────────────────────────────────┼────────────────┤
       │getprotoent_r(),     │ ÐезвÑедноÑÑÑ Ð² ниÑÑÑ │ MT-Safe locale │
       │getprotobyname_r(),  │                                │                │
       │getprotobynumber_r() │                                │                │
       └─────────────────────┴────────────────────────────────┴────────────────┘

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       ÐÑи ÑÑнкÑии ÑвлÑÑÑÑÑ ÑаÑÑиÑениÑми GNU. ФÑнкÑии Ñ
       поÑожими именами еÑÑÑ Ð¸ в дÑÑÐ³Ð¸Ñ ÑиÑÑемаÑ,
       ÑоÑÑ Ð¸ Ñ Ð´ÑÑгим набоÑом паÑамеÑÑов.

ÐÐ ÐÐÐÐ
       ÐÑогÑамма, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð½Ð¸Ð¶Ðµ, иÑполÑзÑеÑ
       getprotobyname_r() Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñи о
       пÑоÑоколе Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼, ÑказаннÑм в командной
       ÑÑÑоке. ÐÑли задан вÑоÑой паÑамеÑÑ (Ñелое), Ñо
       он иÑполÑзÑеÑÑÑ ÐºÐ°Ðº наÑалÑное знаÑение buflen;
       еÑли getprotobyname_r() завеÑÑаеÑÑÑ Ñ Ð¾Ñибкой ERANGE,
       Ñо пÑогÑамма повÑоÑÑÐµÑ Ð¿Ð¾Ð¿ÑÑки Ñ Ð±Ð¾Ð»ÑÑими
       знаÑениÑми бÑÑеÑа. ÐаÑа пÑимеÑов ÑабоÑÑ Ð²
       ÑеанÑовой оболоÑке:

           $ ./a.out tcp 1
           ERANGE! ÐовÑÐ¾Ñ Ñ Ð±Ð¾Ð»ÑÑим бÑÑеÑом
           ÑезÑлÑÑÐ°Ñ getprotobyname_r(): 0 (ÑÑпеÑно)  (buflen=78)
           p_name=tcp; p_proto=6; aliases=TCP
           $ ./a.out xxx 1
           ERANGE! ÐовÑÐ¾Ñ Ñ Ð±Ð¾Ð»ÑÑим бÑÑеÑом
           ÑезÑлÑÑÐ°Ñ getprotobyname_r(): 0 (ÑÑпеÑно)  (buflen=100)
           ÐÑибка вÑзова/запиÑÑ Ð½Ðµ найдена

   ÐÑÑоднÑй код пÑогÑаммÑ

       #define _GNU_SOURCE
       #include <ctype.h>
       #include <netdb.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <errno.h>
       #include <string.h>

       #define MAX_BUF 10000

       int
       main(int argc, char *argv[])
       {
           int buflen, erange_cnt, s;
           struct protoent result_buf;
           struct protoent *result;
           char buf[MAX_BUF];
           char **p;

           if (argc < 2) {
               printf("ÐÑполÑзование: %s имÑ-пÑоÑокола [длина-бÑÑ]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           buflen = 1024;
           if (argc > 2)
               buflen = atoi(argv[2]);

           if (buflen > MAX_BUF) {
               printf("ÐÑевÑÑен ÑÐ°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа (%d)\n", MAX_BUF);
               exit(EXIT_FAILURE);
           }

           erange_cnt = 0;
           do {
               s = getprotobyname_r(argv[1], &result_buf,
                            buf, buflen, &result);
               if (s == ERANGE) {
                   if (erange_cnt == 0)
                       printf("ERANGE! ÐовÑÐ¾Ñ Ñ Ð±Ð¾Ð»ÑÑим бÑÑеÑом\n");
                   erange_cnt++;

                   /* УвелиÑиваем по байÑÑ Ð·Ð° Ñаз Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸
                      ÑоÑно ÑзнаÑÑ ÐºÐ°ÐºÐ¾Ð¹ ÑÐ°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа ÑÑебÑеÑÑÑ */

                   buflen++;

                   if (buflen > MAX_BUF) {
                       printf("ÐÑевÑÑен ÑÐ°Ð·Ð¼ÐµÑ Ð±ÑÑеÑа (%d)\n", MAX_BUF);
                       exit(EXIT_FAILURE);
                   }
               }
           } while (s == ERANGE);

           printf("ÑезÑлÑÑÐ°Ñ getprotobyname_r(): %s  (buflen=%d)\n",
                   (s == 0) ? "0 (ÑÑпеÑно)" : (s == ENOENT) ? "ENOENT" :
                   strerror(s), buflen);

           if (s != 0 || result == NULL) {
               printf("ÐÑибка вÑзова/запиÑÑ Ð½Ðµ найдена\n");
               exit(EXIT_FAILURE);
           }

           printf("p_name=%s; p_proto=%d; aliases=",
                       result_buf.p_name, result_buf.p_proto);
           for (p = result_buf.p_aliases; *p != NULL; p++)
               printf("%s ", *p);
           printf("\n");

           exit(EXIT_SUCCESS);
       }

СÐÐТРÐТРТÐÐÐÐ
       getprotoent(3), protocols(5)



GNU                               2016-03-15                  GETPROTOENT_R(3)