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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: faxdeluser.c,v 1.3 2006/06/22 15:06:36 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 <sys/types.h>
  26. #include <sys/stat.h>
  27. #include <pwd.h>
  28. #include <string.h>
  29. #include <stdio.h>
  30. #include <stdarg.h>
  31. #include <errno.h>
  32. #include <fcntl.h>
  33. #include <stdlib.h>
  34. #include <unistd.h>
  35. #include <ctype.h>
  36. #include "config.h"
  37. #include "port.h"
  38. int
  39. main(int argc, char** argv)
  40. {
  41.     FILE* hf = NULL;
  42.     int c;
  43.     int fd;
  44.     int i;
  45.     int len1, len2;
  46.     int skip, skpchr;
  47.     char* hostfile = FAX_SPOOLDIR "/" FAX_PERMFILE;
  48.     char buff[256];
  49.     char newhostfile[256];
  50.     const char* usage = "faxdeluser [ -f hosts-file] username";
  51.     struct passwd* pw;
  52.     
  53.     while ((c = getopt(argc, argv, "f:?:")) != -1) {
  54.         switch (c) {
  55.         case 'f':
  56.             hostfile = optarg;
  57.             break;
  58.         case '?':
  59.         default:
  60.             printf("Usage: %sn", usage);
  61.             break;
  62.         }
  63.     }
  64.     if ((hf = fopen(hostfile, "r+")) == NULL) {
  65.         snprintf(buff, sizeof(buff), "Error - cannot open file: %s", hostfile);
  66.         perror(buff);
  67.         return -1;
  68.     }
  69.     snprintf(newhostfile, sizeof(newhostfile), "%s.%i", hostfile, (int)getpid());
  70.     fd = open(newhostfile, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);
  71.     if (fd == -1) {
  72.         snprintf(buff, sizeof(buff), "Error cannot open file %s", newhostfile);
  73.         perror(buff);
  74.         return -1;
  75.     }
  76.     while (fgets(buff, sizeof(buff), hf)) {
  77.         skip = 0;
  78. skpchr = 0;
  79.         for (i = optind; i < argc; i++) {
  80.             len1 = strcspn(buff, ":n@$");
  81.             len2 = strlen(argv[i]);
  82.     if (strspn(buff, "^") > 0) {
  83. skpchr = 1;
  84. len1--;
  85.     }
  86.             if (len1 == len2 && !strncmp(buff+skpchr, argv[i], len1)) {
  87.                 skip = 1;
  88.                 break;
  89.             } 
  90.         }
  91.         if (!skip) {
  92.             if (write(fd, buff, strlen(buff)) == -1) {
  93.                 snprintf(buff, sizeof(buff), "Error writing to file %s", newhostfile);
  94.                 perror(buff);
  95.                 return -1;
  96.             }
  97.         }
  98.     }
  99.     fclose(hf);
  100.     close(fd);
  101.     if (rename(newhostfile, hostfile)) {
  102.         perror("Error writing hosts file");
  103.         return -1;
  104.     }
  105.     pw = getpwnam(FAX_USER);
  106.     if (pw == NULL || chown(hostfile, pw->pw_uid, pw->pw_uid)) {
  107.         perror("Error writing hosts file");
  108.         return -1;
  109.     }
  110.     return 0;
  111. }