~ubuntu-branches/ubuntu/lucid/dpkg/lucid

« back to all changes in this revision

Viewing changes to lib/myopt.c

  • Committer: Bazaar Package Importer
  • Author(s): Guillem Jover, Guillem Jover, Raphael Hertzog, Modestas Vainius, Updated dpkg translations, Updated dselect translations, Updated man page translations, Updated scripts translations
  • Date: 2009-09-06 09:37:45 UTC
  • mto: (1.4.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 68.
  • Revision ID: james.westby@ubuntu.com-20090906093745-orb3im04ozfxypis
Tags: 1.15.4
[ Guillem Jover ]
* Call _g instead of g_ in dpkg-name.
* Fix inverted logic when deciding to assume the architecture in dpkg-name
  when the package didn't have such field.
* Do not take into account Revision and Package_Revision fields in dpkg-name
  and dpkg-scanpackages as they have been handled already by “dpkg-deb -I”.
* Switch dpkg-scansources to use Dpkg::Cdata instead of duplicating the
  .dsc parsing code. As a side effect it now handles properly bogus files.
* Do not remap obsolete fields in dpkg-scanpackages as they have been
  handled already by “dpkg-deb -I”.
* Properly mark packages being purged for disappearance from the database.
  This will make the status database not be left behind with traces of old
  not-installed packages. Closes: #472208
* On parse mark not-installed leftover packages for automatic removal from
  the database on next dump. This obsoletes the --forget-old-unavail option,
  thus making it now a no-op. Closes: #33394, #429262
* Document “hold” under package selection states instead of flags in dpkg(1).
* Remove trailing ‘/’ and ‘/.’ from the directory name to be used as the
  package name on “dpkg-deb -b”. Closes: #218018, #373602
* Remove obsolete ‘hold’ and ‘hold-reinstreq’ internal status flags.
* Add fakeroot to dpkg-dev Recommends. Closes: #536821
* Fix an always false test when trying to decide which package to deselect
  to resolve a dependency problem in dselect.
* Add uClibc Linux support to ostable and triplettable. Closes: #455501
* Add uClinux support to ostable and triplettable.
  Thanks to Simon Richter <sjr@debian.org>.
* When aborting due to file conflicts print the version of the conflicted
  package. Closes: #540019
* Remove double slash in database path visible to the user in some error
  conditions.
* Stop macthing sparc64-*-* GNU triplets with sparc Debian architecture.
* Add support for config.d style directories in dpkg and dselect,
  (/etc/dpkg/dpkg.cfg.d and /etc/dpkg/dselect.cfg.d respectively).
* Define DPKG_MAINTSCRIPT_ARCH on the maintainer script environment to the
  architecture the package got built for.
* Document DPKG_MAINTSCRIPT_PACKAGE maintainer script environment variable
  in dpkg man page.
* Document DPKG_RUNNING_VERSION maintainer script environment variable
  in dpkg man page.
* Change po4a usage to not create unwated changes depending if doing out or
  in-tree builds.
* Use po4a “--previous” support when updating the man pages.
  Suggested by Christian Perrier <bubulle@debian.org>.
* On configuration error print file name and line number.
* Allow quoting values in configuration file options.
* Add new --pre-invoke and --post-invoke hooks in dpkg.
* Add new --control-path command to dpkg-query.
* Use ohshit on bad version syntax in --compare-versions.
* Add Multi-Arch to the list of known binary package fields for dpkg-dev.
  Thanks to Steve Langasek <vorlon@debian.org>.

[ Raphael Hertzog ]
* Replace install-info by a wrapper around GNU's install-info. The wrapper
  will be dropped in squeeze+1. dpkg now Breaks: old versions of
  info-browsers that do not depend on the new install-info package
  that provides the real functionality. Closes: #9771, #523980
  See http://wiki.debian.org/Transitions/DpkgToGnuInstallInfo for details.
* Fix dpkg's preinst in case /var/lib/dpkg/alternatives contains unexpected
  sub-directories. Closes: #535138
  And also when one of the file doesn't contain correct alternatives
  information (improper number of lines). Closes: #537558
* Upgrade Standards-Version to 3.8.2 (no changes).
* Update deb-substvars(5) to list fields that do not support substvars.
  Closes: #535353
* Fix dpkg-parsechangelog to include all entries with -v0 parameter.
  Closes: #537800
* Fix update-alternatives to mention the correct slave link that can't
  be installed due to a conflicting file instead of quoting the master link.
* Add support for extra override file in dpkg-scanpackages. Thanks to Robert
  Millan for the patch. Closes: #537559
* Add support for extra override file in dpkg-scansources.
* Document format of extra override file in a new manual page
  deb-extra-override(5).
* Update sample in dpkg-gensymbols(1) to give an accurate listing of
  64 bit arches. Thanks to Julien Cristau for the patch. Closes: #540382
* Create /etc/cron.daily/dpkg to handle the backup of
  /var/lib/dpkg/status in /var/backups. This is taken out of the cron
  package and need no conflicts/breaks as the code does nothing if
  the current status file is already backupped. Thanks to Leo 'costela'
  Antunes <costela@debian.org> for the patch. Closes: #541412
* Change behaviour of dpkg --merge-avail to not update a package's
  information if the version provided is older than the one already listed
  in the available file. Thanks to Ian Jackson
  <ian@davenant.greenend.org.uk> for the patch. Closes: #496114
* dpkg-architecture can now export DEB_{HOST,BUILD}_ARCH_{BITS,ENDIAN}
  (pointer size and endianness):
  - cputable (in dpkg) modified to contain those information
  - dpkg-dev depends on dpkg (>= 1.15.4) to ensure that we have an updated
    cputable (and so that a versioned build-dependency on dpkg-dev is enough
    to use this new feature)
  Closes: #531307
* Split overly long Binary: field values over multiple lines. This is
  allowed since policy 3.8.3. Closes: #494714
* Improve performance of dpkg-shlibdeps by caching minimal version
  associated to each library in Dpkg::Shlib::SymbolFile. Thanks to
  Jiří Paleček <jpalecek@web.de> for the patch.
* Slightly improve dpkg-source(1) by giving the section name that we're
  referring to. Closes: #544037
* Fix translation error in german manpage of dpkg-buildpackage. Thanks
  to Joachim Breitner <nomeata@debian.org>. Closes: #541829

[ Modestas Vainius ]
* Provide a meaningful label for dpkg-gensymbols diff.

[ Updated dpkg translations ]
* Asturian (Marcos Alvarez Costales). Closes: #535327
* French (Christian Perrier).
* German (Sven Joachim).
* Italian (Milo Casagrande). Closes: #536538
* Russian (Yuri Kozlov). Closes: #542254
* Slovak (Ivan Masár). Closes: #537742
* Swedish (Peter Krefting).

[ Updated dselect translations ]
* Russian (Yuri Kozlov). Closes: #542254
* Slovak (Ivan Masár). Closes: #537741

[ Updated man page translations ]
* French (Christian Perrier).
* German (Helge Kreutzmann), proofread by Jens Seidel.
* Swedish (Peter Krefting).

[ Updated scripts translations ]
* French completed (Christian Perrier).
* German (Helge Kreutzmann).
* Russian (Yuri Kozlov). Closes: #542254
* Swedish (Peter Krefting).

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 * libdpkg - Debian packaging suite library routines
3
 
 * myopt.c - my very own option parsing
4
 
 *
5
 
 * Copyright © 1994,1995 Ian Jackson <ian@chiark.greenend.org.uk>
6
 
 * Copyright © 2000,2002 Wichert Akkerman <wichert@deephackmode.org>
7
 
 *
8
 
 * This is free software; you can redistribute it and/or modify
9
 
 * it under the terms of the GNU General Public License as
10
 
 * published by the Free Software Foundation; either version 2,
11
 
 * or (at your option) any later version.
12
 
 *
13
 
 * This is distributed in the hope that it will be useful, but
14
 
 * WITHOUT ANY WARRANTY; without even the implied warranty of
15
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
 
 * GNU General Public License for more details.
17
 
 *
18
 
 * You should have received a copy of the GNU General Public
19
 
 * License along with this file; if not, write to the Free Software
20
 
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21
 
 */
22
 
#include <config.h>
23
 
#include <compat.h>
24
 
 
25
 
#include <dpkg-i18n.h>
26
 
 
27
 
#include <string.h>
28
 
#include <errno.h>
29
 
#include <ctype.h>
30
 
#include <stdarg.h>
31
 
#include <stdlib.h>
32
 
 
33
 
#include <myopt.h>
34
 
#include <dpkg.h>
35
 
 
36
 
void
37
 
badusage(const char *fmt, ...)
38
 
{
39
 
  char buf[1024];
40
 
  va_list al;
41
 
 
42
 
  va_start(al, fmt);
43
 
  vsnprintf(buf, sizeof(buf), fmt, al);
44
 
  va_end(al);
45
 
 
46
 
  ohshit("%s\n\n%s", buf, gettext(printforhelp));
47
 
}
48
 
 
49
 
void myfileopt(const char* fn, const struct cmdinfo* cmdinfos) {
50
 
  FILE* file;
51
 
  char linebuf[MAX_CONFIG_LINE];
52
 
 
53
 
  file= fopen(fn, "r");
54
 
  if (!file) {
55
 
    if (errno==ENOENT)
56
 
      return;
57
 
    warning(_("failed to open configuration file '%.255s' for reading: %s"),
58
 
            fn, strerror(errno));
59
 
    return;
60
 
  }
61
 
 
62
 
  while (fgets(linebuf, sizeof(linebuf), file)) {
63
 
    char* opt;
64
 
    const struct cmdinfo *cip;
65
 
    int l;
66
 
 
67
 
    if ((linebuf[0] == '#') || (linebuf[0] == '\n') || (linebuf[0] == '\0'))
68
 
      continue;
69
 
    l=strlen(linebuf);
70
 
    if (linebuf[l - 1] == '\n')
71
 
      linebuf[l - 1] = '\0';
72
 
    for (opt=linebuf;isalnum(*opt)||*opt=='-';opt++) ;
73
 
    if (*opt == '\0')
74
 
      opt=NULL;
75
 
    else {
76
 
      *opt++ = '\0';
77
 
      if (*opt=='=') opt++;
78
 
      while (isspace(*opt)) opt++;
79
 
    }
80
 
 
81
 
    for (cip=cmdinfos; cip->olong || cip->oshort; cip++) {
82
 
      int l;
83
 
      if (!cip->olong) continue;
84
 
      if (!strcmp(cip->olong,linebuf)) break;
85
 
      l=strlen(cip->olong);
86
 
      if ((cip->takesvalue==2) && (linebuf[l]=='-') &&
87
 
          !opt && !strncmp(linebuf,cip->olong,l)) {
88
 
        opt=linebuf+l+1;
89
 
        break;
90
 
      }
91
 
    }
92
 
 
93
 
    if (!cip->olong) ohshite(_("configuration error: unknown option %s"), linebuf);
94
 
 
95
 
    if (cip->takesvalue) {
96
 
      if (!opt) ohshite(_("configuration error: %s needs a value"), linebuf);
97
 
      if (cip->call) cip->call(cip,opt);
98
 
      else
99
 
        *cip->sassignto = m_strdup(opt);
100
 
    } else {
101
 
      if (opt) ohshite(_("configuration error: %s does not take a value"), linebuf);
102
 
      if (cip->call) cip->call(cip,NULL);
103
 
      else *cip->iassignto= cip->arg;
104
 
    }
105
 
  }
106
 
  if (ferror(file)) ohshite(_("read error in configuration file `%.255s'"), fn);
107
 
  if (fclose(file)) ohshite(_("error closing configuration file `%.255s'"), fn);
108
 
}
109
 
 
110
 
void loadcfgfile(const char *prog, const struct cmdinfo* cmdinfos) {
111
 
  char *home, *file;
112
 
  int l1, l2;
113
 
  l1 = strlen(CONFIGDIR "/.cfg") + strlen(prog);
114
 
  file = m_malloc(l1 + 1);
115
 
  sprintf(file, CONFIGDIR "/%s.cfg", prog);
116
 
  myfileopt(file, cmdinfos);
117
 
  if ((home = getenv("HOME")) != NULL) {
118
 
    l2 = strlen(home) + 1 + strlen("/.cfg") + strlen(prog);
119
 
    if (l2 > l1) {
120
 
      free(file);
121
 
      file = m_malloc(l2 + 1);
122
 
    }
123
 
    sprintf(file, "%s/.%s.cfg", home, prog);
124
 
    myfileopt(file, cmdinfos);
125
 
  }
126
 
  free(file);
127
 
}
128
 
 
129
 
void myopt(const char *const **argvp, const struct cmdinfo *cmdinfos) {
130
 
  const struct cmdinfo *cip;
131
 
  const char *p, *value;
132
 
  int l;
133
 
 
134
 
  ++(*argvp);
135
 
  while ((p= **argvp) && *p == '-') {
136
 
    ++(*argvp);
137
 
    if (!strcmp(p,"--")) break;
138
 
    if (*++p == '-') {
139
 
      ++p; value=NULL;
140
 
      for (cip= cmdinfos;
141
 
           cip->olong || cip->oshort;
142
 
           cip++) {
143
 
        if (!cip->olong) continue;
144
 
        if (!strcmp(p,cip->olong)) break;
145
 
        l= strlen(cip->olong);
146
 
        if (!strncmp(p,cip->olong,l) &&
147
 
            (p[l]== ((cip->takesvalue==2) ? '-' : '='))) { value=p+l+1; break; }
148
 
      }
149
 
      if (!cip->olong) badusage(_("unknown option --%s"),p);
150
 
      if (cip->takesvalue) {
151
 
        if (!value) {
152
 
          value= *(*argvp)++;
153
 
          if (!value) badusage(_("--%s option takes a value"),cip->olong);
154
 
        }
155
 
        if (cip->call) cip->call(cip,value);
156
 
        else *cip->sassignto= value;
157
 
      } else {
158
 
        if (value) badusage(_("--%s option does not take a value"),cip->olong);
159
 
        if (cip->call) cip->call(cip,NULL);
160
 
        else *cip->iassignto= cip->arg;
161
 
      }
162
 
    } else {
163
 
      while (*p) {
164
 
        for (cip= cmdinfos; (cip->olong || cip->oshort) && *p != cip->oshort; cip++);
165
 
        if (!cip->oshort) badusage(_("unknown option -%c"),*p);
166
 
        p++;
167
 
        if (cip->takesvalue) {
168
 
          if (!*p) {
169
 
            value= *(*argvp)++;
170
 
            if (!value) badusage(_("-%c option takes a value"),cip->oshort);
171
 
          } else {
172
 
            value= p; p="";
173
 
            if (*value == '=') value++;
174
 
          }
175
 
          if (cip->call) cip->call(cip,value);
176
 
          else *cip->sassignto= value;
177
 
        } else {
178
 
          if (*p == '=') badusage(_("-%c option does not take a value"),cip->oshort);
179
 
          if (cip->call) cip->call(cip,NULL);
180
 
          else *cip->iassignto= cip->arg;
181
 
        }
182
 
      }
183
 
    }
184
 
  }
185
 
}