Changeset 355 for trunk/src


Ignore:
Timestamp:
Sep 5, 2011, 6:21:54 PM (13 years ago)
Author:
katerina
Message:

Patch for ticket #260 (update from file list).

Location:
trunk/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/sh_getopt.c

    r347 r355  
    8080    HAS_ARG_NO,
    8181    sh_util_set_interactive },
     82  { N_("listfile"), 
     83    '-',
     84    N_("Run update with listfile"), 
     85    HAS_ARG_YES,
     86    sh_util_update_file },
    8287#endif
    8388#if defined(SH_WITH_SERVER) || defined(SH_WITH_CLIENT)
  • trunk/src/sh_utils.c

    r305 r355  
    107107
    108108  sh_ask_update = S_TRUE;
    109 
    110109  sh_unix_setnodeamon(NULL);
    111110
    112111  return 0;
    113112}
     113
     114static char * sh_update_file = NULL;
     115
     116int sh_util_update_file (const char * str)
     117{
     118  if (str)
     119    {
     120      if (0 == access(str, R_OK)) /* flawfinder: ignore */
     121        {
     122          if (NULL != sh_update_file)
     123            SH_FREE(sh_update_file);
     124          sh_update_file = sh_util_strdup(str);
     125          sh_ask_update = S_TRUE;
     126          sh_unix_setnodeamon(NULL);
     127          return 0;
     128        }
     129      else
     130        {
     131          char ebuf[SH_ERRBUF_SIZE];
     132          int  errnum = errno;
     133
     134          sh_error_message(errnum, ebuf, sizeof(ebuf));
     135          sh_error_handle (SH_ERR_ERR, FIL__, __LINE__, errnum, MSG_E_SUBGEN,
     136                           ebuf, _("sh_util_update_file") );
     137         
     138          return -1;
     139        }
     140    }
     141
     142  return -1;
     143}
     144
    114145
    115146#if !defined(STDIN_FILENO)
     
    120151#endif
    121152
     153/* Returns S_FALSE if no update desired
     154 */
     155int sh_util_update_checkfile(const char * path)
     156{
     157  FILE * fd = fopen(sh_update_file, "r");
     158  char * line;
     159
     160  if (!fd)
     161    {
     162      uid_t  euid;
     163      int errnum = errno;
     164      sl_get_euid(&euid);
     165      sh_error_handle (SH_ERR_ERR, FIL__, __LINE__, errnum, MSG_NOACCESS,
     166                       (long) euid, sh_update_file);
     167      aud_exit (FIL__, __LINE__, EXIT_FAILURE);
     168      return S_FALSE;
     169    }
     170
     171  line = SH_ALLOC(8192);
     172
     173  while (NULL != fgets(line, 8192, fd))
     174    {
     175      char * nl = strrchr(line, '\n');
     176
     177      if (nl)
     178        {
     179          *nl = '\0';
     180
     181          /* Check for MS Windows line terminator
     182           */
     183          if (nl > line) --nl;
     184          if (*nl == '\r')
     185            *nl = '\0';
     186        }
     187
     188      if (0 == sl_strcmp(line, path))
     189        {
     190          SH_FREE(line);
     191          fclose(fd);
     192          return S_TRUE;
     193        }
     194    }
     195  SH_FREE(line);
     196  fclose(fd);
     197  return S_FALSE;
     198}
     199
     200/* Returns S_FALSE if no update desired
     201 */
    122202int sh_util_ask_update(const char * path)
    123203{
     
    130210  if (sh_ask_update != S_TRUE)
    131211    {
     212      SL_RETURN(i, _("sh_util_ask_update"));
     213    }
     214
     215  if (sh_update_file)
     216    {
     217      i = sh_util_update_checkfile(path);
    132218      SL_RETURN(i, _("sh_util_ask_update"));
    133219    }
Note: See TracChangeset for help on using the changeset viewer.