faxadduser.c
上传用户:weiyuanprp
上传日期:2020-05-20
资源大小:1169k
文件大小:4k
源码类别:

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxadduser.c,v 1.6 2006/08/12 00:26:53 faxguy Exp $ */
  2. /*
  3.  * Copyright (c) 1999 Robert Colquhoun
  4.  *
  5.  *
  6.  * Permission to use, copy, modify, distribute, and sell this software and 
  7.  * its documentation for any purpose is hereby granted without fee, provided
  8.  * that (i) the above copyright notices and this permission notice appear in
  9.  * all copies of the software and related documentation, and (ii) the names of
  10.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  11.  * publicity relating to the software without the specific, prior written
  12.  * permission of Sam Leffler and Silicon Graphics.
  13.  * 
  14.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  15.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  16.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  17.  * 
  18.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  19.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  20.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  21.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  22.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  23.  * OF THIS SOFTWARE.
  24.  */
  25. #include <string.h>
  26. #include <stdio.h>
  27. #include <stdarg.h>
  28. #include <errno.h>
  29. #include <fcntl.h>
  30. #include <stdlib.h>
  31. #include <unistd.h>
  32. #include <ctype.h>
  33. #include <time.h>
  34. #include "config.h"
  35. #include "port.h"
  36. #if HAS_CRYPT_H
  37. #include <crypt.h>
  38. #endif
  39. #ifndef FAX_DEFAULT_UID
  40. #define FAX_DEFAULT_UID 60002
  41. #endif
  42. extern int optind;
  43. extern char* optarg;
  44. const char passwd_salts[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789./";
  45. const char* usage = "faxadduser [-a admin-password] [-f hosts-file] 
  46. [-h host-name] [-p password] [-u uid] username";
  47. int
  48. main(int argc, char** argv)
  49. {
  50.     char buff[256];
  51.     char salt_buff[2];
  52.     FILE* hf = NULL;
  53.     int c;
  54.     int salt;
  55.     char* hostfile = FAX_SPOOLDIR "/" FAX_PERMFILE;
  56.     char* password = NULL;
  57.     char* adminword = NULL;
  58.     char* hostname = NULL;
  59.     int uid = FAX_DEFAULT_UID;
  60.     
  61.     while ((c = getopt(argc, argv, "a:f:h:p:u:")) != -1) {
  62.         switch (c) {
  63.         case 'a':
  64.             adminword = optarg;
  65.             break;
  66.         case 'f':
  67.             hostfile = optarg;
  68.             break;
  69.         case 'h':
  70.             hostname = optarg;
  71.             break;
  72.         case 'p':
  73.             password = optarg;
  74.             break;
  75.         case 'u':
  76.             uid = atoi(optarg);
  77.             break;
  78.         case '?':
  79.         default:
  80.             printf("Usage: %sn", usage);
  81.             break;
  82.         }
  83.     }
  84.     hf = fopen(hostfile, "a+");
  85.     if (hf == NULL) {
  86.         snprintf(buff, sizeof(buff), "Error - cannot open hosts file: %s", hostfile);
  87.         perror(buff);
  88.         return 0;
  89.     }
  90.     srand(time(NULL));
  91.     while (optind < argc) {
  92.         fprintf(hf, "^%s@", argv[optind++]);
  93. if (hostname != NULL) fprintf(hf, "%s$", hostname);
  94.         if (uid != FAX_DEFAULT_UID) {
  95.             fprintf(hf, ":%i", uid);
  96.         } else if (password != NULL || adminword != NULL) {
  97.             fprintf(hf, ":");
  98.         }
  99.         if (password != NULL) {
  100.             salt = (int)(4096.0 * rand() / (RAND_MAX + 1.0));
  101.             salt_buff[0] = passwd_salts[salt / 64];
  102.             salt_buff[1] = passwd_salts[salt % 64];
  103.             fprintf(hf, ":%s", crypt(password, salt_buff));
  104.         } else if (adminword != NULL) {
  105.             fprintf(hf, ":");
  106.         }
  107.         if (adminword != NULL) {
  108.             salt = (int)(4096.0 * rand() / (RAND_MAX + 1.0));
  109.             salt_buff[0] = passwd_salts[salt / 64];
  110.             salt_buff[1] = passwd_salts[salt % 64];
  111.             fprintf(hf, ":%s", crypt(adminword, salt_buff));
  112.         }
  113.         fprintf(hf, "n");
  114.     }
  115.     fclose(hf);
  116.     return 0;
  117. }