4
4
# Parent 77625b567802c5b6977eddb845f391e65a8733d0
5
5
Applied 002_xdm_fixes.diff
7
Index: xdm-X11R7.0-1.0.1/access.c
8
8
===================================================================
9
--- xdm-X11R7.0-1.0.1.orig/access.c 2006-01-09 14:12:52.000000000 +0700
10
+++ xdm-X11R7.0-1.0.1/access.c 2006-01-09 14:22:26.000000000 +0700
9
--- xdm.orig/access.c 2006-04-29 14:55:31.000000000 -0400
10
+++ xdm/access.c 2006-04-29 18:55:26.000000000 -0400
11
11
@@ -343,8 +343,8 @@
48
48
ReadAccessDatabase (datafile);
49
Index: xdm-X11R7.0-1.0.1/auth.c
50
50
===================================================================
51
--- xdm-X11R7.0-1.0.1.orig/auth.c 2006-01-09 14:12:52.000000000 +0700
52
+++ xdm-X11R7.0-1.0.1/auth.c 2006-01-09 14:22:26.000000000 +0700
51
--- xdm.orig/auth.c 2006-04-29 15:04:40.000000000 -0400
52
+++ xdm/auth.c 2006-04-29 18:55:26.000000000 -0400
54
54
#include "dm_error.h"
325
325
XauUnlockAuth (name);
326
326
+ Debug ("done RemoveUserAuthorization\n");
328
Index: xdm-X11R7.0-1.0.1/choose.c
329
329
===================================================================
330
--- xdm-X11R7.0-1.0.1.orig/choose.c 2006-01-09 14:12:52.000000000 +0700
331
+++ xdm-X11R7.0-1.0.1/choose.c 2006-01-09 14:22:26.000000000 +0700
330
--- xdm.orig/choose.c 2006-04-29 14:55:31.000000000 -0400
331
+++ xdm/choose.c 2006-04-29 18:55:26.000000000 -0400
332
332
@@ -191,8 +191,8 @@
334
334
if (GetChooserAddr ((char *)addr_buf, &addr_len) == -1)
487
487
exit (REMANAGE_DISPLAY);
490
Index: xdm-X11R7.0-1.0.1/config/Xresources.cpp
490
Index: xdm/config/Xresources.cpp
491
491
===================================================================
492
--- xdm-X11R7.0-1.0.1.orig/config/Xresources.cpp 2006-01-09 14:12:52.000000000 +0700
493
+++ xdm-X11R7.0-1.0.1/config/Xresources.cpp 2006-01-09 14:22:26.000000000 +0700
492
--- xdm.orig/config/Xresources.cpp 2006-04-29 14:55:31.000000000 -0400
493
+++ xdm/config/Xresources.cpp 2006-04-29 18:55:26.000000000 -0400
494
494
@@ -28,22 +28,25 @@
496
496
xlogin*fail: Login incorrect
548
548
xlogin*useShape: true
549
549
xlogin*logoPadding: 10
551
Index: xdm-X11R7.0-1.0.1/daemon.c
552
===================================================================
553
--- xdm-X11R7.0-1.0.1.orig/daemon.c 2006-01-09 14:12:52.000000000 +0700
554
+++ xdm-X11R7.0-1.0.1/daemon.c 2006-01-09 14:35:45.000000000 +0700
555
@@ -106,40 +106,34 @@
557
/* If our C library has the daemon() function, just use it. */
560
+ if ((daemon (0, 1)) == -1) {
562
+ LogError ("unable to daemonize: %s\n", _SysErrorMsg (errno));
564
+ LogError ("unable to daemonize\n");
571
- LogError("daemon fork failed, %s\n", strerror(errno));
575
+ LogError("daemon fork failed, %s\n", strerror(errno));
590
if (setsid() == -1) {
591
- LogError("setting session id for daemon failed: %s\n",
594
+ LogError("setting session id for daemon failed: %s\n",
607
- * Set up the standard file descriptors.
609
- (void) open ("/dev/null", O_RDWR);
610
- (void) dup2 (0, 1);
611
- (void) dup2 (0, 2);
612
#endif /* HAS_DAEMON */
614
Index: xdm-X11R7.0-1.0.1/dm.c
615
===================================================================
616
--- xdm-X11R7.0-1.0.1.orig/dm.c 2006-01-09 14:12:53.000000000 +0700
617
+++ xdm-X11R7.0-1.0.1/dm.c 2006-01-09 17:25:02.000000000 +0700
552
===================================================================
553
--- xdm.orig/dm.c 2006-04-29 14:55:31.000000000 -0400
554
+++ xdm/dm.c 2006-04-29 18:55:26.000000000 -0400
618
555
@@ -40,6 +40,7 @@
619
556
# include "dm_error.h"
1170
1107
+#endif /* HAS_SETPROCTITLE */
1171
Index: xdm-X11R7.0-1.0.1/dm_auth.h
1108
Index: xdm/dm_auth.h
1172
1109
===================================================================
1173
--- xdm-X11R7.0-1.0.1.orig/dm_auth.h 2006-01-09 14:12:53.000000000 +0700
1174
+++ xdm-X11R7.0-1.0.1/dm_auth.h 2006-01-09 14:22:26.000000000 +0700
1110
--- xdm.orig/dm_auth.h 2006-04-29 14:55:31.000000000 -0400
1111
+++ xdm/dm_auth.h 2006-04-29 18:55:26.000000000 -0400
1175
1112
@@ -45,7 +45,7 @@
1176
1113
#ifdef HASXDMAUTH
1177
1114
extern void XdmInitAuth (unsigned short name_len, char *name);
1211
1148
#ifdef SECURE_RPC
1212
1149
extern void SecureRPCInitAuth (unsigned short name_len, char *name);
1213
Index: xdm-X11R7.0-1.0.1/dm_error.h
1150
Index: xdm/dm_error.h
1214
1151
===================================================================
1215
--- xdm-X11R7.0-1.0.1.orig/dm_error.h 2006-01-09 14:12:53.000000000 +0700
1216
+++ xdm-X11R7.0-1.0.1/dm_error.h 2006-01-09 14:22:26.000000000 +0700
1152
--- xdm.orig/dm_error.h 2006-04-29 14:55:31.000000000 -0400
1153
+++ xdm/dm_error.h 2006-04-29 18:55:26.000000000 -0400
1217
1154
@@ -50,7 +50,6 @@
1218
1155
extern void LogInfo (char * fmt, ...) GCC_PRINTFLIKE(1,2);
1219
1156
extern void LogOutOfMem (char * fmt, ...) GCC_PRINTFLIKE(1,2);
1224
1161
#endif /* _DM_ERROR_H_ */
1225
Index: xdm-X11R7.0-1.0.1/error.c
1226
1163
===================================================================
1227
--- xdm-X11R7.0-1.0.1.orig/error.c 2006-01-09 14:12:53.000000000 +0700
1228
+++ xdm-X11R7.0-1.0.1/error.c 2006-01-09 14:22:26.000000000 +0700
1164
--- xdm.orig/error.c 2006-04-29 14:55:31.000000000 -0400
1165
+++ xdm/error.c 2006-04-29 18:55:26.000000000 -0400
1229
1166
@@ -34,23 +34,41 @@
1412
1349
+ _SysErrorMsg (errno));
1415
Index: xdm-X11R7.0-1.0.1/file.c
1416
1353
===================================================================
1417
--- xdm-X11R7.0-1.0.1.orig/file.c 2006-01-09 14:12:53.000000000 +0700
1418
+++ xdm-X11R7.0-1.0.1/file.c 2006-01-09 14:22:26.000000000 +0700
1354
--- xdm.orig/file.c 2006-04-29 14:55:31.000000000 -0400
1355
+++ xdm/file.c 2006-04-29 18:55:26.000000000 -0400
1419
1356
@@ -152,14 +152,14 @@
1458
1395
d->name, d->class ? d->class : "", type);
1460
1397
d->displayType = displayType;
1461
Index: xdm-X11R7.0-1.0.1/genauth.c
1398
Index: xdm/genauth.c
1462
1399
===================================================================
1463
--- xdm-X11R7.0-1.0.1.orig/genauth.c 2006-01-09 14:12:54.000000000 +0700
1464
+++ xdm-X11R7.0-1.0.1/genauth.c 2006-01-09 14:22:26.000000000 +0700
1400
--- xdm.orig/genauth.c 2006-04-29 14:55:31.000000000 -0400
1401
+++ xdm/genauth.c 2006-04-29 18:55:26.000000000 -0400
1465
1402
@@ -34,14 +34,16 @@
1466
1403
* Author: Keith Packard, MIT X Consortium
1531
1468
randomDevice, errno);
1532
1469
#endif /* DEV_RANDOM */
1533
1470
/* Try some pseudo-random number genrator daemon next */
1534
Index: xdm-X11R7.0-1.0.1/greeter/Login.c
1471
Index: xdm/greeter/Login.c
1535
1472
===================================================================
1536
--- xdm-X11R7.0-1.0.1.orig/greeter/Login.c 2006-01-09 14:12:54.000000000 +0700
1537
+++ xdm-X11R7.0-1.0.1/greeter/Login.c 2006-01-09 14:22:26.000000000 +0700
1473
--- xdm.orig/greeter/Login.c 2006-04-29 15:04:41.000000000 -0400
1474
+++ xdm/greeter/Login.c 2006-04-29 18:55:26.000000000 -0400
1539
1476
xim = XOpenIM(XtDisplay(ctx), NULL, NULL, NULL);
1573
1510
w->login.logoFileName);
1574
1511
w->login.logoValid = False;
1575
1512
goto SkipXpmLoad;
1576
@@ -1117,14 +1117,16 @@
1577
myAttributes.valuemask |= XpmReturnPixels;
1578
myAttributes.valuemask |= XpmReturnExtensions;
1580
- XpmReadFileToPixmap(XtDisplay(w), /* display */
1581
+ if (XpmReadFileToPixmap(XtDisplay(w), /* display */
1582
RootWindowOfScreen(XtScreen(w)), /* window */
1583
w->login.logoFileName, /* XPM filename */
1584
&(w->login.logoPixmap), /* pixmap */
1585
&(w->login.logoMask), /* pixmap mask */
1586
- &myAttributes); /* XPM attributes */
1587
- w->login.logoValid = True;
1588
+ &myAttributes) >= 0) /* XPM attributes */
1589
+ w->login.logoValid = True;
1592
+ if (w->login.logoValid == True) {
1593
XGetGeometry(XtDisplay(w), w->login.logoPixmap,
1596
Index: xdm-X11R7.0-1.0.1/greeter/greet.c
1513
Index: xdm/greeter/greet.c
1597
1514
===================================================================
1598
--- xdm-X11R7.0-1.0.1.orig/greeter/greet.c 2006-01-09 14:12:54.000000000 +0700
1599
+++ xdm-X11R7.0-1.0.1/greeter/greet.c 2006-01-09 14:22:26.000000000 +0700
1515
--- xdm.orig/greeter/greet.c 2006-04-29 14:55:30.000000000 -0400
1516
+++ xdm/greeter/greet.c 2006-04-29 18:55:26.000000000 -0400
1600
1517
@@ -278,13 +278,13 @@
1601
1518
XtGetValues (login, arglist, 1);
1648
1565
SessionExit (d, OBEYSESS_DISPLAY, FALSE);
1650
Index: xdm-X11R7.0-1.0.1/greeter/verify.c
1567
Index: xdm/greeter/verify.c
1651
1568
===================================================================
1652
--- xdm-X11R7.0-1.0.1.orig/greeter/verify.c 2006-01-09 14:12:54.000000000 +0700
1653
+++ xdm-X11R7.0-1.0.1/greeter/verify.c 2006-01-09 14:22:26.000000000 +0700
1654
@@ -207,29 +207,29 @@
1569
--- xdm.orig/greeter/verify.c 2006-04-29 15:04:41.000000000 -0400
1570
+++ xdm/greeter/verify.c 2006-04-29 18:55:26.000000000 -0400
1571
@@ -212,29 +212,29 @@
1657
1574
if (!p || strlen (greet->name) == 0) {
1686
1603
login_close(lc);
1687
1604
bzero(greet->password, strlen(greet->password));
1690
1607
(strncmp(console, "/dev/console", 12) == 0) &&
1691
1608
(strncmp(d->name,":0",2) != 0) )
1707
@@ -452,13 +452,13 @@
1710
if (!p || strlen (greet->name) == 0) {
1711
- Debug ("getpwnam() failed.\n");
1712
+ Debug ("getpwnam() failed\n");
1713
bzero(greet->password, strlen(greet->password));
1717
if (!strcmp(p->pw_passwd, "!") || !strcmp(p->pw_passwd, "*")) {
1718
- Debug ("The account is locked, no login allowed.\n");
1719
+ Debug ("the account is locked, no login allowed\n");
1720
bzero(greet->password, strlen(greet->password));
1726
1627
if(krb_get_lrealm(realm, 1)){
1773
1674
bzero(greet->password, strlen(greet->password));
1776
Index: xdm-X11R7.0-1.0.1/prngc.c
1777
1678
===================================================================
1778
--- xdm-X11R7.0-1.0.1.orig/prngc.c 2006-01-09 14:12:54.000000000 +0700
1779
+++ xdm-X11R7.0-1.0.1/prngc.c 2006-01-09 14:22:26.000000000 +0700
1679
--- xdm.orig/prngc.c 2006-04-29 14:55:31.000000000 -0400
1680
+++ xdm/prngc.c 2006-04-29 18:55:26.000000000 -0400
1780
1681
@@ -115,16 +115,16 @@
1782
1683
fd = socket(af, SOCK_STREAM, 0);
1797
1698
" \"%s\": %s\n",
1798
1699
addr_un.sun_path, strerror(errno));
1800
Index: xdm-X11R7.0-1.0.1/resource.c
1701
Index: xdm/resource.c
1801
1702
===================================================================
1802
--- xdm-X11R7.0-1.0.1.orig/resource.c 2006-01-09 14:12:54.000000000 +0700
1803
+++ xdm-X11R7.0-1.0.1/resource.c 2006-01-09 14:22:26.000000000 +0700
1703
--- xdm.orig/resource.c 2006-04-29 14:55:31.000000000 -0400
1704
+++ xdm/resource.c 2006-04-29 18:55:26.000000000 -0400
1804
1705
@@ -36,11 +36,11 @@
1883
1784
dpyName, resources[i].name);
1884
1785
snprintf (class, sizeof(class), "DisplayManager.%s.%s",
1885
1786
dpyClass, resources[i].class);
1886
Index: xdm-X11R7.0-1.0.1/rpcauth.c
1787
Index: xdm/rpcauth.c
1887
1788
===================================================================
1888
--- xdm-X11R7.0-1.0.1.orig/rpcauth.c 2006-01-09 14:12:54.000000000 +0700
1889
+++ xdm-X11R7.0-1.0.1/rpcauth.c 2006-01-09 14:22:26.000000000 +0700
1789
--- xdm.orig/rpcauth.c 2006-04-29 14:55:31.000000000 -0400
1790
+++ xdm/rpcauth.c 2006-04-29 18:55:26.000000000 -0400
1890
1791
@@ -69,7 +69,7 @@
1891
1792
new->number = 0;
1896
1797
new->data_length = strlen(key);
1897
1798
new->data = (char *) malloc (new->data_length);
1898
1799
if (!new->data)
1899
Index: xdm-X11R7.0-1.0.1/server.c
1900
1801
===================================================================
1901
--- xdm-X11R7.0-1.0.1.orig/server.c 2006-01-09 14:12:54.000000000 +0700
1902
+++ xdm-X11R7.0-1.0.1/server.c 2006-01-09 14:22:26.000000000 +0700
1802
--- xdm.orig/server.c 2006-04-29 14:55:31.000000000 -0400
1803
+++ xdm/server.c 2006-04-29 18:55:26.000000000 -0400
1903
1804
@@ -80,7 +80,7 @@
1904
1805
char arg[1024];
2012
1913
XSetIOErrorHandler (oldError);
2015
Index: xdm-X11R7.0-1.0.1/session.c
1916
Index: xdm/session.c
2016
1917
===================================================================
2017
--- xdm-X11R7.0-1.0.1.orig/session.c 2006-01-09 14:12:54.000000000 +0700
2018
+++ xdm-X11R7.0-1.0.1/session.c 2006-01-09 14:22:27.000000000 +0700
2021
# include <rpc/rpc.h>
2022
# include <rpc/key_prot.h>
2023
-extern int key_setnet(struct key_netstarg *arg);
2024
+extern int key_setnet (struct key_netstarg *arg);
2027
# include <krb5/krb5.h>
2028
@@ -258,18 +258,18 @@
1918
--- xdm.orig/session.c 2006-04-29 15:04:41.000000000 -0400
1919
+++ xdm/session.c 2006-04-29 18:55:26.000000000 -0400
1920
@@ -260,18 +260,18 @@
2030
1922
IOErrorHandler (Display *dpy)
2088
1980
source (verify.systemEnviron, d->reset);
2089
1981
SessionExit (d, OBEYSESS_DISPLAY, TRUE);
2092
1984
env = systemEnv (d, (char *) 0, (char *) 0);
2093
1985
args = parseArgs ((char **) 0, d->xrdb);
2094
1986
args = parseArgs (args, d->resources);
2097
1989
(void) runAndWait (args, env);
2098
1990
freeArgs (args);
2101
1993
SessionExit (d, RESERVER_DISPLAY, FALSE);
2103
1995
(void) alarm ((unsigned) d->grabTimeout);
2106
1998
XGrabServer (dpy);
2107
1999
if (XGrabKeyboard (dpy, DefaultRootWindow (dpy), True, GrabModeAsync,
2108
2000
GrabModeAsync, CurrentTime) != GrabSuccess) {
2109
@@ -497,26 +497,26 @@
2001
@@ -499,26 +499,26 @@
2110
2002
krb5_error_code code;
2111
2003
krb5_ccache ccache;
2173
2065
#endif /* QNX4 doesn't support multi-groups, no initgroups() */
2174
@@ -632,15 +634,15 @@
2176
pam_error = pam_setcred (pamh, PAM_ESTABLISH_CRED);
2177
if (pam_error != PAM_SUCCESS) {
2178
- LogError ("pam_setcred for \"%s\" failed: %s\n",
2179
- name, pam_strerror(pamh, pam_error));
2181
+ LogError ("pam_setcred for \"%s\" failed: %s\n", name,
2182
+ pam_strerror (pamh, pam_error));
2187
- if (setuid(verify->uid) < 0) {
2188
- LogError ("setuid %d (user \"%s\") failed, errno=%d\n",
2189
- verify->uid, name, errno);
2190
+ if (setuid (verify->uid) < 0) {
2191
+ LogError ("setuid %d (user \"%s\") failed: %s\n",
2192
+ verify->uid, name, _SysErrorMsg (errno));
2195
#else /* HAS_SETUSERCONTEXT */
2196
@@ -648,16 +650,17 @@
2066
@@ -649,16 +651,17 @@
2197
2067
* Set the user's credentials: uid, gid, groups,
2198
2068
* environment variables, resource limits, and umask.
2219
2089
#endif /* HAS_SETUSERCONTEXT */
2221
2091
* Set the user's credentials: uid, gid, groups,
2222
2092
* audit classes, user limits, and umask.
2263
2133
Debug ("key_setsecret returns %d\n", keyret);
2264
2134
if (keyret == -1)
2265
2135
LogError ("failed to set NIS secret key\n");
2266
@@ -766,27 +770,27 @@
2136
@@ -767,27 +771,27 @@
2267
2137
LogError ("user \"%s\": cannot chdir to home \"%s\" (err %d), using \"/\"\n",
2268
2138
getEnv (verify->userEnviron, "USER"), home, errno);
2298
2168
Debug ("StartSession, fork succeeded %d\n", pid);
2301
@@ -847,12 +851,14 @@
2171
@@ -848,12 +852,14 @@
2302
2172
open ("/dev/null", O_RDONLY);
2303
2173
/* make stdout follow stderr to the log file */
2322
2192
p, optarg ? optarg : "(null)");
2323
2193
for (av = argv, argc = 0; *av; av++, argc++)
2324
2194
/* SUPPRESS 530 */
2326
2196
while ((*av++ = *argv++))
2327
2197
/* SUPPRESS 530 */
2330
2200
execve (newargv[0], newargv, environ);
2333
Index: xdm-X11R7.0-1.0.1/socket.c
2334
2204
===================================================================
2335
--- xdm-X11R7.0-1.0.1.orig/socket.c 2006-01-09 14:12:54.000000000 +0700
2336
+++ xdm-X11R7.0-1.0.1/socket.c 2006-01-09 14:51:44.000000000 +0700
2205
--- xdm.orig/socket.c 2006-04-29 15:04:42.000000000 -0400
2206
+++ xdm/socket.c 2006-04-29 18:55:26.000000000 -0400
2337
2207
@@ -75,10 +75,10 @@
2338
2208
if (chooserFd == -1)
2389
Index: xdm-X11R7.0-1.0.1/streams.c
2259
Index: xdm/streams.c
2390
2260
===================================================================
2391
--- xdm-X11R7.0-1.0.1.orig/streams.c 2006-01-09 14:12:54.000000000 +0700
2392
+++ xdm-X11R7.0-1.0.1/streams.c 2006-01-09 14:22:27.000000000 +0700
2261
--- xdm.orig/streams.c 2006-04-29 14:55:31.000000000 -0400
2262
+++ xdm/streams.c 2006-04-29 18:55:26.000000000 -0400
2393
2263
@@ -107,7 +107,7 @@
2394
2264
FD_SET (xdmcpFd, &WellKnownSocketsMask);
2399
2269
if (chooserFd == -1)
2401
2271
LogError ("chooser stream creation failed\n");
2402
Index: xdm-X11R7.0-1.0.1/xdm.man.cpp
2272
Index: xdm/xdm.man.cpp
2403
2273
===================================================================
2404
--- xdm-X11R7.0-1.0.1.orig/xdm.man.cpp 2006-01-09 14:12:55.000000000 +0700
2405
+++ xdm-X11R7.0-1.0.1/xdm.man.cpp 2006-01-09 14:22:27.000000000 +0700
2274
--- xdm.orig/xdm.man.cpp 2006-04-29 15:04:36.000000000 -0400
2275
+++ xdm/xdm.man.cpp 2006-04-29 18:55:26.000000000 -0400
2406
2276
@@ -289,7 +289,7 @@
2407
2277
this resource to ``false'' will disable this feature.
2408
2278
.IP "\fBDisplayManager.pidFile\fP"
2428
2298
#if !defined(ARC4_RANDOM)
2429
2299
.IP \fBDisplayManager.prngdSocket\fP
2430
Index: xdm-X11R7.0-1.0.1/xdmauth.c
2300
Index: xdm/xdmauth.c
2431
2301
===================================================================
2432
--- xdm-X11R7.0-1.0.1.orig/xdmauth.c 2006-01-09 14:12:54.000000000 +0700
2433
+++ xdm-X11R7.0-1.0.1/xdmauth.c 2006-01-09 14:22:27.000000000 +0700
2302
--- xdm.orig/xdmauth.c 2006-04-29 14:55:31.000000000 -0400
2303
+++ xdm/xdmauth.c 2006-04-29 18:55:26.000000000 -0400
2434
2304
@@ -45,6 +45,18 @@
2435
2305
static char auth_name[256];
2436
2306
static int auth_name_len;
2511
2381
-#endif /* XDMCP */
2512
2382
+# endif /* XDMCP */
2513
2383
#endif /* HASXDMAUTH (covering the entire file) */
2514
Index: xdm-X11R7.0-1.0.1/xdmcp.c
2515
2385
===================================================================
2516
--- xdm-X11R7.0-1.0.1.orig/xdmcp.c 2006-01-09 14:12:55.000000000 +0700
2517
+++ xdm-X11R7.0-1.0.1/xdmcp.c 2006-01-09 14:22:27.000000000 +0700
2386
--- xdm.orig/xdmcp.c 2006-04-29 14:55:31.000000000 -0400
2387
+++ xdm/xdmcp.c 2006-04-29 18:55:26.000000000 -0400
2518
2388
@@ -311,7 +311,7 @@
2519
2389
XdmcpHeader header;
2520
2390
int localHostAsWell;
2762
2632
if (!getString (name, strlen (local_name)))
2763
Index: xdm-X11R7.0-1.0.1/xdmshell.c
2633
Index: xdm/xdmshell.c
2764
2634
===================================================================
2765
--- xdm-X11R7.0-1.0.1.orig/xdmshell.c 2006-01-09 14:12:55.000000000 +0700
2766
+++ xdm-X11R7.0-1.0.1/xdmshell.c 2006-01-09 14:22:27.000000000 +0700
2635
--- xdm.orig/xdmshell.c 2006-04-29 14:55:31.000000000 -0400
2636
+++ xdm/xdmshell.c 2006-04-29 18:55:26.000000000 -0400
2767
2637
@@ -41,6 +41,7 @@
2768
2638
#include <stdio.h>
2769
2639
#include "dm.h"