Разработка приложений в среде Linux - [206]

Шрифт
Интервал

> 35:   misc_conv, /* использование функции диалога TTY из libpam_misc */

> 36:   NULL /* у нас нет специальных данных для передачи в misc_conf */

> 37:  };

> 38:

> 39:  void check_success(pam_handle_t * pamh, int return_code) {

> 40:   if (return_code != PAM_SUCCESS) {

> 41:    fprintf (stderr, '"%s\n", pam_strerror(pamh, return_code));

> 42:    exit(1);

> 43:   }

> 44:  }

> 45:

> 46:  int main(int argc, const char ** argv) {

> 47:   pam_handle_t * pamh;

> 48:   struct passwd * pw;

> 49:   char * username=NULL, * service=NULL;

> 50:   int account = 1, session = 0;

> 51:   int c;

> 52:   poptContext optCon;

> 53:   struct poptOption optionsTable[] = {

> 54:    { "username", 'u', POPT_ARG_STRING, &username, 0,

> 55:      "Имя пользователя для аутентификации", "<имя_пользователя>" },

> 56:    { "service", 'S', РОPT_ARG_STRING, &service, 0,

> 57:      "Имя службы для инициализации как (pamsample)",

> 58:      "<служба>" },

> 59:    { "account", 'a', POPT_ARG_NONE|POPT_ARGFLAG_XOR,

> 60:      &account, 0,

> 61:      "включение/выключение управления учетными записями (включено)", "" },

> 62:    { "session", 's', POPT_ARG_NONE|POPT_ARGFLAG_XOR,

> 63:      &session, 0,

> 64:      "включение/выключение запуска сеанса (выключено)", "" },

> 65:    POPT_AUTOHELP

> 66:    POPT_TABLEEND

> 67:   };

> 68:

> 69:   optCon = poptGetContext("pamexample", argc, argv,

> 70:    optionsTable, 0);

> 71:   if ((c = poptGetNextOpt(optCon)) < -1) {

> 72:    fprintf(stderr, "%s: %s\n",

> 73:    poptBadOption(optCon, POPT_BADOPTION_NOALIAS),

> 74:    poptStrerror(c));

> 75:    return 1;

> 76:   }

> 77:   poptFreeContext(optCon);

> 78:

> 79:   if (!service) {

> 80:    /* Обратите внимание, что обычное приложение не должно предоставлять

> 81:     * этот параметр пользователю; он присутствует здесь, чтобы можно было

> 82:     * проверить это приложение, не производя изменений в системе,

> 83:     * требующих доступа root.

> 84:     */

> 85:   service = "pamexample";

> 86:  }

> 87:

> 88:  if (!username) {

> 89:   /* по умолчанию для текущего пользователя */

> 90:   if (!(pw = getpwuid (getuid())) ) {

> 91:    fprintf(stderr, "Имя пользователя не существует");

> 92:    exit(1);

> 93:   }

> 94:   username = strdup(pw->pw_name);

> 95:  }

> 96:

> 97:  с = pam_start(service, username, &my_conv, &pamh);

> 98:  check_success(pamh, c);

> 99:

>100:  с = pam_authenticate(pamh, 0);

>101:  check_success(pamh, c);

>102:

>103:  if (account) {

>104:   /* если аутентификация не была закончена, управление

>105:    * учетной записью не определено

>106:    */

>107:   с = pam_acct_mgmt(pamh, 0);

>108:   check_success(pamh, с);

>109:  }

>110:

>111:  if (session) {

>112:   /* В случае необходимости мы могли бы организовывать здесь ветвление */

>113:   с = pam_open_session(pamh, 0);

>114:   check_success(pamh, с);

>115:

>116:   /* Обратите внимание, что здесь не устанавливается uid, gid

>117:      или дополнительные группы */

>118:   с = pam_setcred(pamh, 0);

>119:

>120:   /* В случае необходимости мы могли бы закрыть здесь полномочия */

>121:

>122:   /* Вызов оболочки, которая была "аутентифицирована" */

>123:   printf("Запуск оболочки...\n");

>124:   system("exec bash -");

>125:

>126:   /* Здесь мы могли бы использовать wait4(), если бы организовывали

>127:      ветвление вместо вызова system() */

>128:   с = pam_close_session(pamh, 0);

>129:   check_success(pamh, с);

>130:  }

>131:

>132:  /* Реальные приложения могли бы сообщать о сбое вместо

>133:   * выхода, что мы и делали в check_success на каждой стадии,

>134:   * поэтому в таких случаях с может иметь значения, отличные

>135:   * от PAM_SUCCESS.

>136:   */

>137:  с = pam_end(pamh, с);

>138:  check_success(pamh, с);

>139:

>140:  return 0;

>141: }

Приложения

Приложение A

Заголовочные файлы

В этом приложении показаны все локальные заголовочные файлы для исходного кода, рассмотренного в книге.

>1: /* libhello.h */

>2:

>3: #ifndef LIBHELLO_H_

>4: #define LIBHELLO_H_

>5:

>6: void print_hello(void);

>7:

>8: #endif /* LIBHELLO_H_ */


>1: /* ptypair.h */

>2:

>3: #ifndef _PTYPAIR_H

>4: #define _PTYPAIR_H

>5: int get_master_pty(char **name);

>6: int get_slave_pty(char *name);

>7: #endif /* _PTYPAIR_H */


>1: /* sockutil.h */

>2:

>3: void die(char * message);

>4: void copyData(int from, int to);

>5: #ifndef CMSG_DATA

>6: #define CMSG_DATA (cmsg) ((cmsg)->cmsg_data)

>7: #endif

Приложение Б

Исходный код >ladsh

>  1: /* ladsh4.c */

>  2:

>  3: #define _GNU_SOURCE

>  4:

>  5: #include

>  6: #include

>  7: #include

>  8: #include

>  9: #include

> 10: #include

> 11: #include

> 12: #include

> 13: #include

> 14: #include

> 15: #include

> 16:

> 17: #define MAX_COMMAND_LEN 250 /* максимальная длина одной

> 18:                                командной строки */

> 19: #define JOB_STATUS_FORMAT "[%d] %-22s %.40s\n"

> 20:

> 21: struct jobSet {

> 22:  struct job * head; /* заголовок списка выполняющихся заданий */

> 23:  struct job * fg; /* текущее высокоприоритетное задание */

> 24: };

> 25:

> 26: enum redirectionType { REDIRECT_INPUT, REDIRECT_OVERWRITE,

> 27:                        REDIRECT_APPEND };

> 28:

> 29: struct redirectionSpecifier {

> 30:  enum redirectionType type; /* тип переадресации */

> 31:  int fd;                    /* переадресация fd */


Рекомендуем почитать
Виртуальные  машины: несколько компьютеров в  одном

Применение виртуальных машин дает различным категориям пользователей — от начинающих до IT-специалистов — множество преимуществ. Это и повышенная безопасность работы, и простота развертывания новых платформ, и снижение стоимости владения. И потому не случайно сегодня виртуальные машины переживают второе рождение.В книге рассмотрены три наиболее популярных на сегодняшний день инструмента, предназначенных для создания виртуальных машин и управления ими: Virtual PC 2004 компании Microsoft, VMware Workstation от компании VMware и относительно «свежий» продукт — Parallels Workstation, созданный в компании Parallels.


Недокументированные и малоизвестные возможности Windows XP

Книга содержит подробные сведения о таких недокументированных или малоизвестных возможностях Windows XP, как принципы работы с программами rundll32.exe и regsvr32.exe, написание скриптов сервера сценариев Windows и создание INF-файлов. В ней приведено описание оснасток, изложены принципы работы с консолью управления mmc.exe и параметрами реестра, которые изменяются с ее помощью. Кроме того, рассмотрено большое количество средств, позволяющих выполнить тонкую настройку Windows XP.Эта книга предназначена для опытных пользователей и администраторов, которым интересно узнать о нестандартных возможностях Windows.


Windows Vista. Мультимедийный курс

Эта книга поможет вам разобраться в премудростях операционной системы Windows Vista.Информационная насыщенность учебного материала позволяет утверждать, что мультимедийный курс будет интересен и новичкам, и опытным пользователям.


FAQ по смартфону Qtek 8300/8310

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Домашние и офисные сети под Vista и XP

Количество персональных компьютеров в нашей стране растет год от года. Сегодня во многих семьях имеется два или даже три компьютера.Чтобы воспользоваться всеми преимуществами такой ситуации, компьютеры в вашей квартире стоит объединить сетью. Это позволит вам играть по сети в компьютерные игры, совместно использовать дисковое пространство, принтеры, модемы и другие устройства, всю сеть можно соединить с Интернетом. А в офисах сеть между компьютерами просто необходима.Открывающиеся перспективы выглядят очень заманчиво.


Свободные программы и системы в школе

Курс лекций, включенных в брошюру, знакомит читателя с популярными свободными программами и системами, полезными при преподавании информатики в средней школе. В обзор вошли основы открытых операционных систем, сведения о пакете «офисных» программ OpenOffice.org, коммуникационном пакете Mozilla, графическом редакторе GIMP, современных графических средах GNOME и KDE и других программах.Для преподавателей информатики и методистов, а также для студентов и аспирантов соответствующих специальностей.© 2002-3, Максим Отставнов.© 2002, Андрей Добровольский (раздел 3.1).Использован текст лекций, публиковавшихся автором в приложении к газете «Первое сентября» «Информатика» (http://inf.1september.ru) в 2002-3 г., материалы брошюры «Прикладные свободные программы в школе» (М.: 2003 г.), а также фрагменты статей, ранее публиковавшихся в журналах «Компьютерра» и «Домашний компьютер».Материалы, представленные в этой книге, также доступны в Интернет на странице www.otstavnov.com/fsft на условиях Свободной лицензии ГНУ на документацию (GNU FDL)