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

传真(Fax)编程

开发平台:

C/C++

  1. /* $Id: */
  2. /*
  3.  * Copyright (c) 1990-1996 Sam Leffler
  4.  * Copyright (c) 1991-1996 Silicon Graphics, Inc.
  5.  * Copyright (c) 2003 iFax Solutions, Inc.
  6.  *
  7.  * HylaFAX is a trademark of Silicon Graphics
  8.  *
  9.  * Permission to use, copy, modify, distribute, and sell this software and 
  10.  * its documentation for any purpose is hereby granted without fee, provided
  11.  * that (i) the above copyright notices and this permission notice appear in
  12.  * all copies of the software and related documentation, and (ii) the names of
  13.  * Sam Leffler and Silicon Graphics may not be used in any advertising or
  14.  * publicity relating to the software without the specific, prior written
  15.  * permission of Sam Leffler and Silicon Graphics.
  16.  * 
  17.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, 
  18.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY 
  19.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  
  20.  * 
  21.  * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR
  22.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  23.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  24.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF 
  25.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE 
  26.  * OF THIS SOFTWARE.
  27.  */
  28. #include "config.h"
  29. #include "Str.h"
  30. #include "Sys.h"
  31. #include "SystemLog.h"
  32. #include "Sequence.h"
  33. #include <sys/file.h>
  34. #include <errno.h>
  35. const fxStr Sequence::format("%09u");
  36. u_long Sequence::getNext(const char* name, fxStr& emsg)
  37. {
  38.     struct stat sb;
  39.     int fd;
  40.     int rtn = lstat(name, &sb);
  41.     if (rtn != 0 && errno == ENOENT) {
  42.         fd = Sys::open(name, O_CREAT | O_RDWR | O_EXCL, 0644);
  43.     } else if (rtn == 0 && S_ISREG(sb.st_mode)) {
  44.         fd = Sys::open(name, O_RDWR, 0644);
  45.         struct stat sb2;
  46.         if (fd < 0 || fstat(fd, &sb2)) {
  47.             //XXX some kind of error opening file
  48.             fd = -1;
  49.         } else if (sb.st_ino != sb2.st_ino || sb.st_dev != sb2.st_dev) {
  50.             //XXX something wrong with file
  51.             fd = -1;
  52.         }
  53.     } else {
  54.         //XXX some kind of error opening file
  55.         fd = -1;
  56.     }
  57.     if (fd < 0) {
  58.         emsg = fxStr::format("Unable to open sequence number file %s; %s.",
  59.             name, strerror(errno));
  60.         logError("%s: open: %s", name, strerror(errno));
  61.         return ((u_long) -1);
  62.     }
  63.     flock(fd, LOCK_EX);
  64.     u_long seqnum = 1;
  65.     char line[1024];
  66.     int n = read(fd, line, sizeof (line));
  67.     line[n < 0 ? 0 : n] = '';
  68.     if (n > 0) {
  69.         seqnum = atol(line);
  70.     }
  71.     if (seqnum < 1 || seqnum >= MAXSEQNUM) {
  72.         logWarning("%s: Invalid sequence number "%s", resetting to 1",
  73.             name, line);
  74.         seqnum = 1;
  75.     }
  76.     fxStr line2 = fxStr::format("%u", NEXTSEQNUM(seqnum));
  77.     lseek(fd, 0, SEEK_SET);
  78.     int len = line2.length();
  79.     if (Sys::write(fd, (const char*)line2, len) != len ||
  80.             ftruncate(fd, len)) {
  81.         emsg = fxStr::format(
  82.             "Unable update sequence number file %s; write failed.", name);
  83.         logError("%s: Problem updating sequence number file", name);
  84.         return ((u_long) -1);
  85.     }
  86.     Sys::close(fd); // NB: implicit unlock
  87.     return (seqnum);
  88. }